PR c++/78345 - ICE initializing array from lambda.
* init.c (build_aggr_init): Check array initializer. (build_vec_init): Check the type of a CONSTRUCTOR. From-SVN: r246244
This commit is contained in:
parent
3b82a32c3e
commit
d1a73b0bae
4 changed files with 29 additions and 1 deletions
|
@ -1,5 +1,9 @@
|
|||
2017-03-17 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/78345 - ICE initializing array from lambda.
|
||||
* init.c (build_aggr_init): Check array initializer.
|
||||
(build_vec_init): Check the type of a CONSTRUCTOR.
|
||||
|
||||
PR c++/80073 - C++17 ICE with virtual base.
|
||||
* decl.c (xref_basetypes): Also check for indirect vbases.
|
||||
|
||||
|
|
|
@ -1617,6 +1617,10 @@ build_aggr_init (tree exp, tree init, int flags, tsubst_flags_t complain)
|
|||
if (init == error_mark_node)
|
||||
return error_mark_node;
|
||||
|
||||
location_t init_loc = (init
|
||||
? EXPR_LOC_OR_LOC (init, input_location)
|
||||
: location_of (exp));
|
||||
|
||||
TREE_READONLY (exp) = 0;
|
||||
TREE_THIS_VOLATILE (exp) = 0;
|
||||
|
||||
|
@ -1656,6 +1660,16 @@ build_aggr_init (tree exp, tree init, int flags, tsubst_flags_t complain)
|
|||
TREE_TYPE (init) = cv_unqualified (itype);
|
||||
from_array = (itype && same_type_p (TREE_TYPE (init),
|
||||
TREE_TYPE (exp)));
|
||||
|
||||
if (init && !from_array
|
||||
&& !BRACE_ENCLOSED_INITIALIZER_P (init))
|
||||
{
|
||||
if (complain & tf_error)
|
||||
permerror (init_loc, "array must be initialized "
|
||||
"with a brace-enclosed initializer");
|
||||
else
|
||||
return error_mark_node;
|
||||
}
|
||||
}
|
||||
|
||||
stmt_expr = build_vec_init (exp, NULL_TREE, init,
|
||||
|
@ -3945,6 +3959,9 @@ build_vec_init (tree base, tree maxindex, tree init,
|
|||
? vec_copy_assign_is_trivial (inner_elt_type, init)
|
||||
: !TYPE_NEEDS_CONSTRUCTING (type))
|
||||
&& ((TREE_CODE (init) == CONSTRUCTOR
|
||||
&& (BRACE_ENCLOSED_INITIALIZER_P (init)
|
||||
|| (same_type_ignoring_top_level_qualifiers_p
|
||||
(atype, TREE_TYPE (init))))
|
||||
/* Don't do this if the CONSTRUCTOR might contain something
|
||||
that might throw and require us to clean up. */
|
||||
&& (vec_safe_is_empty (CONSTRUCTOR_ELTS (init))
|
||||
|
|
7
gcc/testsuite/g++.dg/init/array48.C
Normal file
7
gcc/testsuite/g++.dg/init/array48.C
Normal file
|
@ -0,0 +1,7 @@
|
|||
// PR c++/78345
|
||||
// { dg-do compile { target c++11 } }
|
||||
|
||||
struct A
|
||||
{
|
||||
const int i;
|
||||
} a[1] = []{}; // { dg-error "array.*init" }
|
|
@ -1,5 +1,5 @@
|
|||
// { dg-do compile }
|
||||
// { dg-additional-options "-w -Wno-psabi" }
|
||||
// { dg-additional-options "-w -fpermissive -Wno-psabi" }
|
||||
// { dg-additional-options "-mavx" { target x86_64-*-* i?86-*-* } }
|
||||
|
||||
typedef double __m256d __attribute__ ((__vector_size__ (32), __may_alias__));
|
||||
|
|
Loading…
Add table
Reference in a new issue