diff options
author | Martin v. Löwis <loewis@gcc.gnu.org> | 1998-10-19 23:23:04 +0000 |
---|---|---|
committer | Martin v. Löwis <loewis@gcc.gnu.org> | 1998-10-19 23:23:04 +0000 |
commit | 163c4dc51fd2544683c89edd9fddc1e193ec377f (patch) | |
tree | 7c74edba8a27c515350f02d56d144283f5ed67f2 | |
parent | 15f8470fd056c08d1c0a47417dafb7092b4b0cc2 (diff) | |
download | gcc-163c4dc51fd2544683c89edd9fddc1e193ec377f.zip gcc-163c4dc51fd2544683c89edd9fddc1e193ec377f.tar.gz gcc-163c4dc51fd2544683c89edd9fddc1e193ec377f.tar.bz2 |
New test case.
From-SVN: r23192
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.martin/new1.C | 121 |
1 files changed, 121 insertions, 0 deletions
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 0000000..835b426 --- /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 <new> +#include <cstdlib> +#include <cstdio> + +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; +} |