From 964b79eb330d5df3e851696e2d0bfa30b0e0307b Mon Sep 17 00:00:00 2001
From: Marek Polacek <polacek@redhat.com>
Date: Wed, 14 Dec 2016 20:41:43 +0000
Subject: [PATCH] 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
---
 gcc/cp/ChangeLog                     |  6 ++++
 gcc/cp/init.c                        |  8 +++++
 gcc/testsuite/ChangeLog              |  7 ++++
 gcc/testsuite/g++.dg/ext/flexary12.C |  2 +-
 gcc/testsuite/g++.dg/ext/flexary20.C | 49 ++++++++++++++++++++++++++++
 gcc/testsuite/g++.dg/ext/flexary21.C | 15 +++++++++
 6 files changed, 86 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/ext/flexary20.C
 create mode 100644 gcc/testsuite/g++.dg/ext/flexary21.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4061bedab8b9..a08c93a755e3 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 b4b6cdb0a4c6..47428b96f3d9 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 7875060bcb76..5026f07b5dc5 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 3d8c8059223e..db80bf408f56 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 000000000000..2c8ab2960f72
--- /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 000000000000..5675bf6f0d64
--- /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" }
+};
-- 
GitLab