aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-12-19 16:06:44 -0500
committerJason Merrill <jason@gcc.gnu.org>2011-12-19 16:06:44 -0500
commit176fcc5d1822df70613dd74a19d28c2e0840193a (patch)
tree5685a9f6a45f025931cffa24a97a9777171dd5d5
parent8f1ad6b6bfd9102bf5e240191f3df95498188410 (diff)
downloadgcc-176fcc5d1822df70613dd74a19d28c2e0840193a.zip
gcc-176fcc5d1822df70613dd74a19d28c2e0840193a.tar.gz
gcc-176fcc5d1822df70613dd74a19d28c2e0840193a.tar.bz2
re PR c++/51526 ([C++11][constexpr] constexpr delegating constructor should be accepted)
PR c++/51526 * semantics.c (build_data_member_initialization): Handle delegating constructor. (build_constexpr_constructor_member_initializers): Likewise. From-SVN: r182499
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/semantics.c21
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-delegating.C15
4 files changed, 45 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e5d0b4c..5623bcf 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
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.
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 2788daa..ec56ab5 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -5801,6 +5801,12 @@ build_data_member_initialization (tree t, VEC(constructor_elt,gc) **vec)
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. */
@@ -5907,7 +5913,20 @@ build_constexpr_constructor_member_initializers (tree type, tree body)
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;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cf758f1..dbad293 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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>
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating.C
new file mode 100644
index 0000000..a020888
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating.C
@@ -0,0 +1,15 @@
+// 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);