From d1a73b0baead836a8d813a6a63459ef87a270bba Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 17 Mar 2017 14:56:22 -0400 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/init.c | 17 +++++++++++++++++ gcc/testsuite/g++.dg/init/array48.C | 7 +++++++ gcc/testsuite/g++.dg/torture/pr70499.C | 2 +- 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/init/array48.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a5c150a..7d2a56a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2017-03-17 Jason Merrill + 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. diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 8bfcbde..ebb1245 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -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)) diff --git a/gcc/testsuite/g++.dg/init/array48.C b/gcc/testsuite/g++.dg/init/array48.C new file mode 100644 index 0000000..27fec13 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array48.C @@ -0,0 +1,7 @@ +// PR c++/78345 +// { dg-do compile { target c++11 } } + +struct A +{ + const int i; +} a[1] = []{}; // { dg-error "array.*init" } diff --git a/gcc/testsuite/g++.dg/torture/pr70499.C b/gcc/testsuite/g++.dg/torture/pr70499.C index 954fea5..e08c26f 100644 --- a/gcc/testsuite/g++.dg/torture/pr70499.C +++ b/gcc/testsuite/g++.dg/torture/pr70499.C @@ -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__)); -- 2.7.4