From 163c4dc51fd2544683c89edd9fddc1e193ec377f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Mon, 19 Oct 1998 23:23:04 +0000 Subject: [PATCH] New test case. From-SVN: r23192 --- gcc/testsuite/g++.old-deja/g++.martin/new1.C | 121 +++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 gcc/testsuite/g++.old-deja/g++.martin/new1.C diff --git a/gcc/testsuite/g++.old-deja/g++.martin/new1.C b/gcc/testsuite/g++.old-deja/g++.martin/new1.C new file mode 100644 index 00000000000..835b42659b8 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.martin/new1.C @@ -0,0 +1,121 @@ +//Lifetime of temporaries: +//egcs 2.92 performs cleanup for temporaries inside new expressions +//after the new is complete, not at the end of the full expression. + +#include +#include +#include + +bool new_throws; +bool ctor_throws; + +int new_done; +int ctor_done; +int func_done; +int dtor_done; +int delete_done; + +int count; + +void init() +{ + new_throws = ctor_throws = false; + new_done = ctor_done = func_done = dtor_done = delete_done = count = 0; +} + +struct line_error{ + int line; + line_error(int i):line(i){} +}; + +#define CHECK(cond) if(!(cond))throw std::line_error(__LINE__); + +struct A{ + A(int){ + ctor_done = ++count; + if(ctor_throws) + throw 1; + } + A(const A&){ + CHECK(false); //no copy constructors in this code + } + ~A(){ + dtor_done = ++count; + } + A* addr(){return this;} +}; + +struct B{ + B(A*){} + void* operator new(size_t s){ + new_done = ++count; + if(new_throws) + throw 1; + return malloc(s); + } + void operator delete(void *){ + delete_done = ++count; + } +}; + +void func(B* ) +{ + func_done = ++count; +} + +void test1() +{ + init(); + try{ + func(new B(A(10).addr())); + }catch(int){ + } + CHECK(new_done==1); + CHECK(ctor_done==2); + CHECK(func_done==3); + CHECK(dtor_done==4); + CHECK(delete_done==0); +} + +void test2() +{ + init(); + new_throws = true; + try{ + func(new B(A(10).addr())); + }catch(int){ + } + CHECK(new_done==1); + CHECK(ctor_done==0); + CHECK(func_done==0); + CHECK(dtor_done==0); + CHECK(delete_done==0); +} + +void test3() +{ + init(); + ctor_throws = true; + try{ + func(new B(A(10).addr())); + }catch(int){ + } + CHECK(new_done==1); + CHECK(ctor_done==2); + CHECK(func_done==0); + CHECK(dtor_done==0); + CHECK(delete_done==3); +} + +int main() +{ + try{ + test1(); + test2(); + test3(); + }catch(line_error e){ + printf("Got error in line %d\n",e.line); + return 1; + } + return 0; +} -- 2.30.2