PR tree-optimization/81303
[official-gcc.git] / gcc / testsuite / gcc.dg / builtin-object-size-2.c
blobad2dd296a9a0ad0382cc15fad279b7ac9f185531
1 /* { dg-do run } */
2 /* { dg-options "-O2" } */
3 /* { dg-require-effective-target alloca } */
5 typedef __SIZE_TYPE__ size_t;
6 extern void abort (void);
7 extern void exit (int);
8 extern void *malloc (size_t);
9 extern void *calloc (size_t, size_t);
10 extern void *alloca (size_t);
11 extern void *memcpy (void *, const void *, size_t);
12 extern void *memset (void *, int, size_t);
13 extern char *strcpy (char *, const char *);
15 struct A
17 char a[10];
18 int b;
19 char c[10];
20 } y, w[4];
22 extern char exta[];
23 extern char extb[30];
24 extern struct A extc[];
25 struct A zerol[0];
27 void
28 __attribute__ ((noinline))
29 test1 (void *q, int x)
31 struct A a;
32 void *p = &a.a[3], *r;
33 char var[x + 10];
34 struct A vara[x + 10];
35 if (x < 0)
36 r = &a.a[9];
37 else
38 r = &a.c[1];
39 if (__builtin_object_size (p, 1) != sizeof (a.a) - 3)
40 abort ();
41 if (__builtin_object_size (&a.c[9], 1)
42 != sizeof (a.c) - 9)
43 abort ();
44 if (__builtin_object_size (q, 1) != (size_t) -1)
45 abort ();
46 if (__builtin_object_size (r, 1) != sizeof (a.c) - 1)
47 abort ();
48 if (x < 6)
49 r = &w[2].a[1];
50 else
51 r = &a.a[6];
52 if (__builtin_object_size (&y, 1) != sizeof (y))
53 abort ();
54 if (__builtin_object_size (w, 1) != sizeof (w))
55 abort ();
56 if (__builtin_object_size (&y.b, 1) != sizeof (a.b))
57 abort ();
58 if (__builtin_object_size (r, 1) != sizeof (a.a) - 1)
59 abort ();
60 if (x < 20)
61 r = malloc (30);
62 else
63 r = calloc (2, 16);
64 /* We may duplicate this test onto the two exit paths. On one path
65 the size will be 32, the other it will be 30. If we don't duplicate
66 this test, then the size will be 32. */
67 if (__builtin_object_size (r, 1) != 2 * 16
68 && __builtin_object_size (r, 1) != 30)
69 abort ();
70 if (x < 20)
71 r = malloc (30);
72 else
73 r = calloc (2, 14);
74 if (__builtin_object_size (r, 1) != 30)
75 abort ();
76 if (x < 30)
77 r = malloc (sizeof (a));
78 else
79 r = &a.a[3];
80 if (__builtin_object_size (r, 1) != sizeof (a))
81 abort ();
82 r = memcpy (r, "a", 2);
83 if (__builtin_object_size (r, 1) != sizeof (a))
84 abort ();
85 r = memcpy (r + 2, "b", 2) + 2;
86 if (__builtin_object_size (r, 1) != sizeof (a) - 4)
87 abort ();
88 r = &a.a[4];
89 r = memset (r, 'a', 2);
90 if (__builtin_object_size (r, 1) != sizeof (a.a) - 4)
91 abort ();
92 r = memset (r + 2, 'b', 2) + 2;
93 if (__builtin_object_size (r, 1) != sizeof (a.a) - 8)
94 abort ();
95 r = &a.a[1];
96 r = strcpy (r, "ab");
97 if (__builtin_object_size (r, 1) != sizeof (a.a) - 1)
98 abort ();
99 r = strcpy (r + 2, "cd") + 2;
100 if (__builtin_object_size (r, 1) != sizeof (a.a) - 5)
101 abort ();
102 if (__builtin_object_size (exta, 1) != (size_t) -1)
103 abort ();
104 if (__builtin_object_size (exta + 10, 1) != (size_t) -1)
105 abort ();
106 if (__builtin_object_size (&exta[5], 1) != (size_t) -1)
107 abort ();
108 if (__builtin_object_size (extb, 1) != sizeof (extb))
109 abort ();
110 if (__builtin_object_size (extb + 10, 1) != sizeof (extb) - 10)
111 abort ();
112 if (__builtin_object_size (&extb[5], 1) != sizeof (extb) - 5)
113 abort ();
114 if (__builtin_object_size (extc, 1) != (size_t) -1)
115 abort ();
116 if (__builtin_object_size (extc + 10, 1) != (size_t) -1)
117 abort ();
118 if (__builtin_object_size (&extc[5], 1) != (size_t) -1)
119 abort ();
120 if (__builtin_object_size (&extc->a, 1) != (size_t) -1)
121 abort ();
122 if (__builtin_object_size (&(extc + 10)->b, 1) != (size_t) -1)
123 abort ();
124 if (__builtin_object_size (&extc[5].c[3], 1) != (size_t) -1)
125 abort ();
126 if (__builtin_object_size (var, 1) != (size_t) -1)
127 abort ();
128 if (__builtin_object_size (var + 10, 1) != (size_t) -1)
129 abort ();
130 if (__builtin_object_size (&var[5], 1) != (size_t) -1)
131 abort ();
132 if (__builtin_object_size (vara, 1) != (size_t) -1)
133 abort ();
134 if (__builtin_object_size (vara + 10, 1) != (size_t) -1)
135 abort ();
136 if (__builtin_object_size (&vara[5], 1) != (size_t) -1)
137 abort ();
138 if (__builtin_object_size (&vara[0].a, 1) != sizeof (vara[0].a))
139 abort ();
140 if (__builtin_object_size (&vara[10].a[0], 1) != sizeof (vara[0].a))
141 abort ();
142 if (__builtin_object_size (&vara[5].a[4], 1) != sizeof (vara[0].a) - 4)
143 abort ();
144 if (__builtin_object_size (&vara[5].b, 1) != sizeof (vara[0].b))
145 abort ();
146 if (__builtin_object_size (&vara[7].c[7], 1) != sizeof (vara[0].c) - 7)
147 abort ();
148 if (__builtin_object_size (zerol, 1) != 0)
149 abort ();
150 if (__builtin_object_size (&zerol, 1) != 0)
151 abort ();
152 if (__builtin_object_size (&zerol[0], 1) != 0)
153 abort ();
154 if (__builtin_object_size (zerol[0].a, 1) != 0)
155 abort ();
156 if (__builtin_object_size (&zerol[0].a[0], 1) != 0)
157 abort ();
158 if (__builtin_object_size (&zerol[0].b, 1) != 0)
159 abort ();
160 if (__builtin_object_size ("abcdefg", 1) != sizeof ("abcdefg"))
161 abort ();
162 if (__builtin_object_size ("abcd\0efg", 1) != sizeof ("abcd\0efg"))
163 abort ();
164 if (__builtin_object_size (&"abcd\0efg", 1) != sizeof ("abcd\0efg"))
165 abort ();
166 if (__builtin_object_size (&"abcd\0efg"[0], 1) != sizeof ("abcd\0efg"))
167 abort ();
168 if (__builtin_object_size (&"abcd\0efg"[4], 1) != sizeof ("abcd\0efg") - 4)
169 abort ();
170 if (__builtin_object_size ("abcd\0efg" + 5, 1) != sizeof ("abcd\0efg") - 5)
171 abort ();
172 if (__builtin_object_size (L"abcdefg", 1) != sizeof (L"abcdefg"))
173 abort ();
174 r = (char *) L"abcd\0efg";
175 if (__builtin_object_size (r + 2, 1) != sizeof (L"abcd\0efg") - 2)
176 abort ();
179 size_t l1 = 1;
181 void
182 __attribute__ ((noinline))
183 test2 (void)
185 struct B { char buf1[10]; char buf2[10]; } a;
186 char *r, buf3[20];
187 int i;
189 if (sizeof (a) != 20)
190 return;
192 r = buf3;
193 for (i = 0; i < 4; ++i)
195 if (i == l1 - 1)
196 r = &a.buf1[1];
197 else if (i == l1)
198 r = &a.buf2[7];
199 else if (i == l1 + 1)
200 r = &buf3[5];
201 else if (i == l1 + 2)
202 r = &a.buf1[9];
204 if (__builtin_object_size (r, 1) != sizeof (buf3))
205 abort ();
206 r = &buf3[20];
207 for (i = 0; i < 4; ++i)
209 if (i == l1 - 1)
210 r = &a.buf1[7];
211 else if (i == l1)
212 r = &a.buf2[7];
213 else if (i == l1 + 1)
214 r = &buf3[5];
215 else if (i == l1 + 2)
216 r = &a.buf1[9];
218 if (__builtin_object_size (r, 1) != sizeof (buf3) - 5)
219 abort ();
220 r += 8;
221 if (__builtin_object_size (r, 1) != sizeof (buf3) - 13)
222 abort ();
223 if (__builtin_object_size (r + 6, 1) != sizeof (buf3) - 19)
224 abort ();
227 void
228 __attribute__ ((noinline))
229 test3 (void)
231 char buf4[10];
232 struct B { struct A a[2]; struct A b; char c[4]; char d; double e;
233 _Complex double f; } x;
234 double y;
235 _Complex double z;
236 double *dp;
238 if (__builtin_object_size (buf4, 1) != sizeof (buf4))
239 abort ();
240 if (__builtin_object_size (&buf4, 1) != sizeof (buf4))
241 abort ();
242 if (__builtin_object_size (&buf4[0], 1) != sizeof (buf4))
243 abort ();
244 if (__builtin_object_size (&buf4[1], 1) != sizeof (buf4) - 1)
245 abort ();
246 if (__builtin_object_size (&x, 1) != sizeof (x))
247 abort ();
248 if (__builtin_object_size (&x.a, 1) != sizeof (x.a))
249 abort ();
250 if (__builtin_object_size (&x.a[0], 1) != sizeof (x.a))
251 abort ();
252 if (__builtin_object_size (&x.a[0].a, 1) != sizeof (x.a[0].a))
253 abort ();
254 if (__builtin_object_size (&x.a[0].a[0], 1) != sizeof (x.a[0].a))
255 abort ();
256 if (__builtin_object_size (&x.a[0].a[3], 1) != sizeof (x.a[0].a) - 3)
257 abort ();
258 if (__builtin_object_size (&x.a[0].b, 1) != sizeof (x.a[0].b))
259 abort ();
260 if (__builtin_object_size (&x.a[1].c, 1) != sizeof (x.a[1].c))
261 abort ();
262 if (__builtin_object_size (&x.a[1].c[0], 1) != sizeof (x.a[1].c))
263 abort ();
264 if (__builtin_object_size (&x.a[1].c[3], 1) != sizeof (x.a[1].c) - 3)
265 abort ();
266 if (__builtin_object_size (&x.b, 1) != sizeof (x.b))
267 abort ();
268 if (__builtin_object_size (&x.b.a, 1) != sizeof (x.b.a))
269 abort ();
270 if (__builtin_object_size (&x.b.a[0], 1) != sizeof (x.b.a))
271 abort ();
272 if (__builtin_object_size (&x.b.a[3], 1) != sizeof (x.b.a) - 3)
273 abort ();
274 if (__builtin_object_size (&x.b.b, 1) != sizeof (x.b.b))
275 abort ();
276 if (__builtin_object_size (&x.b.c, 1) != sizeof (x.b.c))
277 abort ();
278 if (__builtin_object_size (&x.b.c[0], 1) != sizeof (x.b.c))
279 abort ();
280 if (__builtin_object_size (&x.b.c[3], 1) != sizeof (x.b.c) - 3)
281 abort ();
282 if (__builtin_object_size (&x.c, 1) != sizeof (x.c))
283 abort ();
284 if (__builtin_object_size (&x.c[0], 1) != sizeof (x.c))
285 abort ();
286 if (__builtin_object_size (&x.c[1], 1) != sizeof (x.c) - 1)
287 abort ();
288 if (__builtin_object_size (&x.d, 1) != sizeof (x.d))
289 abort ();
290 if (__builtin_object_size (&x.e, 1) != sizeof (x.e))
291 abort ();
292 if (__builtin_object_size (&x.f, 1) != sizeof (x.f))
293 abort ();
294 dp = &__real__ x.f;
295 if (__builtin_object_size (dp, 1) != sizeof (x.f) / 2)
296 abort ();
297 dp = &__imag__ x.f;
298 if (__builtin_object_size (dp, 1) != sizeof (x.f) / 2)
299 abort ();
300 dp = &y;
301 if (__builtin_object_size (dp, 1) != sizeof (y))
302 abort ();
303 if (__builtin_object_size (&z, 1) != sizeof (z))
304 abort ();
305 dp = &__real__ z;
306 if (__builtin_object_size (dp, 1) != sizeof (z) / 2)
307 abort ();
308 dp = &__imag__ z;
309 if (__builtin_object_size (dp, 1) != sizeof (z) / 2)
310 abort ();
313 struct S { unsigned int a; };
315 char *
316 __attribute__ ((noinline))
317 test4 (char *x, int y)
319 register int i;
320 struct A *p;
322 for (i = 0; i < y; i++)
324 p = (struct A *) x;
325 x = (char *) &p[1];
326 if (__builtin_object_size (p, 1) != (size_t) -1)
327 abort ();
329 return x;
332 void
333 __attribute__ ((noinline))
334 test5 (size_t x)
336 struct T { char buf[64]; char buf2[64]; } t;
337 char *p = &t.buf[8];
338 size_t i;
340 for (i = 0; i < x; ++i)
341 p = p + 4;
342 if (__builtin_object_size (p, 1) != sizeof (t.buf) - 8)
343 abort ();
344 memset (p, ' ', sizeof (t.buf) - 8 - 4 * 4);
347 void
348 __attribute__ ((noinline))
349 test6 (void)
351 char buf[64];
352 struct T { char buf[64]; char buf2[64]; } t;
353 char *p = &buf[64], *q = &t.buf[64];
355 if (__builtin_object_size (p + 64, 1) != 0)
356 abort ();
357 if (__builtin_object_size (q + 0, 1) != 0)
358 abort ();
359 if (__builtin_object_size (q + 64, 1) != 0)
360 abort ();
363 void
364 __attribute__ ((noinline))
365 test7 (void)
367 struct T { char buf[10]; char buf2[10]; } t;
368 char *p = &t.buf2[-4];
369 char *q = &t.buf2[0];
370 if (__builtin_object_size (p, 1) != 0)
371 abort ();
372 if (__builtin_object_size (q, 1) != sizeof (t.buf2))
373 abort ();
374 q = &t.buf[10];
375 if (__builtin_object_size (q, 1) != 0)
376 abort ();
377 q = &t.buf[11];
378 if (__builtin_object_size (q, 1) != 0)
379 abort ();
380 p = &t.buf[-4];
381 if (__builtin_object_size (p, 1) != 0)
382 abort ();
386 main (void)
388 struct S s[10];
389 __asm ("" : "=r" (l1) : "0" (l1));
390 test1 (main, 6);
391 test2 ();
392 test3 ();
393 test4 ((char *) s, 10);
394 test5 (4);
395 test6 ();
396 test7 ();
397 exit (0);