aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/init.c17
-rw-r--r--gcc/testsuite/g++.dg/init/array48.C7
-rw-r--r--gcc/testsuite/g++.dg/torture/pr70499.C2
4 files changed, 29 insertions, 1 deletions
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 <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.
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__));