PR c++/93753 - ICE on a flexible array followed by a member in an anonymous struct...
authorMartin Sebor <msebor@redhat.com>
Fri, 21 Feb 2020 17:45:56 +0000 (10:45 -0700)
committerMartin Sebor <msebor@redhat.com>
Fri, 21 Feb 2020 17:45:56 +0000 (10:45 -0700)
gcc/cp/ChangeLog:

PR gcov-profile/93753
* class.c (check_flexarrays): Tighten up a test for potential members
of anonymous structs or unions.

gcc/testsuite/ChangeLog:

PR gcov-profile/93753
* g++.dg/ext/flexary36.C: New test.
* g++.dg/lto/pr93166_0.C: Make struct with flexarray valid.

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

index fd603438d5ad4a168e8826cf00ccad86dc1152e2..a9c0f1a8ecfa925347cbfe1120ca0d31fa192c90 100644 (file)
@@ -1,3 +1,9 @@
+2020-02-21  Martin Sebor  <msebor@redhat.com>
+
+       PR gcov-profile/93753
+       * class.c (check_flexarrays): Tighten up a test for potential members
+       of anonymous structs or unions.
+
 2020-02-20  Martin Sebor  <msebor@redhat.com>
 
        PR c++/93801
index a1fd1aa91ccbf1d1da81be5c9fff45abd47f3f29..772134df5fc54918aa42e1ac9c70848ff0f27f21 100644 (file)
@@ -7142,6 +7142,8 @@ check_flexarrays (tree t, flexmems_t *fmem /* = NULL */,
   /* Is the type unnamed (and therefore a member of it potentially
      an anonymous struct or union)?  */
   bool maybe_anon_p = TYPE_UNNAMED_P (t);
+  if (tree ctx = maybe_anon_p ? TYPE_CONTEXT (t) : NULL_TREE)
+    maybe_anon_p = RECORD_OR_UNION_TYPE_P (ctx);
 
   /* Search the members of the current (possibly derived) class, skipping
      unnamed structs and unions since those could be anonymous.  */
index b608a1aa83b9eaf6bbebc5004628d28f09bf14dc..fe9362434acc71b38428543abb4cc9fd5026b920 100644 (file)
@@ -1,3 +1,9 @@
+2020-02-21  Martin Sebor  <msebor@redhat.com>
+
+       PR gcov-profile/93753
+       * g++.dg/ext/flexary36.C: New test.
+       * g++.dg/lto/pr93166_0.C: Make struct with flexarray valid.
+
 2020-02-21  Dennis Zhang  <dennis.zhang@arm.com>
 
        * gcc.target/arm/simd/vmmla_1.c: New test.
diff --git a/gcc/testsuite/g++.dg/ext/flexary36.C b/gcc/testsuite/g++.dg/ext/flexary36.C
new file mode 100644 (file)
index 0000000..5bb827c
--- /dev/null
@@ -0,0 +1,123 @@
+/* PR c++/93753 - ICE on a flexible array followed by a member in
+   an anonymous struct with an initializer
+   { dg-do compile }
+   { dg-options "-Wall -Wno-unused-variable" } */
+
+struct {
+  int a[];          // { dg-error "flexible array member '<unnamed struct>::a' not at end of 'struct<unnamed>'" }
+  int b;
+} ax;
+
+struct {
+  int a[];          // { dg-error "flexible array member '<unnamed struct>::a' not at end of 'struct<unnamed>'" }
+  int b;
+} bx = { };
+
+struct {
+  int a[];          // { dg-error "flexible array member '<unnamed struct>::a' not at end of 'struct<unnamed>'" }
+  int b;
+} cx = { 0 };
+
+struct {
+  int a[];          // { dg-error "flexible array member '<unnamed struct>::a' not at end of 'struct<unnamed>'" }
+  int b;
+} dx = { 1 };
+
+
+union {
+  int a[];          // { dg-error "flexible array member in union" }
+  int b;
+} du = { 1 };
+
+
+struct A {
+  int a[];          // { dg-error "flexible array member 'A::a' not at end of 'struct A'" }
+  int b;
+} a;
+
+struct B {
+  int a[];          // { dg-error "flexible array member 'B::a' not at end of 'struct B'" }
+  int b;
+} b = { };
+
+struct C {
+  int a[];          // { dg-error "flexible array member 'C::a' not at end of 'struct C'" }
+  int b;
+} c = { 0 };
+
+struct D {
+  int a[];          // { dg-error "flexible array member 'D::a' not at end of 'struct D'" }
+  int b;
+} d = { 1 };
+
+
+struct E {
+  struct {
+    int a[];        // { dg-error " not at end " }
+    int b;
+  } e = { 1 };      // { dg-error "non-static initialization of a flexible array member" }
+};
+
+struct G {
+  struct {
+    int a[];        // { dg-error " not at end " }
+    int b;
+  };
+} g = { 1 };        // { dg-error "initialization of flexible array member in a nested context" }
+
+struct H {
+  int i;
+  struct {
+    int a[];        // { dg-error " not at end " }
+    int b;
+  };
+} h = { 1 };
+
+namespace {
+
+struct {
+  int a[];          // { dg-error " not at end of " }
+  int b;
+} ax;
+
+struct {
+  int a[];          // { dg-error " not at end " }
+  int b;
+} bx = { };
+
+struct {
+  int a[];          // { dg-error " not at end " }
+  int b;
+} cx = { 0 };
+
+struct {
+  int a[];          // { dg-error " not at end " }
+  int b;
+} dx = { 1 };
+
+
+struct A {
+  int a[];          // { dg-error " not at end of 'struct {anonymous}::A'" }
+  int b;
+} a;
+
+struct B {
+  int a[];          // { dg-error " not at end of 'struct {anonymous}::B'" }
+  int b;
+} b = { };
+
+struct C {
+  int a[];          // { dg-error " not at end of 'struct {anonymous}::C'" }
+  int b;
+} c = { 0 };
+
+struct D {
+  int a[];          // { dg-error " not at end of 'struct {anonymous}::D'" }
+  int b;
+} d = { 1 };
+
+}
+
+// { dg-prune-output "unnamed type with no linkage used to declare variable" }
+// { dg-prune-output "non-static data member initializers" }
+// { dg-prune-output "extended initializer lists" }
index 52f7ddf4016a76bb9bede318cca90c1c3cad69f7..a83ba6e0400c90c6621c5a3b3c2d1f147810486d 100644 (file)
@@ -109,7 +109,7 @@ public:
   QSignalMapper *m_sortSignalMapper;
 };
 struct {
-  int data[];
+  int n, data[];
 } b;
 unsigned c[]{};
 void TreeView::qt_static_metacall(QObject *p1, QMetaObject::Call, int,