Message ID | 51519FF8.7040500@oracle.com |
---|---|
State | New |
Headers | show |
On 03/26/2013 09:17 AM, Paolo Carlini wrote: > + if (identifier_p (ce->index)) > + { > + error ("name %qD used in a GNU-style designated " > + "initializer for an array", ce->index); > + return false; > + } > + > + tree ce_index = cxx_constant_value (ce->index); > + > /* 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"); Let's also combine these two instances of the same error. Jason
On 03/26/2013 10:14 AM, Jason Merrill wrote: > On 03/26/2013 09:17 AM, Paolo Carlini wrote: >> + if (identifier_p (ce->index)) >> + { >> + error ("name %qD used in a GNU-style designated " >> + "initializer for an array", ce->index); >> + return false; >> + } >> + >> + tree ce_index = cxx_constant_value (ce->index); >> + >> /* 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"); > > Let's also combine these two instances of the same error. Or at any rate move the error_mark_node case above cxx_constant_value as well. Jason
Index: cp/decl.c =================================================================== --- cp/decl.c (revision 197097) +++ cp/decl.c (working copy) @@ -4766,25 +4766,31 @@ check_array_designated_initializer (const construc /* Designated initializers for array elements are not supported. */ if (ce->index) { + if (identifier_p (ce->index)) + { + error ("name %qD used in a GNU-style designated " + "initializer for an array", ce->index); + return false; + } + + tree ce_index = cxx_constant_value (ce->index); + /* 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) + else 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) + if (TREE_INT_CST_LOW (ce_index) == index) return true; else 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: testsuite/g++.dg/ext/desig5.C =================================================================== --- testsuite/g++.dg/ext/desig5.C (revision 0) +++ testsuite/g++.dg/ext/desig5.C (working copy) @@ -0,0 +1,7 @@ +// PR c++/55951 + +enum { A }; + +static const char *a[] = { + [A] = "a" +};