| /* { dg-do run } */ |
| /* { dg-options "-O2" } */ |
| |
| typedef __SIZE_TYPE__ size_t; |
| extern void *malloc (size_t); |
| extern void free (void *); |
| extern void abort (void); |
| |
| union A |
| { |
| int a1; |
| char a2[3]; |
| }; |
| |
| union B |
| { |
| long long b1; |
| union A b2; |
| }; |
| |
| struct C |
| { |
| int c1; |
| union A c2; |
| }; |
| |
| struct D |
| { |
| int d1; |
| union B d2; |
| }; |
| |
| union E |
| { |
| struct C e1; |
| char e2[3]; |
| }; |
| |
| union F |
| { |
| int f1; |
| struct D f2; |
| }; |
| |
| struct G |
| { |
| union A g1; |
| char g2; |
| }; |
| |
| struct H |
| { |
| int h1; |
| union E h2; |
| }; |
| |
| #define T(X, S0, S1) \ |
| if (__builtin_object_size (X, 0) != (S0)) \ |
| abort (); \ |
| if (__builtin_object_size (X, 1) != (S1)) \ |
| abort (); \ |
| if (__builtin_object_size (X, 2) != (S0)) \ |
| abort (); \ |
| if (__builtin_object_size (X, 3) != (S1)) \ |
| abort () |
| #define TS(X, S0) T(&X, S0, sizeof (X)) |
| #define TA(X, S0, S1) \ |
| T(X, S0, S1); T(&X[0], S0, S1); T(&X[1], (S0) - 1, (S1) - 1) |
| #define TF(X, S0) TA(X, S0, S0) |
| |
| int |
| main (void) |
| { |
| size_t s, o, o2; |
| |
| s = sizeof (union A); |
| o = 0; |
| union A *a1 = malloc (s); |
| union A *a2 = malloc (o + 212); |
| TS (a1->a1, s); |
| TF (a1->a2, s); |
| s = o + 212; |
| TS (a2->a1, s); |
| TF (a2->a2, s); |
| free (a2); |
| free (a1); |
| |
| s = sizeof (union B); |
| o = 0; |
| union B *b1 = malloc (s); |
| union B *b2 = malloc (o + 212); |
| TS (b1->b1, s); |
| TS (b1->b2.a1, s); |
| TF (b1->b2.a2, s); |
| s = o + 212; |
| TS (b2->b1, s); |
| TS (b2->b2.a1, s); |
| TF (b2->b2.a2, s); |
| free (b2); |
| free (b1); |
| |
| s = sizeof (struct C); |
| o = __builtin_offsetof (struct C, c2); |
| struct C *c1 = malloc (s); |
| struct C *c2 = malloc (o + 212); |
| TS (c1->c1, s); |
| TS (c1->c2.a1, s - o); |
| TF (c1->c2.a2, s - o); |
| s = o + 212; |
| TS (c2->c1, s); |
| TS (c2->c2.a1, s - o); |
| TF (c2->c2.a2, s - o); |
| free (c2); |
| free (c1); |
| |
| s = sizeof (struct D); |
| o = __builtin_offsetof (struct D, d2); |
| struct D *d1 = malloc (s); |
| struct D *d2 = malloc (o + 212); |
| TS (d1->d1, s); |
| TS (d1->d2.b1, s - o); |
| TS (d1->d2.b2.a1, s - o); |
| TF (d1->d2.b2.a2, s - o); |
| s = o + 212; |
| TS (d2->d1, s); |
| TS (d2->d2.b1, s - o); |
| TS (d2->d2.b2.a1, s - o); |
| TF (d2->d2.b2.a2, s - o); |
| free (d2); |
| free (d1); |
| |
| s = sizeof (union E); |
| o = __builtin_offsetof (union E, e1.c2); |
| union E *e1 = malloc (s); |
| union E *e2 = malloc (o + 212); |
| TS (e1->e1.c1, s); |
| TS (e1->e1.c2.a1, s - o); |
| TF (e1->e1.c2.a2, s - o); |
| TF (e1->e2, s); |
| s = o + 212; |
| TS (e2->e1.c1, s); |
| TS (e2->e1.c2.a1, s - o); |
| TF (e2->e1.c2.a2, s - o); |
| TF (e2->e2, s); |
| free (e2); |
| free (e1); |
| |
| s = sizeof (union F); |
| o = __builtin_offsetof (union F, f2.d2); |
| union F *f1 = malloc (s); |
| union F *f2 = malloc (o + 212); |
| TS (f1->f1, s); |
| TS (f1->f2.d1, s); |
| TS (f1->f2.d2.b1, s - o); |
| TS (f1->f2.d2.b2.a1, s - o); |
| TF (f1->f2.d2.b2.a2, s - o); |
| s = o + 212; |
| TS (f2->f1, s); |
| TS (f2->f2.d1, s); |
| TS (f2->f2.d2.b1, s - o); |
| TS (f2->f2.d2.b2.a1, s - o); |
| TF (f2->f2.d2.b2.a2, s - o); |
| free (f2); |
| free (f1); |
| |
| s = sizeof (struct G); |
| o = __builtin_offsetof (struct G, g2); |
| struct G *g1 = malloc (s); |
| struct G *g2 = malloc (o + 212); |
| TS (g1->g1.a1, s); |
| TA (g1->g1.a2, s, sizeof (g1->g1.a2)); |
| TS (g1->g2, s - o); |
| s = o + 212; |
| TS (g2->g1.a1, s); |
| TA (g2->g1.a2, s, sizeof (g1->g1.a2)); |
| TS (g2->g2, s - o); |
| free (g2); |
| free (g1); |
| |
| s = sizeof (struct H); |
| o = __builtin_offsetof (struct H, h2); |
| o2 = __builtin_offsetof (struct H, h2.e1.c2); |
| struct H *h1 = malloc (s); |
| struct H *h2 = malloc (o2 + 212); |
| TS (h1->h1, s); |
| TS (h1->h2.e1.c1, s - o); |
| TS (h1->h2.e1.c2.a1, s - o2); |
| TA (h1->h2.e1.c2.a2, s - o2, sizeof (h1->h2.e1.c2.a2)); |
| TF (h1->h2.e2, s - o); |
| s = o2 + 212; |
| TS (h2->h1, s); |
| TS (h2->h2.e1.c1, s - o); |
| TS (h2->h2.e1.c2.a1, s - o2); |
| TA (h2->h2.e1.c2.a2, s - o2, sizeof (h2->h2.e1.c2.a2)); |
| TF (h2->h2.e2, s - o); |
| free (h2); |
| free (h1); |
| |
| return 0; |
| } |