]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/60224 (ICE using invalid initializer for array)
authorJason Merrill <jason@redhat.com>
Fri, 21 Feb 2014 14:56:53 +0000 (09:56 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 21 Feb 2014 14:56:53 +0000 (09:56 -0500)
PR c++/60224
* decl.c (cp_complete_array_type, maybe_deduce_size_from_array_init):
Don't get confused by a CONSTRUCTOR that already has a type.

From-SVN: r208002

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.dg/init/array36.C [new file with mode: 0644]

index 61f585992221f9780edceb04043de03e4b7c3e62..62aacd62e81ba061fa8ffcb781d8a8dd3baf05e5 100644 (file)
@@ -1,5 +1,9 @@
 2014-02-21  Jason Merrill  <jason@redhat.com>
 
+       PR c++/60224
+       * decl.c (cp_complete_array_type, maybe_deduce_size_from_array_init):
+       Don't get confused by a CONSTRUCTOR that already has a type.
+
        PR c++/60277
        * call.c (build_array_conv): Don't crash on VLA.
 
index b7d2d9f502de46138c23908471bde4647564ff5d..04c4cf515c3312d622341a796e7f484f432da49c 100644 (file)
@@ -4880,7 +4880,7 @@ maybe_deduce_size_from_array_init (tree decl, tree init)
         those are not supported in GNU C++, and as the middle-end
         will crash if presented with a non-numeric designated
         initializer.  */
-      if (initializer && TREE_CODE (initializer) == CONSTRUCTOR)
+      if (initializer && BRACE_ENCLOSED_INITIALIZER_P (initializer))
        {
          vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (initializer);
          constructor_elt *ce;
@@ -7099,6 +7099,11 @@ cp_complete_array_type (tree *ptype, tree initial_value, bool do_default)
   int failure;
   tree type, elt_type;
 
+  /* Don't get confused by a CONSTRUCTOR for some other type.  */
+  if (initial_value && TREE_CODE (initial_value) == CONSTRUCTOR
+      && !BRACE_ENCLOSED_INITIALIZER_P (initial_value))
+    return 1;
+
   if (initial_value)
     {
       unsigned HOST_WIDE_INT i;
diff --git a/gcc/testsuite/g++.dg/init/array36.C b/gcc/testsuite/g++.dg/init/array36.C
new file mode 100644 (file)
index 0000000..77e4f90
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/60224
+
+struct A {};
+
+void foo()
+{
+  bool b[] = (int (A::*)())0;  // { dg-error "" }
+}