re PR c++/60186 ([c++11] ICE with invalid value in constexpr array initializer)
authorJason Merrill <jason@redhat.com>
Fri, 21 Feb 2014 21:49:05 +0000 (16:49 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 21 Feb 2014 21:49:05 +0000 (16:49 -0500)
PR c++/60186
* typeck2.c (massage_init_elt): Call fold_non_dependent_expr_sfinae.

From-SVN: r208027

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

index 14d4995..8e4a2a0 100644 (file)
@@ -1,5 +1,8 @@
 2014-02-21  Jason Merrill  <jason@redhat.com>
 
+       PR c++/60186
+       * typeck2.c (massage_init_elt): Call fold_non_dependent_expr_sfinae.
+
        PR c++/60187
        * parser.c (cp_parser_enum_specifier): Call
        check_for_bare_parameter_packs.
index 546b83f..8877286 100644 (file)
@@ -1131,7 +1131,10 @@ massage_init_elt (tree type, tree init, tsubst_flags_t complain)
     init = TARGET_EXPR_INITIAL (init);
   /* When we defer constant folding within a statement, we may want to
      defer this folding as well.  */
-  init = maybe_constant_init (init);
+  tree t = fold_non_dependent_expr_sfinae (init, complain);
+  t = maybe_constant_value (t);
+  if (TREE_CONSTANT (t))
+    init = t;
   return init;
 }
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist7.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist7.C
new file mode 100644 (file)
index 0000000..6fea82f
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/60186
+// { dg-require-effective-target c++11 }
+
+template<typename> void foo(int i)
+{
+  constexpr int a[] = { i };   // { dg-error "" }
+}