aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2016-12-14 20:41:43 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2016-12-14 20:41:43 +0000
commit964b79eb330d5df3e851696e2d0bfa30b0e0307b (patch)
treef6f66a11d2a821e98fa7c953cadb8f50678c0dff /gcc
parentcc99421ec4b3b94aa328175635782f6f5c36f9e9 (diff)
downloadgcc-964b79eb330d5df3e851696e2d0bfa30b0e0307b.zip
gcc-964b79eb330d5df3e851696e2d0bfa30b0e0307b.tar.gz
gcc-964b79eb330d5df3e851696e2d0bfa30b0e0307b.tar.bz2
re PR c++/72775 (internal compiler error: in finish_expr_stmt, at cp/semantics.c:677)
PR c++/72775 * init.c (perform_member_init): Diagnose member initializer for flexible array member. * g++.dg/ext/flexary12.C: Adjust dg-error. * g++.dg/ext/flexary20.C: New. * g++.dg/ext/flexary21.C: New. From-SVN: r243669
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/init.c8
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/ext/flexary12.C2
-rw-r--r--gcc/testsuite/g++.dg/ext/flexary20.C49
-rw-r--r--gcc/testsuite/g++.dg/ext/flexary21.C15
6 files changed, 86 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4061bed..a08c93a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2016-12-14 Marek Polacek <polacek@redhat.com>
+
+ PR c++/72775
+ * init.c (perform_member_init): Diagnose member initializer for
+ flexible array member.
+
2016-12-14 Nathan Sidwell <nathan@acm.org>
PR c++/78701
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index b4b6cdb..47428b9 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -800,6 +800,14 @@ perform_member_init (tree member, tree init)
in that case. */
init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
tf_warning_or_error);
+ if (TREE_CODE (type) == ARRAY_TYPE
+ && TYPE_DOMAIN (type) == NULL_TREE
+ && init != NULL_TREE)
+ {
+ error_at (DECL_SOURCE_LOCATION (current_function_decl),
+ "member initializer for flexible array member");
+ inform (DECL_SOURCE_LOCATION (member), "%q#D initialized", member);
+ }
if (init)
finish_expr_stmt (cp_build_modify_expr (input_location, decl,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7875060..5026f07b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2016-12-14 Marek Polacek <polacek@redhat.com>
+
+ PR c++/72775
+ * g++.dg/ext/flexary12.C: Adjust dg-error.
+ * g++.dg/ext/flexary20.C: New.
+ * g++.dg/ext/flexary21.C: New.
+
2016-12-14 Uros Bizjak <ubizjak@gmail.com>
PR target/59874
diff --git a/gcc/testsuite/g++.dg/ext/flexary12.C b/gcc/testsuite/g++.dg/ext/flexary12.C
index 3d8c805..db80bf4 100644
--- a/gcc/testsuite/g++.dg/ext/flexary12.C
+++ b/gcc/testsuite/g++.dg/ext/flexary12.C
@@ -44,7 +44,7 @@ struct D {
D ();
};
-D::D ():
+D::D (): // { dg-error "member initializer for flexible array member" }
a ("c") // { dg-error "incompatible types in assignment of .const char \\\[2\\\]. to .int \\\[\\\]." }
{ }
diff --git a/gcc/testsuite/g++.dg/ext/flexary20.C b/gcc/testsuite/g++.dg/ext/flexary20.C
new file mode 100644
index 0000000..2c8ab29
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/flexary20.C
@@ -0,0 +1,49 @@
+// PR c++/72775
+// { dg-do compile { target c++11 } }
+// { dg-options -Wno-pedantic }
+
+struct S {
+ int i;
+ char a[] = "foo";
+ S () {} // { dg-error "member initializer for flexible array member" }
+};
+
+struct T { // { dg-error "member initializer for flexible array member" }
+ int i;
+ char a[] = "foo";
+};
+
+struct U {
+ int i;
+ char a[] = "foo";
+ U ();
+};
+
+U::U() {} // { dg-error "member initializer for flexible array member" }
+
+int
+main ()
+{
+ struct T t;
+}
+
+struct V {
+ int i;
+ struct W { // { dg-error "member initializer for flexible array member" }
+ int j;
+ char a[] = "foo";
+ } w;
+ V () {}
+};
+
+template <class T>
+struct X { // { dg-error "member initializer for flexible array member" }
+ int i;
+ T a[] = "foo";
+};
+
+void
+fn ()
+{
+ struct X<char> x;
+}
diff --git a/gcc/testsuite/g++.dg/ext/flexary21.C b/gcc/testsuite/g++.dg/ext/flexary21.C
new file mode 100644
index 0000000..5675bf6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/flexary21.C
@@ -0,0 +1,15 @@
+// PR c++/72775
+// { dg-do compile { target c++11 } }
+// { dg-options -Wno-pedantic }
+
+struct S {
+ int i;
+ char a[];
+ S () : a("bob") {} // { dg-error "member initializer for flexible array member" }
+};
+
+struct T {
+ int i;
+ char a[] = "bob";
+ T () : a("bob") {} // { dg-error "member initializer for flexible array member" }
+};