152
|
1 /* PR middle-end/94940 - spurious -Warray-bounds for a zero length array
|
|
2 member of union
|
|
3 { dg-do compile }
|
|
4 { dg-options "-O2 -Wall" } */
|
|
5
|
|
6 extern int n;
|
|
7
|
|
8 extern union Ua3_a0 {
|
|
9 int a3[3];
|
|
10 int a2[2]; // can only alias a3[0 - 2]
|
|
11 int a1[1]; // can alias all of the union
|
|
12 int a0[0]; // ditto
|
|
13 } ua3_a0;
|
|
14
|
|
15 void test_ua3_ua0_a0 (int i)
|
|
16 {
|
|
17 ua3_a0.a0[0] = 0; // { dg-bogus "\\\[-Warray-bounds" }
|
|
18 ua3_a0.a0[1] = 0; // { dg-bogus "\\\[-Warray-bounds" }
|
|
19 ua3_a0.a0[2] = 0; // { dg-bogus "\\\[-Warray-bounds" }
|
|
20 ua3_a0.a0[3] = 0; // { dg-warning "\\\[-Warray-bounds" }
|
|
21 ua3_a0.a0[4] = 0; // { dg-warning "\\\[-Warray-bounds" }
|
|
22 ua3_a0.a0[i] = 0; // { dg-bogus "\\\[-Warray-bounds" }
|
|
23
|
|
24 if (i < __LINE__)
|
|
25 i = 5;
|
|
26 ua3_a0.a0[i] = 0; // { dg-warning "\\\[-Warray-bounds" }
|
|
27
|
|
28 if (i > -1)
|
|
29 i = -1;
|
|
30 ua3_a0.a0[i] = 0; // { dg-warning "\\\[-Warray-bounds" }
|
|
31 }
|
|
32
|
|
33 void test_ua3_ua0_a1 (int i)
|
|
34 {
|
|
35 /* Abusing one-element array members the same way as those of
|
|
36 length zero is discouraged but so far acceted without warnings.
|
|
37 This should change at some point. */
|
|
38
|
|
39 ua3_a0.a1[0] = 0;
|
|
40 ua3_a0.a1[1] = 0;
|
|
41 ua3_a0.a1[2] = 0;
|
|
42 ua3_a0.a1[3] = 0; // { dg-warning "\\\[-Warray-bounds" }
|
|
43 ua3_a0.a1[i] = 0;
|
|
44
|
|
45 if (i > -1)
|
|
46 i = -1;
|
|
47 ua3_a0.a1[i] = 0; // { dg-warning "\\\[-Warray-bounds" }
|
|
48
|
|
49 if (i < 7)
|
|
50 i = 7;
|
|
51 ua3_a0.a1[i] = 0; // { dg-warning "\\\[-Warray-bounds" }
|
|
52 }
|
|
53
|
|
54 void test_ua3_ua0_a2 (int i)
|
|
55 {
|
|
56 ua3_a0.a2[0] = 0;
|
|
57 ua3_a0.a2[1] = 0;
|
|
58 ua3_a0.a2[2] = 0; // { dg-warning "\\\[-Warray-bounds" }
|
|
59 ua3_a0.a2[i] = 0;
|
|
60
|
|
61 if (i < __LINE__)
|
|
62 i = __LINE__;
|
|
63 ua3_a0.a2[i] = 0; // { dg-warning "\\\[-Warray-bounds" }
|
|
64
|
|
65 if (i > -1)
|
|
66 i = -1;
|
|
67 ua3_a0.a2[i] = 0; // { dg-warning "\\\[-Warray-bounds" }
|
|
68 }
|
|
69
|
|
70
|
|
71 extern union Ua2_a3 {
|
|
72 int a2[2]; // can only alias a3[0 - 1]
|
|
73 int a3[3];
|
|
74 } ua2_a3;
|
|
75
|
|
76 void test_ua2_ua3 (int i)
|
|
77 {
|
|
78 ua2_a3.a2[0] = 0; // { dg-bogus "\\\[-Warray-bounds" }
|
|
79 ua2_a3.a2[1] = 0; // { dg-bogus "\\\[-Warray-bounds" }
|
|
80 ua2_a3.a2[2] = 0; // { dg-warning "\\\[-Warray-bounds" }
|
|
81 ua2_a3.a2[i] = 0;
|
|
82
|
|
83 if (i < __LINE__)
|
|
84 i = __LINE__;
|
|
85 ua2_a3.a2[i] = 0; // { dg-warning "\\\[-Warray-bounds" }
|
|
86 }
|
|
87
|
|
88
|
|
89 extern struct SUa2_a0 {
|
|
90 union Ua2_a0 {
|
|
91 int a2[2];
|
|
92 int a0[0];
|
|
93 } u;
|
|
94 } sua2_a0;
|
|
95
|
|
96 void test_sua2_sua0 (int i)
|
|
97 {
|
|
98 n += sua2_a0.u.a0[0];
|
|
99 n += sua2_a0.u.a0[1];
|
|
100 n += sua2_a0.u.a0[2]; // { dg-warning "\\\[-Warray-bounds" }
|
|
101 n += sua2_a0.u.a0[i];
|
|
102
|
|
103 if (i < __LINE__)
|
|
104 i = __LINE__;
|
|
105 n += sua2_a0.u.a0[i]; // { dg-warning "\\\[-Warray-bounds" }
|
|
106 }
|
|
107
|
|
108 void test_sua2_sua0_ptr (int i)
|
|
109 {
|
|
110 union Ua2_a0 *p = &sua2_a0.u;
|
|
111
|
|
112 n += p->a0[0];
|
|
113 n += p->a0[1];
|
|
114 n += p->a0[2]; // { dg-warning "\\\[-Warray-bounds" }
|
|
115 n += p->a0[i];
|
|
116 }
|
|
117
|
|
118
|
|
119 extern struct SUSa3_a0 {
|
|
120 union USa3_a0 {
|
|
121 struct {
|
|
122 int a3[3];
|
|
123 } s;
|
|
124 int a2[2]; // can alias s.a3[0 - 2]
|
|
125 int a1[1]; // can alias s.a3[0 - 2]
|
|
126 int a0[0]; // can alias s.a3[0]
|
|
127 } u;
|
|
128 } susa3_ua0;
|
|
129
|
|
130 void test_susa3_sua0 (int i, int j)
|
|
131 {
|
|
132 n += susa3_ua0.u.a0[0];
|
|
133 n += susa3_ua0.u.a0[1];
|
|
134 n += susa3_ua0.u.a0[2];
|
|
135 n += susa3_ua0.u.a0[3]; // { dg-warning "\\\[-Warray-bounds" }
|
|
136 }
|
|
137
|
|
138 void test_susa3_sua0_ptr (int i, int j)
|
|
139 {
|
|
140 union USa3_a0 *p = &susa3_ua0.u;
|
|
141 n += p->a0[0];
|
|
142 n += p->a0[1];
|
|
143 n += p->a0[2];
|
|
144 n += p->a0[3]; // { dg-warning "\\\[-Warray-bounds" }
|
|
145 }
|
|
146
|
|
147 void test_susa3_sua1 (int i)
|
|
148 {
|
|
149 n += susa3_ua0.u.a1[0];
|
|
150 n += susa3_ua0.u.a1[1];
|
|
151 n += susa3_ua0.u.a1[2];
|
|
152 n += susa3_ua0.u.a1[3]; // { dg-warning "\\\[-Warray-bounds" }
|
|
153
|
|
154 if (i < __LINE__)
|
|
155 i = __LINE__;
|
|
156 n += susa3_ua0.u.a1[i]; // { dg-warning "\\\[-Warray-bounds" }
|
|
157 }
|
|
158
|
|
159 void test_susa3_sua2 (void)
|
|
160 {
|
|
161 n += susa3_ua0.u.a2[0];
|
|
162 n += susa3_ua0.u.a2[1];
|
|
163 n += susa3_ua0.u.a2[2]; // { dg-warning "\\\[-Warray-bounds" }
|
|
164 n += susa3_ua0.u.a2[3]; // { dg-warning "\\\[-Warray-bounds" }
|
|
165 }
|
|
166
|
|
167
|
|
168 extern struct {
|
|
169 union {
|
|
170 struct {
|
|
171 int a3[3];
|
|
172 } s1;
|
|
173 struct {
|
|
174 int a0[0];
|
|
175 } s2;
|
|
176 } u;
|
|
177 } susa3_usa0;
|
|
178
|
|
179 void test_susi3_susi0 (int i)
|
|
180 {
|
|
181 n += susa3_usa0.u.s2.a0[0];
|
|
182 n += susa3_usa0.u.s2.a0[1];
|
|
183 n += susa3_usa0.u.s2.a0[2];
|
|
184 n += susa3_usa0.u.s2.a0[3]; // { dg-warning "\\\[-Warray-bounds" }
|
|
185 n += susa3_usa0.u.s2.a0[i];
|
|
186
|
|
187 if (i < __LINE__)
|
|
188 i = __LINE__;
|
|
189 n += susa3_usa0.u.s2.a0[i]; // { dg-warning "\\\[-Warray-bounds" }
|
|
190 }
|