aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2020-02-21 10:45:56 -0700
committerMartin Sebor <msebor@redhat.com>2020-02-21 10:45:56 -0700
commitdbfba41e95d1d93b17e907b7f516b52ed3a3c415 (patch)
tree93af137ea1444ac1f140c538a9ed78a673edc692 /gcc
parent9e58988061f4175896de11af0caf9bdd48c9b046 (diff)
downloadgcc-dbfba41e95d1d93b17e907b7f516b52ed3a3c415.zip
gcc-dbfba41e95d1d93b17e907b7f516b52ed3a3c415.tar.gz
gcc-dbfba41e95d1d93b17e907b7f516b52ed3a3c415.tar.bz2
PR c++/93753 - ICE on a flexible array followed by a member in an anonymous struct with an initializer
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/class.c2
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/ext/flexary36.C123
-rw-r--r--gcc/testsuite/g++.dg/lto/pr93166_0.C2
5 files changed, 138 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index fd60343..a9c0f1a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index a1fd1aa..772134d 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -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. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b608a1a..fe93624 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..5bb827c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/flexary36.C
@@ -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" }
diff --git a/gcc/testsuite/g++.dg/lto/pr93166_0.C b/gcc/testsuite/g++.dg/lto/pr93166_0.C
index 52f7ddf..a83ba6e 100644
--- a/gcc/testsuite/g++.dg/lto/pr93166_0.C
+++ b/gcc/testsuite/g++.dg/lto/pr93166_0.C
@@ -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,