gcc/testsuite/ChangeLog:
2016-01-18 Martin Sebor <msebor@redhat.com>
PR c++/69253
* g++.dg/ext/flexary11.C: New test.
gcc/cp/ChangeLog:
2016-01-18 Martin Sebor <msebor@redhat.com>
PR c++/69253
* typeck2.c (cxx_incomplete_type_diagnostic): Handle flexible
array members.
===================================================================
@@ -498,8 +498,15 @@ cxx_incomplete_type_diagnostic (const_tr
case ARRAY_TYPE:
if (TYPE_DOMAIN (type))
{
- type = TREE_TYPE (type);
- goto retry;
+ if (TYPE_MAX_VALUE (TYPE_DOMAIN (type)))
+ {
+ type = TREE_TYPE (type);
+ goto retry;
+ }
+ /* Flexible array members have no upper bound. */
+ emit_diagnostic (diag_kind, input_location, 0,
+ "invalid use of a flexible array member");
+ break;
}
emit_diagnostic (diag_kind, loc, 0,
"invalid use of array with unspecified bounds");
===================================================================
@@ -0,0 +1,19 @@
+// PR c++/69253 - [6 Regression] g++ ICE at -O0 on x86_64-linux-gnu
+// in "cxx_incomplete_type_diagnostic"
+// { dg-do compile }
+
+struct A {
+ int n;
+ char a [];
+};
+
+void f ()
+{
+ // Compound literals and flexible array members are G++ extensions
+ // accepted for compatibility with C and GCC.
+
+ // The following use of a flexible array member in a compound literal
+ // is invalid in C and rejected by GCC in C mode and so it's also
+ // rejected in C++ mode.
+ (struct A){ 1, "" }; // { dg-error "forbids compound-literals|initialization of a flexible array member|invalid use of a flexible array member" }
+}