PR c++/83588 - struct with two flexible arrays causes an internal compiler error
authorMartin Sebor <msebor@redhat.com>
Tue, 16 Jan 2018 03:02:34 +0000 (03:02 +0000)
committerMartin Sebor <msebor@gcc.gnu.org>
Tue, 16 Jan 2018 03:02:34 +0000 (20:02 -0700)
gcc/cp/ChangeLog:

PR c++/83588
* class.c (find_flexarrays): Make a record of multiple flexible array
members.

gcc/testsuite/ChangeLog:

PR c++/83588
* g++.dg/ext/flexary28.C: New test.

From-SVN: r256721

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/flexary28.C [new file with mode: 0644]

index 533e2d34e4350b65381a16fd1e01053778b88f96..7e437f8547bf68b98c400c3a8132c21042d7c567 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-15  Martin Sebor  <msebor@redhat.com>
+
+       PR c++/83588
+       * class.c (find_flexarrays): Make a record of multiple flexible array
+       members.
+
 2018-01-12  Jason Merrill  <jason@redhat.com>
 
        PR c++/83186 - ICE with static_cast of list-initialized temporary.
index 985b443ccddd7ed8ba113e8ba8ef22c89454f004..4103630231ab509123fa43f2b7265fa9f76f59cc 100644 (file)
@@ -6566,14 +6566,17 @@ find_flexarrays (tree t, flexmems_t *fmem, bool base_p,
          /* Flexible array members have no upper bound.  */
          if (fmem->array)
            {
-             /* Replace the zero-length array if it's been stored and
-                reset the after pointer.  */
              if (TYPE_DOMAIN (TREE_TYPE (fmem->array)))
                {
+                 /* Replace the zero-length array if it's been stored and
+                    reset the after pointer.  */
                  fmem->after[bool (pun)] = NULL_TREE;
                  fmem->array = fld;
                  fmem->enclosing = pstr;
                }
+             else if (!fmem->after[bool (pun)])
+               /* Make a record of another flexible array member.  */
+               fmem->after[bool (pun)] = fld;
            }
          else
            {
index 2933f83c32f9d5ae2651841063f9327203921187..b29c659ba51793f49283025b671a72ed81345320 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-15  Martin Sebor  <msebor@redhat.com>
+
+       PR c++/83588
+       * g++.dg/ext/flexary28.C: New test.
+
 2018-01-15  Louis Krupp  <louis.krupp@zoho.com>
 
        PR fortran/82257
diff --git a/gcc/testsuite/g++.dg/ext/flexary28.C b/gcc/testsuite/g++.dg/ext/flexary28.C
new file mode 100644 (file)
index 0000000..68172c4
--- /dev/null
@@ -0,0 +1,46 @@
+// PR c++/83588 - struct with two flexible arrays causes an internal compiler
+// error
+// { dg-do compile }
+// { dg-options "-Wno-pedantic" }
+
+struct A {
+  int i;
+  int a[];          // { dg-error "flexible array member .A::a. not at end of .struct A." }
+  int b[];
+};
+
+struct B {
+  int i;
+  int a[];          // { dg-error "flexible array member .B::a. not at end of .struct B." }
+  int j;
+  int b[][2];
+};
+
+struct C {
+  int i;
+  struct {
+    int a[];        // { dg-error "flexible array member .C::<unnamed struct>::a. not at end of .struct C." }
+  };
+  int b[];
+};
+
+struct D {
+  int i;
+  struct {
+    int a[];        // { dg-error "flexible array member .D::<unnamed struct>::a. not at end of .struct D." }
+  } b[];
+  int c[];
+};
+
+struct E {
+  int i;
+  int a[0];
+  int b[];          // { dg-error "flexible array member .E::b. not at end of .struct E." }
+  int d[];
+};
+
+struct F {
+  int i;
+  int a[];          // { dg-error "flexible array member .F::a. not at end of .struct F." }
+  int b[], c[], d[];
+};