diff options
author | Jason Merrill <jason@redhat.com> | 2018-04-05 15:43:39 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2018-04-05 15:43:39 -0400 |
commit | d600a0ceb1f768e0f6d3d8dafc0c79430feb03ea (patch) | |
tree | e0710f52cbb14530fb0d993fed966bdc165b1e95 /gcc | |
parent | 4c1da8ea3e05208b006b1fb926a02fed7df05e5f (diff) | |
download | gcc-d600a0ceb1f768e0f6d3d8dafc0c79430feb03ea.zip gcc-d600a0ceb1f768e0f6d3d8dafc0c79430feb03ea.tar.gz gcc-d600a0ceb1f768e0f6d3d8dafc0c79430feb03ea.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/desig11.C | 15 |
3 files changed, 32 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7fef0c8..2c5e1e2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 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. * typeck2.c (process_init_constructor_array): Don't require a VLA initializer to have VLA type. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 489dcc0..86251f5 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5415,12 +5415,15 @@ check_array_designated_initializer (constructor_elt *ce, ce->index, true); if (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)) { /* A C99 designator is OK if it matches the current index. */ if (wi::to_wide (ce_index) == index) - return true; + { + ce->index = ce_index; + return true; + } else sorry ("non-trivial designated initializers not supported"); } @@ -5463,8 +5466,12 @@ maybe_deduce_size_from_array_init (tree decl, tree init) constructor_elt *ce; HOST_WIDE_INT i; 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) diff --git a/gcc/testsuite/g++.dg/ext/desig11.C b/gcc/testsuite/g++.dg/ext/desig11.C new file mode 100644 index 0000000..34bfbe1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/desig11.C @@ -0,0 +1,15 @@ +// 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>(); +} |