re PR c++/49988 (constexpr on ctor invokes improper initialization)
authorJason Merrill <jason@redhat.com>
Sat, 6 Aug 2011 04:34:21 +0000 (00:34 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 6 Aug 2011 04:34:21 +0000 (00:34 -0400)
PR c++/49988
* semantics.c (cxx_eval_array_reference): Handle failure to
reduce the array operand to something we can work with.

From-SVN: r177496

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

index 9fe645003ea0d47652634f0ddd19017494a41936..3c1ad7f5959c3f15c3222de68607d46dec5ee847 100644 (file)
@@ -1,3 +1,9 @@
+2011-08-05  Jason Merrill  <jason@redhat.com>
+
+       PR c++/49988
+       * semantics.c (cxx_eval_array_reference): Handle failure to
+       reduce the array operand to something we can work with.
+
 2011-08-05  Gabriel Charette  <gchare@google.com>
 
        * decl.c (finish_function): Remove unecessary line 0 hack.
index ac24b779dd223571d6f81e7bfa50c78bc78cbf58..2f02e696dbad7b03ef1f5a6308094dab56d8dd6d 100644 (file)
@@ -6428,12 +6428,19 @@ cxx_eval_array_reference (const constexpr_call *call, tree t,
   elem_type = TREE_TYPE (TREE_TYPE (ary));
   if (TREE_CODE (ary) == CONSTRUCTOR)
     len = CONSTRUCTOR_NELTS (ary);
-  else
+  else if (TREE_CODE (ary) == STRING_CST)
     {
       elem_nchars = (TYPE_PRECISION (elem_type)
                     / TYPE_PRECISION (char_type_node));
       len = (unsigned) TREE_STRING_LENGTH (ary) / elem_nchars;
     }
+  else
+    {
+      /* We can't do anything with other tree codes, so use
+        VERIFY_CONSTANT to complain and fail.  */
+      VERIFY_CONSTANT (ary);
+      gcc_unreachable ();
+    }
   if (compare_tree_int (index, len) >= 0)
     {
       if (tree_int_cst_lt (index, array_type_nelts_top (TREE_TYPE (ary))))
index e6f0cd78c95f0c43e1e1d305c38577a9fb739021..af49861a64b8a1d2c8ed40c7d97b906ab4bce871 100644 (file)
@@ -1,3 +1,8 @@
+2011-08-05  Jason Merrill  <jason@redhat.com>
+
+       PR c++/49988
+       * g++.dg/cpp0x/constexpr-non-const-arg3.C: New.
+
 2011-08-05  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR target/47369
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg3.C
new file mode 100644 (file)
index 0000000..581be6d
--- /dev/null
@@ -0,0 +1,23 @@
+// PR c++/49988
+// { dg-options -std=c++0x }
+// { dg-do run }
+
+template<int ... I> struct X { };
+
+struct A {
+  char data[3];
+  template<int ... I>
+    constexpr
+    A(const char (&s)[3], X<I...> x) : data{ s[I]...} { }
+};
+struct B {
+  A a;
+  B(const char (&s)[3]) : a{s,X<0,1,2>{}} { }
+};
+
+int main()
+{
+  B b{"12"};
+  if (b.a.data[0] != '1')
+    return 1;
+}