re PR c++/55951 (ICE in check_array_designated_initializer, at cp/decl.c:4785)
/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
This commit is contained in:
parent
6f33817e6a
commit
515e4d1d5a
|
@ -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>
|
2013-03-26 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
* decl.c (grokfndecl): Handle separately <inline> and <constexpr>
|
* decl.c (grokfndecl): Handle separately <inline> and <constexpr>
|
||||||
|
|
|
@ -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. */
|
is valid, i.e., does not have a designated initializer. */
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
check_array_designated_initializer (const constructor_elt *ce,
|
check_array_designated_initializer (constructor_elt *ce,
|
||||||
unsigned HOST_WIDE_INT index)
|
unsigned HOST_WIDE_INT index)
|
||||||
{
|
{
|
||||||
/* Designated initializers for array elements are not supported. */
|
/* 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
|
/* The parser only allows identifiers as designated
|
||||||
initializers. */
|
initializers. */
|
||||||
if (ce->index == error_mark_node)
|
if (ce->index == error_mark_node)
|
||||||
error ("name used in a GNU-style designated "
|
{
|
||||||
"initializer for an array");
|
error ("name used in a GNU-style designated "
|
||||||
else if (TREE_CODE (ce->index) == INTEGER_CST)
|
"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. */
|
/* 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)
|
||||||
|
@ -4780,11 +4792,8 @@ check_array_designated_initializer (const constructor_elt *ce,
|
||||||
sorry ("non-trivial designated initializers not supported");
|
sorry ("non-trivial designated initializers not supported");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
gcc_unreachable ();
|
||||||
gcc_assert (identifier_p (ce->index));
|
|
||||||
error ("name %qD used in a GNU-style designated "
|
|
||||||
"initializer for an array", ce->index);
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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>
|
2013-03-26 Tobias Burnus <burnus@net-b.de>
|
||||||
|
|
||||||
PR fortran/56649
|
PR fortran/56649
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
// PR c++/55951
|
||||||
|
|
||||||
|
enum { A };
|
||||||
|
|
||||||
|
static const char *a[] = {
|
||||||
|
[A] = "a"
|
||||||
|
};
|
Loading…
Reference in New Issue