// PR c++/71912 - [6/7 regression] flexible array in struct in union rejected // { dg-do compile } // { dg-additional-options "-Wpedantic -Wno-error=pedantic" } #if __cplusplus namespace pr71912 { #endif struct foo { int a; char s[]; // { dg-message "array member .char pr71912::foo::s \\\[\\\]. declared here" } }; struct bar { double d; char t[]; }; struct baz { union { struct foo f; struct bar b; } // The definition of struct foo is fine but the use of struct foo // in the definition of u below is what's invalid and must be clearly // diagnosed. u; // { dg-warning "invalid use of .struct pr71912::foo. with a flexible array member in .struct pr71912::baz." } }; struct xyyzy { union { struct { int a; char s[]; // { dg-message "declared here" } } f; struct { double d; char t[]; } b; } u; // { dg-warning "invalid use" } }; struct baz b; struct xyyzy x; #if __cplusplus } #endif // The following definitions aren't strictly valid but, like those above, // are accepted for compatibility with GCC (in C mode). They are benign // in that the flexible array member is at the highest offset within // the outermost type and doesn't overlap with other members except for // those of the union. union UnionStruct1 { struct { int n1, a[]; } s; int n2; }; union UnionStruct2 { struct { int n1, a1[]; } s1; struct { int n2, a2[]; } s2; int n3; }; union UnionStruct3 { struct { int n1, a1[]; } s1; struct { double n2, a2[]; } s2; char n3; }; union UnionStruct4 { struct { int n1, a1[]; } s1; struct { struct { int n2, a2[]; } s2; } s3; char n3; }; union UnionStruct5 { struct { struct { int n1, a1[]; } s1; } s2; // { dg-warning "invalid use" } struct { double n2, a2[]; } s3; char n3; }; union UnionStruct6 { struct { struct { int n1, a1[]; } s1; } s2; // { dg-warning "invalid use" } struct { struct { int n2, a2[]; } s3; } s4; char n3; }; union UnionStruct7 { struct { int n1, a1[]; } s1; struct { double n2, a2[]; } s2; struct { struct { int n3, a3[]; } s3; } s4; }; union UnionStruct8 { struct { int n1, a1[]; } s1; struct { struct { int n2, a2[]; } s2; } s3; struct { struct { int n3, a3[]; } s4; } s5; }; union UnionStruct9 { struct { struct { int n1, a1[]; } s1; } s2; // { dg-warning "invalid use" } struct { struct { int n2, a2[]; } s3; } s4; struct { struct { int n3, a3[]; } s5; } s6; }; struct StructUnion1 { union { struct { int n1, a1[]; } s1; // { dg-message "declared here" } struct { double n2, a2[]; } s2; char n3; } u; // { dg-warning "invalid use" } }; // The following are invalid and rejected. struct StructUnion2 { union { struct { int n1, a1[]; } s1; // { dg-error "not at end" } } u; char n3; // { dg-message "next member" } }; struct StructUnion3 { union { struct { int n1, a1[]; } s1; // { dg-error "not at end" } struct { double n2, a2[]; } s2; } u; char n3; // { dg-message "next member" } }; struct StructUnion4 { union { struct { int n1, a1[]; } s1; // { dg-error "not at end" } } u1; union { struct { double n2, a2[]; } s2; } u2; // { dg-message "next member" } }; struct StructUnion5 { union { union { struct { int n1, a1[]; } s1; // { dg-message "declared here" } } u1; union { struct { int n2, a2[]; } s2; } u2; } u; // { dg-warning "invalid use" } }; struct StructUnion6 { union { struct { int n1, a1[]; } s1; // { dg-message "declared here" } union { struct { int n2, a2[]; } s2; } u2; } u; // { dg-warning "invalid use" } }; struct StructUnion7 { union { union { struct { double n2, a2[]; } s2; // { dg-message "declared here" } } u2; struct { int n1, a1[]; } s1; } u; // { dg-warning "invalid use" } }; struct StructUnion8 { struct { union { union { struct { int n1, a1[]; } s1; // { dg-error "not at end" } } u1; union { struct { double n2, a2[]; } s2; } u2; } u; } s1; struct { union { union { struct { int n1, a1[]; } s1; } u1; union { struct { double n2, a2[]; } s2; } u2; } u; } s2; // { dg-message "next member" } }; struct StructUnion9 { // { dg-message "in the definition" } struct A1 { union B1 { union C1 { struct Sx1 { int n1, a1[]; } sx1; // { dg-error "not at end" } } c1; union D1 { struct Sx2 { double n2, a2[]; } sx2; } d1; } b1; // { dg-warning "invalid use" } } a1; struct A2 { union B2 { union C2 { struct Sx3 { int n3, a3[]; } sx3; // { dg-message "declared here" } } c2; union D2 { struct Sx4 { double n4, a4[]; } sx4; } d2; } b2; // { dg-warning "invalid use" } } a2; // { dg-message "next member" } }; // { dg-prune-output "forbids flexible array member" }