1 /* { dg-options "-Warray-bounds" } */
2 /* { dg-do compile } */
3
4 struct A
5 {
6 int i;
7 char p[1];
8 };
9
10 struct B
11 {
12 struct A a;
13 int i;
14 };
15
16 struct C
17 {
18 int i;
19 struct A a;
20 };
21
22 union D
23 {
24 char p[1];
25 struct A a;
26 struct B b;
27 struct C c;
28 };
29
30 struct E
31 {
32 int i;
33 union D d;
34 };
35
36 struct F
37 {
38 union D d;
39 int i;
40 };
41
42 union G
43 {
44 int i;
45 union D d;
46 };
47
48 void
f0()49 f0 ()
50 {
51 __builtin_offsetof (struct A, p[4]); /* OK */
52 __builtin_offsetof (struct B, a.p[4]); /* { dg-warning "greater than size" } */
53 __builtin_offsetof (struct C, a.p[4]); /* OK */
54 __builtin_offsetof (union D, p[4]); /* OK */
55 __builtin_offsetof (union D, a.p[4]); /* OK */
56 __builtin_offsetof (union D, b.a.p[4]); /* { dg-warning "greater than size" } */
57 __builtin_offsetof (union D, c.a.p[4]); /* OK */
58 __builtin_offsetof (struct E, d.p[4]); /* OK */
59 __builtin_offsetof (struct E, d.a.p[4]); /* OK */
60 __builtin_offsetof (struct E, d.b.a.p[4]); /* { dg-warning "greater than size" } */
61 __builtin_offsetof (struct E, d.c.a.p[4]); /* OK */
62 __builtin_offsetof (struct F, d.p[4]); /* { dg-warning "greater than size" } */
63 __builtin_offsetof (struct F, d.a.p[4]); /* { dg-warning "greater than size" } */
64 __builtin_offsetof (struct F, d.b.a.p[4]); /* { dg-warning "greater than size" } */
65 __builtin_offsetof (struct F, d.c.a.p[4]); /* { dg-warning "greater than size" } */
66 __builtin_offsetof (union G, d.p[4]); /* OK */
67 __builtin_offsetof (union G, d.a.p[4]); /* OK */
68 __builtin_offsetof (union G, d.b.a.p[4]); /* { dg-warning "greater than size" } */
69 __builtin_offsetof (union G, d.c.a.p[4]); /* OK */
70 }
71