diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2013-04-01 21:35:40 +0000 |
---|---|---|
committer | Paolo Carlini <paolo.carlini@oracle.com> | 2013-04-01 21:35:40 +0000 |
commit | bc4d6eb450882c4ce89b8bb901b162bd661db175 (patch) | |
tree | 6dabb6a66cc312bca3716a1d427b04a36291a20e /gcc/cp | |
parent | 88d0e184d7d6a7980d441c0115ebcfb4d097c2d8 (diff) |
/cp
2013-04-01 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/55951
* decl.c (check_array_designated_initializer): Handle CONST_DECL
as ce->index.
/testsuite
2013-04-01 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/55951
* g++.dg/ext/desig5.C: New.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-4_8-branch@197333 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 27 |
2 files changed, 24 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d53ad4b2b4f..14bd1ca45d9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-04-01 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/55951 + * decl.c (check_array_designated_initializer): Handle CONST_DECL + as ce->index. + 2013-04-01 Jason Merrill <jason@redhat.com> PR c++/56772 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 9ca9589a196..82d857dfb06 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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 (TREE_CODE (ce->index) == IDENTIFIER_NODE) + { + 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 (TREE_CODE (ce->index) == IDENTIFIER_NODE); - error ("name %qD used in a GNU-style designated " - "initializer for an array", ce->index); - } + gcc_unreachable (); + return false; } |