blob: e3a338bc6b2bd39c06c87a1ce3efccf25b179411 [file] [log] [blame]
/* APPLE LOCAL file 4168392 */
/* Support for Microsoft-style anonymous union and
struct aggregation. */
/* { dg-options "-fms-extensions -pedantic" } */
/* { dg-do run } */
#include <stdlib.h>
#include <stddef.h>
#define CHECK_IF(E) if(!(E)) abort()
typedef struct _FOO {
int a;
int b;
} FOO;
typedef struct _BAZ {
int c;
} BAZ;
typedef struct _BAR {
int bar;
struct {
BAZ; /* { dg-warning "ISO C doesn't support unnamed structs/unions" } */
BAZ baz;
}; /* { dg-warning "ISO C doesn't support unnamed structs/unions" } */
union {
int e;
FOO; /* { dg-warning "ISO C doesn't support unnamed structs/unions" } */
FOO foo;
}; /* { dg-warning "ISO C doesn't support unnamed structs/unions" } */
} BAR;
BAR g;
int main(void) {
CHECK_IF (sizeof (g) == 5 * sizeof (int));
g.e = 4;
g.c = 5;
g.baz.c = 6;
g.foo.b = 7;
CHECK_IF (g.b == 7);
CHECK_IF (g.a == 4);
CHECK_IF (g.foo.a == 4);
CHECK_IF (offsetof(BAR, a) == offsetof(BAR, e));
CHECK_IF (offsetof(BAR, a) == offsetof(BAR, foo));
CHECK_IF (offsetof(BAR, e) - offsetof(BAR, c) >= 2 * sizeof(BAZ));
return 0;
}