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