tree member;
tree expr;
tree member_destructions = NULL;
+ tree vbase_destructions = NULL;
for (member = TYPE_FIELDS (current_class_type); member;
member = TREE_CHAIN (member))
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))
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. */
+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.
extern "C" void abort ();
-int d = 2;
+int d = 5;
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;
};