aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin v. Löwis <loewis@gcc.gnu.org>1998-10-19 23:23:04 +0000
committerMartin v. Löwis <loewis@gcc.gnu.org>1998-10-19 23:23:04 +0000
commit163c4dc51fd2544683c89edd9fddc1e193ec377f (patch)
tree7c74edba8a27c515350f02d56d144283f5ed67f2
parent15f8470fd056c08d1c0a47417dafb7092b4b0cc2 (diff)
downloadgcc-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.C121
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;
+}