re PR c++/55951 (ICE in check_array_designated_initializer, at cp/decl.c:4785)
authorPaolo Carlini <paolo.carlini@oracle.com>
Tue, 26 Mar 2013 16:49:49 +0000 (16:49 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 26 Mar 2013 16:49:49 +0000 (16:49 +0000)
/cp
2013-03-26  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/55951
* decl.c (check_array_designated_initializer): Handle CONST_DECL
as ce->index.

/testsuite
2013-03-26  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/55951
* g++.dg/ext/desig5.C: New.

From-SVN: r197116

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

index 3dfb31ad4b4eb143a935c4a123b963af697da506..01044e493d7d4e89a226bb70e80c9a4593899134 100644 (file)
@@ -1,3 +1,9 @@
+2013-03-26  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/55951
+       * decl.c (check_array_designated_initializer): Handle CONST_DECL
+       as ce->index.
+
 2013-03-26  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * decl.c (grokfndecl): Handle separately <inline> and <constexpr>
index a82132882159d7fceb4bb6ede9011106a5f8eb18..ca68bb509bf3ef16a45a49f871820227c1efa031 100644 (file)
@@ -4760,7 +4760,7 @@ grok_reference_init (tree decl, tree type, tree init, int flags)
    is valid, i.e., does not have a designated initializer.  */
 
 static bool
-check_array_designated_initializer (const constructor_elt *ce,
+check_array_designated_initializer (constructor_elt *ce,
                                    unsigned HOST_WIDE_INT index)
 {
   /* Designated initializers for array elements are not supported.  */
@@ -4769,9 +4769,21 @@ check_array_designated_initializer (const constructor_elt *ce,
       /* The parser only allows identifiers as designated
         initializers.  */
       if (ce->index == error_mark_node)
-       error ("name used in a GNU-style designated "
-              "initializer for an array");
-      else if (TREE_CODE (ce->index) == INTEGER_CST)
+       {
+         error ("name used in a GNU-style designated "
+                "initializer for an array");
+         return false;
+       }
+      else if (identifier_p (ce->index))
+       {
+         error ("name %qD used in a GNU-style designated "
+                "initializer for an array", ce->index);
+         return false;
+       }
+
+      ce->index = cxx_constant_value (ce->index);
+
+      if (TREE_CODE (ce->index) == INTEGER_CST)
        {
          /* A C99 designator is OK if it matches the current index.  */
          if (TREE_INT_CST_LOW (ce->index) == index)
@@ -4780,11 +4792,8 @@ check_array_designated_initializer (const constructor_elt *ce,
            sorry ("non-trivial designated initializers not supported");
        }
       else
-       {
-         gcc_assert (identifier_p (ce->index));
-         error ("name %qD used in a GNU-style designated "
-                "initializer for an array", ce->index);
-       }
+       gcc_unreachable ();
+
       return false;
     }
 
index c1117941e631fd403191c928b2b30f9e11de0e57..1f53a31a8f2253bf8728c85ce0be855e11dbfd99 100644 (file)
@@ -1,3 +1,8 @@
+2013-03-26  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/55951
+       * g++.dg/ext/desig5.C: New.
+
 2013-03-26  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/56649
diff --git a/gcc/testsuite/g++.dg/ext/desig5.C b/gcc/testsuite/g++.dg/ext/desig5.C
new file mode 100644 (file)
index 0000000..48cce31
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/55951
+
+enum { A };
+
+static const char *a[] = {
+  [A] = "a"
+};