Viewing file: flexary18.C (5.26 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// 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" }
|