blob: abfbc43028afb0389cc79ba29b4cd808aacdb947 [file] [log] [blame]
// { dg-do compile }
// { dg-additional-options "-Wpedantic -Wno-error=pedantic" }
// Verify that flexible array members are recognized as either valid
// or invalid in anonymous structs (a G++ extension) and C++ anonymous
// unions as well as in structs and unions that look anonymous but
// aren't.
struct S1
{
int i;
// The following declares a named data member of an unnamed struct
// (i.e., it is not an anonymous struct).
struct {
int a[]; // { dg-error "in an otherwise empty" }
} s;
};
struct S2
{
int i;
struct {
int a[]; // { dg-error "in an otherwise empty" }
} s[1];
};
struct S3
{
int i;
struct {
int a[]; // { dg-error "in an otherwise empty" }
} s[];
};
struct S4
{
int i;
struct {
int a[]; // { dg-error "in an otherwise empty" }
} s[2];
};
struct S5
{
int i;
struct {
int a[]; // { dg-error "in an otherwise empty" }
} s[1][2];
};
struct S6
{
int i;
struct {
int a[]; // { dg-error "in an otherwise empty" }
} s[][2];
};
struct S7
{
int i;
struct {
int a[]; // { dg-error "in an otherwise empty" }
} *s;
};
struct S8
{
int i;
struct {
int a[]; // { dg-error "in an otherwise empty" }
} **s;
};
struct S9
{
int i;
struct {
int a[]; // { dg-error "in an otherwise empty" }
} *s[1];
};
struct S10
{
int i;
struct {
int a[]; // { dg-error "in an otherwise empty" }
} *s[];
};
struct S11
{
int i;
struct {
int a[]; // { dg-error "in an otherwise empty" }
} **s[1];
};
struct S12
{
int i;
struct {
int a[]; // { dg-error "in an otherwise empty" }
} **s[];
};
struct S13
{
int i;
struct {
int a[]; // { dg-error "in an otherwise empty" }
} **s[2];
};
struct S14
{
int i;
struct {
int a[]; // { dg-error "in an otherwise empty" }
} &s;
};
struct S15
{
int i;
typedef struct {
int a[]; // { dg-error "in an otherwise empty" }
} T15;
};
struct S16
{
int i;
struct { // { dg-warning "10:ISO C\\+\\+ prohibits anonymous struct|invalid use" }
// A flexible array as a sole member of an anonymous struct is
// rejected with an error in C mode but emits just a pedantic
// warning in C++. Other than excessive pedantry there is no
// reason to reject it.
int a[];
};
};
struct S17
{
int i;
union { // anonymous union
int a[]; // { dg-error "flexible array member in union" }
};
};
struct S18
{
int i;
struct {
int j, a[]; // { dg-message "declared here" }
} s; // { dg-warning "invalid use" }
};
struct S19
{
int i;
struct { // { dg-warning "10:ISO C\\+\\+ prohibits anonymous struct|invalid use" }
int j, a[]; // { dg-message "declared here" }
};
};
struct S20
{
static int i;
typedef int A[];
struct {
int j;
A a; // { dg-message "declared here" }
} s; // { dg-warning "invalid use" }
};
struct S21
{
static int i;
typedef int A[];
struct { // { dg-warning "10:ISO C\\+\\+ prohibits anonymous struct|invalid use" }
int j;
A a; // { dg-message "declared here" }
};
};
struct S22
{
struct S22S {
static int i;
int a[]; // { dg-error "in an otherwise empty" }
} s;
};
struct S23
{
struct { // { dg-warning "10:ISO C\\+\\+ prohibits anonymous struct" }
static int i; // { dg-error "static data member" }
int a[]; // { dg-error "in an otherwise empty" }
};
};
struct S24
{
static int i;
struct {
int a[]; // { dg-error "in an otherwise empty" }
} s;
};
struct S25
{
int i;
struct {
int j, a[]; // { dg-message "declared here" }
} s; // { dg-warning "invalid use" }
// Verify that a static data member of the enclosing class doesn't
// cause infinite recursion or some such badness.
static S25 s2;
};
struct S26
{
template <class>
struct S26S {
static int a;
};
struct {
int a[]; // { dg-error "in an otherwise empty" }
} s;
};
struct S27
{
S27 *p;
int a[];
};
struct S28
{
struct A {
struct B {
S28 *ps28;
A *pa;
B *pb;
} b, *pb;
A *pa;
} a, *pa;
S28::A *pa2;
S28::A::B *pb;
int flexarray[];
};
// Verify that the notes printed along with the warnings point to the types
// or members they should point to and mention the correct relationships
// with the flexible array members.
namespace Notes
{
union A
{
struct {
struct {
int i, a[]; // { dg-message "declared here" }
} c; // { dg-warning "invalid use" }
} d;
int j;
};
union B
{
struct { // { dg-warning "10:ISO C\\+\\+ prohibits anonymous struct" }
struct { // { dg-warning "12:ISO C\\+\\+ prohibits anonymous struct|invalid use" }
int i, a[]; // { dg-message "declared here" }
};
};
int j;
};
}
typedef struct Opaque* P29;
struct S30 { P29 p; };
struct S31 { S30 s; };
typedef struct { } S32;
typedef struct { S32 *ps32; } S33;
typedef struct
{
S33 *ps33;
} S34;
struct S35
{
struct A {
int i1, a1[];
};
struct B {
int i2, a2[];
};
typedef struct {
int i3, a3[];
} C;
typedef struct {
int i4, a4[];
} D;
typedef A A2;
typedef B B2;
typedef C C2;
typedef D D2;
};
// { dg-prune-output "forbids flexible array member" }