blob: 4ab864d991d5d168a0c872285093c497c3e082db [file] [log] [blame]
// 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" }