Commit d600a0ce by Jason Merrill Committed by Jason Merrill

PR c++/85136 - ICE with designated init in template.

	* decl.c (maybe_deduce_size_from_array_init): Handle dependent
	designated initializer.
	(check_array_designated_initializer): Update ce->index with the
	constant value.

From-SVN: r259152
parent 4c1da8ea
2018-04-05 Jason Merrill <jason@redhat.com> 2018-04-05 Jason Merrill <jason@redhat.com>
PR c++/85136 - ICE with designated init in template.
* decl.c (maybe_deduce_size_from_array_init): Handle dependent
designated initializer.
(check_array_designated_initializer): Update ce->index with the
constant value.
PR c++/83808 - ICE with VLA initialization. PR c++/83808 - ICE with VLA initialization.
* typeck2.c (process_init_constructor_array): Don't require a VLA * typeck2.c (process_init_constructor_array): Don't require a VLA
initializer to have VLA type. initializer to have VLA type.
......
...@@ -5415,12 +5415,15 @@ check_array_designated_initializer (constructor_elt *ce, ...@@ -5415,12 +5415,15 @@ check_array_designated_initializer (constructor_elt *ce,
ce->index, true); ce->index, true);
if (ce_index if (ce_index
&& INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (ce_index)) && INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (ce_index))
&& (TREE_CODE (ce_index = maybe_constant_value (ce_index)) && (TREE_CODE (ce_index = fold_non_dependent_expr (ce_index))
== INTEGER_CST)) == 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 (wi::to_wide (ce_index) == index) if (wi::to_wide (ce_index) == index)
return true; {
ce->index = ce_index;
return true;
}
else else
sorry ("non-trivial designated initializers not supported"); sorry ("non-trivial designated initializers not supported");
} }
...@@ -5463,8 +5466,12 @@ maybe_deduce_size_from_array_init (tree decl, tree init) ...@@ -5463,8 +5466,12 @@ maybe_deduce_size_from_array_init (tree decl, tree init)
constructor_elt *ce; constructor_elt *ce;
HOST_WIDE_INT i; HOST_WIDE_INT i;
FOR_EACH_VEC_SAFE_ELT (v, i, ce) FOR_EACH_VEC_SAFE_ELT (v, i, ce)
if (!check_array_designated_initializer (ce, i)) {
failure = 1; if (instantiation_dependent_expression_p (ce->index))
return;
if (!check_array_designated_initializer (ce, i))
failure = 1;
}
} }
if (failure) if (failure)
......
// PR c++/85136
// { dg-options "" }
enum { e };
template<int I> void f()
{
const int x[] = { [e] = 0 };
const int y[] = { [I] = 0 };
}
int main()
{
f<0>();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment