]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
init.c (perform_base_cleanups): Correct order of base class cleanups.
authorMark Mitchell <mark@codesourcery.com>
Thu, 2 May 2002 20:02:41 +0000 (20:02 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Thu, 2 May 2002 20:02:41 +0000 (20:02 +0000)
* init.c (perform_base_cleanups): Correct order of base class
cleanups.

* g++.dg/init/dtor1.C: Make it tougher.

From-SVN: r53060

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/dtor1.C

index 0e930a37ef1b49a2b598d3650bd6a5b4962e4f9a..560ff132fa8ecc3c70e90c6ea17242a11a9b66c2 100644 (file)
@@ -1,3 +1,8 @@
+2002-05-02  Mark Mitchell  <mark@codesourcery.com>
+
+       * init.c (perform_base_cleanups): Correct order of base class
+       cleanups.
+
 2002-05-01  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/6527
index 9f840beb543ac35eaac0cf5a04ad63e1aee9cde5..4cb0dab2f818025a24cf3e2e945b115f02ea5e89 100644 (file)
@@ -3230,6 +3230,7 @@ perform_base_cleanups ()
   tree member;
   tree expr;
   tree member_destructions = NULL;
+  tree vbase_destructions = NULL;
 
   for (member = TYPE_FIELDS (current_class_type); member;
        member = TREE_CHAIN (member))
@@ -3262,7 +3263,7 @@ perform_base_cleanups ()
   n_baseclasses = CLASSTYPE_N_BASECLASSES (current_class_type);
 
   /* Take care of the remaining baseclasses.  */
-  for (i = 0; i < n_baseclasses; i++)
+  for (i = n_baseclasses - 1; i >= 0; i--)
     {
       tree base_binfo = TREE_VEC_ELT (binfos, i);
       if (TYPE_HAS_TRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo))
@@ -3313,10 +3314,18 @@ perform_base_cleanups ()
                                        LOOKUP_NORMAL);
              expr = build (COND_EXPR, void_type_node, cond,
                            expr, void_zero_node);
-             finish_expr_stmt (expr);
+             if (!vbase_destructions)
+               vbase_destructions = expr;
+             else
+               vbase_destructions = build (COMPOUND_EXPR, 
+                                           TREE_TYPE (vbase_destructions),
+                                           expr,
+                                           vbase_destructions);
            }
        }
     }
+  if (vbase_destructions)
+    finish_expr_stmt (vbase_destructions);
 }
 
 /* For type TYPE, delete the virtual baseclass objects of DECL.  */
index be646681d086fb9689e5b1130ee48007a8cc3037..0061d85b620fa3397fdfcb96e00e1e6211a13c49 100644 (file)
@@ -1,3 +1,7 @@
+2002-05-02  Mark Mitchell  <mark@codesourcery.com>
+
+       * g++.dg/init/dtor1.C: Make it tougher.
+
 2002-05-01  Mark Mitchell  <mark@codesourcery.com>
 
        * g++.dg/init/dtor1.C: New test.
index 3a48bcd77acf82105968f0a36af8f0d233ec69f7..624433897f07cedd21a383bbd4917d41d3046a3a 100644 (file)
@@ -2,7 +2,7 @@
 
 extern "C" void abort ();
 
-int d = 2;
+int d = 5;
 
 struct B
 {
@@ -11,10 +11,26 @@ struct B
   ~B () { if (d-- != x) abort (); }
 };
 
+struct C1 : public B {
+  C1 (int i) : B (i) {}
+};
+
+struct C2 : public B {
+  C2 (int i) : B (i) {}
+};
+
+struct D : public B {
+  D (int i) : B (i) {}
+};
+
+struct E : public B {
+  E (int i) : B (i) {}
+};
+
 struct A
-  : public B
+  : public C1, C2, virtual public D, virtual public E
 {
-  A () : B (0), x1(1), x2(2) {}
+  A () : D (0), E (1), C1 (2), C2 (3), x1(4), x2(5) {}
   B x1;
   B x2;
 };