From: Martin Sebor Date: Fri, 21 Feb 2020 17:45:56 +0000 (-0700) Subject: PR c++/93753 - ICE on a flexible array followed by a member in an anonymous struct... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=dbfba41e95d1d93b17e907b7f516b52ed3a3c415;p=gcc.git 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. --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fd603438d5a..a9c0f1a8ecf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2020-02-21 Martin Sebor + + 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 PR c++/93801 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index a1fd1aa91cc..772134df5fc 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 b608a1aa83b..fe9362434ac 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2020-02-21 Martin Sebor + + 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 * 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 00000000000..5bb827cfd0e --- /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 '::a' not at end of 'struct'" } + int b; +} ax; + +struct { + int a[]; // { dg-error "flexible array member '::a' not at end of 'struct'" } + int b; +} bx = { }; + +struct { + int a[]; // { dg-error "flexible array member '::a' not at end of 'struct'" } + int b; +} cx = { 0 }; + +struct { + int a[]; // { dg-error "flexible array member '::a' not at end of 'struct'" } + 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 52f7ddf4016..a83ba6e0400 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,