2011-12-19 Jason Merrill <jason@redhat.com>
+ PR c++/51526
+ * semantics.c (build_data_member_initialization): Handle
+ delegating constructor.
+ (build_constexpr_constructor_member_initializers): Likewise.
+
PR c++/51553
* cp-tree.h (LOOKUP_LIST_INIT_CTOR): Rename from
LOOKUP_NO_COPY_CTOR_CONVERSION.
the const_cast. */
member = op;
}
+ else if (op == current_class_ptr
+ && (same_type_ignoring_top_level_qualifiers_p
+ (TREE_TYPE (TREE_TYPE (member)),
+ current_class_type)))
+ /* Delegating constructor. */
+ member = op;
else
{
/* We don't put out anything for an empty base. */
else
gcc_assert (errorcount > 0);
if (ok)
- return build_constructor (type, vec);
+ {
+ if (VEC_length (constructor_elt, vec) > 0)
+ {
+ /* In a delegating constructor, return the target. */
+ constructor_elt *ce = VEC_index (constructor_elt, vec, 0);
+ if (ce->index == current_class_ptr)
+ {
+ body = ce->value;
+ VEC_free (constructor_elt, gc, vec);
+ return body;
+ }
+ }
+ return build_constructor (type, vec);
+ }
else
return error_mark_node;
}
+2011-12-19 Jason Merrill <jason@redhat.com>
+
+ PR c++/51526
+ * g++.dg/cpp0x/constexpr-delegating.C: New.
+
2011-12-19 Sandra Loosemore <sandra@codesourcery.com>
Tom de Vries <tom@codesourcery.com>
--- /dev/null
+// PR c++/51526
+// { dg-options -std=c++0x }
+
+const int j = 42;
+
+struct S {
+ int i;
+ constexpr S(int i) : i(i) {}
+ constexpr S() : S(j) {}
+};
+
+constexpr S s{};
+
+#define SA(X) static_assert((X),#X)
+SA(s.i == 42);