From 66a366a05a39ce91597fe192e3d943efd810eb87 Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Tue, 16 Jan 2018 03:02:34 +0000 Subject: [PATCH] PR c++/83588 - struct with two flexible arrays causes an internal compiler error 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 | 6 ++++ gcc/cp/class.c | 7 +++-- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/g++.dg/ext/flexary28.C | 46 ++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/flexary28.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 533e2d34e43..7e437f8547b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-01-15 Martin Sebor + + PR c++/83588 + * class.c (find_flexarrays): Make a record of multiple flexible array + members. + 2018-01-12 Jason Merrill PR c++/83186 - ICE with static_cast of list-initialized temporary. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 985b443ccdd..4103630231a 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -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 { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2933f83c32f..b29c659ba51 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-01-15 Martin Sebor + + PR c++/83588 + * g++.dg/ext/flexary28.C: New test. + 2018-01-15 Louis Krupp 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 index 00000000000..68172c486d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/flexary28.C @@ -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::::a. not at end of .struct C." } + }; + int b[]; +}; + +struct D { + int i; + struct { + int a[]; // { dg-error "flexible array member .D::::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[]; +}; -- 2.30.2