// { 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 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" }