re PR c++/51526 ([C++11][constexpr] constexpr delegating constructor should be accepted)
authorJason Merrill <jason@redhat.com>
Mon, 19 Dec 2011 21:06:44 +0000 (16:06 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 19 Dec 2011 21:06:44 +0000 (16:06 -0500)
PR c++/51526
* semantics.c (build_data_member_initialization): Handle
delegating constructor.
(build_constexpr_constructor_member_initializers): Likewise.

From-SVN: r182499

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/constexpr-delegating.C [new file with mode: 0644]

index e5d0b4c4a5cb5c45c187b122ef7111f177ac9532..5623bcf97b1ba81271619fc9ff2750f7525cc727 100644 (file)
@@ -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.
index 2788daaba1eb38ae065054e8b6e05335b1323506..ec56ab5ff18820391617efd235f3bc7bad9c2258 100644 (file)
@@ -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;
 }
index cf758f16a37386bc10c014903e63dc78c2dbb79e..dbad2938656c9c3801082bc9d6405961957df61a 100644 (file)
@@ -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 (file)
index 0000000..a020888
--- /dev/null
@@ -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);