2 /* { dg-options "-O2" } */
4 typedef __SIZE_TYPE__
size_t;
5 extern void abort (void);
6 extern void exit (int);
7 extern void *malloc (size_t);
8 extern void *calloc (size_t, size_t);
9 extern void *alloca (size_t);
10 extern void *memcpy (void *, const void *, size_t);
11 extern void *memset (void *, int, size_t);
12 extern char *strcpy (char *, const char *);
13 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
24 extern struct A zerol
[0];
27 __attribute__ ((noinline
))
28 test1 (void *q
, int x
)
31 void *p
= &a
.a
[3], *r
;
37 if (__builtin_object_size (p
, 2)
38 != sizeof (a
) - offsetof (struct A
, a
) - 3
39 && __builtin_object_size (p
, 2) != 0)
41 if (__builtin_object_size (&a
.c
[9], 2)
42 != sizeof (a
) - offsetof (struct A
, c
) - 9)
44 if (__builtin_object_size (q
, 2) != 0)
46 if (__builtin_object_size (r
, 2)
47 != sizeof (a
) - offsetof (struct A
, c
) - 1
48 && __builtin_object_size (r
, 2) != 0)
54 if (__builtin_object_size (&y
, 2)
57 if (__builtin_object_size (w
, 2)
60 if (__builtin_object_size (&y
.b
, 2)
61 != sizeof (a
) - offsetof (struct A
, b
))
63 if (__builtin_object_size (r
, 2)
64 != sizeof (a
) - offsetof (struct A
, a
) - 6
65 && __builtin_object_size (r
, 2) != 0)
71 if (__builtin_object_size (r
, 2) != 30
72 && __builtin_object_size (r
, 2) != 0)
78 if (__builtin_object_size (r
, 2) != 2 * 14
79 && __builtin_object_size (r
, 2) != 0)
82 r
= malloc (sizeof (a
));
85 if (__builtin_object_size (r
, 2)
86 != sizeof (a
) - offsetof (struct A
, a
) - 3
87 && __builtin_object_size (r
, 2) != 0)
89 r
= memcpy (r
, "a", 2);
90 if (__builtin_object_size (r
, 2)
91 != sizeof (a
) - offsetof (struct A
, a
) - 3
92 && __builtin_object_size (r
, 2) != 0)
94 r
= memcpy (r
+ 2, "b", 2) + 2;
95 if (__builtin_object_size (r
, 2)
96 != sizeof (a
) - offsetof (struct A
, a
) - 3 - 4
97 && __builtin_object_size (r
, 2) != 0)
100 r
= memset (r
, 'a', 2);
101 if (__builtin_object_size (r
, 2)
102 != sizeof (a
) - offsetof (struct A
, a
) - 4
103 && __builtin_object_size (r
, 2) != 0)
105 r
= memset (r
+ 2, 'b', 2) + 2;
106 if (__builtin_object_size (r
, 2)
107 != sizeof (a
) - offsetof (struct A
, a
) - 8
108 && __builtin_object_size (r
, 2) != 0)
111 r
= strcpy (r
, "ab");
112 if (__builtin_object_size (r
, 2)
113 != sizeof (a
) - offsetof (struct A
, a
) - 1
114 && __builtin_object_size (r
, 2) != 0)
116 r
= strcpy (r
+ 2, "cd") + 2;
117 if (__builtin_object_size (r
, 2)
118 != sizeof (a
) - offsetof (struct A
, a
) - 5
119 && __builtin_object_size (r
, 2) != 0)
121 if (__builtin_object_size (exta
, 2) != 0)
123 if (__builtin_object_size (exta
+ 10, 2) != 0)
125 if (__builtin_object_size (&exta
[5], 2) != 0)
127 if (__builtin_object_size (extb
, 2) != sizeof (extb
))
129 if (__builtin_object_size (extb
+ 10, 2) != sizeof (extb
) - 10)
131 if (__builtin_object_size (&extb
[5], 2) != sizeof (extb
) - 5)
133 if (__builtin_object_size (var
, 2) != 0)
135 if (__builtin_object_size (var
+ 10, 2) != 0)
137 if (__builtin_object_size (&var
[5], 2) != 0)
139 if (__builtin_object_size (zerol
, 2) != 0)
141 if (__builtin_object_size (&zerol
, 2) != 0)
143 if (__builtin_object_size (&zerol
[0], 2) != 0)
145 if (__builtin_object_size (zerol
[0].a
, 2) != 0)
147 if (__builtin_object_size (&zerol
[0].a
[0], 2) != 0)
149 if (__builtin_object_size (&zerol
[0].b
, 2) != 0)
151 if (__builtin_object_size ("abcdefg", 2) != sizeof ("abcdefg"))
153 if (__builtin_object_size ("abcd\0efg", 2) != sizeof ("abcd\0efg"))
155 if (__builtin_object_size (&"abcd\0efg", 2) != sizeof ("abcd\0efg"))
157 if (__builtin_object_size (&"abcd\0efg"[0], 2) != sizeof ("abcd\0efg"))
159 if (__builtin_object_size (&"abcd\0efg"[4], 2) != sizeof ("abcd\0efg") - 4)
161 if (__builtin_object_size ("abcd\0efg" + 5, 2) != sizeof ("abcd\0efg") - 5)
163 if (__builtin_object_size (L
"abcdefg", 2) != sizeof (L
"abcdefg"))
165 r
= (char *) L
"abcd\0efg";
166 if (__builtin_object_size (r
+ 2, 2) != sizeof (L
"abcd\0efg") - 2
167 && __builtin_object_size (r
, 2) != 0)
174 __attribute__ ((noinline
))
177 struct B
{ char buf1
[10]; char buf2
[10]; } a
;
181 if (sizeof (a
) != 20)
185 for (i
= 0; i
< 4; ++i
)
191 else if (i
== l1
+ 1)
193 else if (i
== l1
+ 2)
196 if (__builtin_object_size (r
, 2) != 3
197 && __builtin_object_size (r
, 2) != 0)
200 for (i
= 0; i
< 4; ++i
)
206 else if (i
== l1
+ 1)
208 else if (i
== l1
+ 2)
211 if (__builtin_object_size (r
, 2) != 0)
214 for (i
= 0; i
< 4; ++i
)
220 else if (i
== l1
+ 1)
222 else if (i
== l1
+ 2)
225 if (__builtin_object_size (r
, 2) != 15
226 && __builtin_object_size (r
, 2) != 0)
229 if (__builtin_object_size (r
, 2) != 7
230 && __builtin_object_size (r
, 2) != 0)
232 if (__builtin_object_size (r
+ 6, 2) != 1
233 && __builtin_object_size (r
+ 6, 2) != 0)
236 for (i
= 0; i
< 4; ++i
)
242 else if (i
== l1
+ 1)
244 else if (i
== l1
+ 2)
247 if (__builtin_object_size (r
+ 12, 2) != 0)
252 __attribute__ ((noinline
))
256 struct B
{ struct A a
[2]; struct A b
; char c
[4]; char d
; double e
;
257 _Complex
double f
; } x
;
262 if (__builtin_object_size (buf4
, 2) != sizeof (buf4
))
264 if (__builtin_object_size (&buf4
, 2) != sizeof (buf4
))
266 if (__builtin_object_size (&buf4
[0], 2) != sizeof (buf4
))
268 if (__builtin_object_size (&buf4
[1], 2) != sizeof (buf4
) - 1)
270 if (__builtin_object_size (&x
, 2) != sizeof (x
))
272 if (__builtin_object_size (&x
.a
, 2) != sizeof (x
))
274 if (__builtin_object_size (&x
.a
[0], 2) != sizeof (x
))
276 if (__builtin_object_size (&x
.a
[0].a
, 2) != sizeof (x
))
278 if (__builtin_object_size (&x
.a
[0].a
[0], 2) != sizeof (x
))
280 if (__builtin_object_size (&x
.a
[0].a
[3], 2) != sizeof (x
) - 3)
282 if (__builtin_object_size (&x
.a
[0].b
, 2)
283 != sizeof (x
) - offsetof (struct A
, b
))
285 if (__builtin_object_size (&x
.a
[1].c
, 2)
286 != sizeof (x
) - sizeof (struct A
) - offsetof (struct A
, c
))
288 if (__builtin_object_size (&x
.a
[1].c
[0], 2)
289 != sizeof (x
) - sizeof (struct A
) - offsetof (struct A
, c
))
291 if (__builtin_object_size (&x
.a
[1].c
[3], 2)
292 != sizeof (x
) - sizeof (struct A
) - offsetof (struct A
, c
) - 3)
294 if (__builtin_object_size (&x
.b
, 2)
295 != sizeof (x
) - offsetof (struct B
, b
))
297 if (__builtin_object_size (&x
.b
.a
, 2)
298 != sizeof (x
) - offsetof (struct B
, b
))
300 if (__builtin_object_size (&x
.b
.a
[0], 2)
301 != sizeof (x
) - offsetof (struct B
, b
))
303 if (__builtin_object_size (&x
.b
.a
[3], 2)
304 != sizeof (x
) - offsetof (struct B
, b
) - 3)
306 if (__builtin_object_size (&x
.b
.b
, 2)
307 != sizeof (x
) - offsetof (struct B
, b
)
308 - offsetof (struct A
, b
))
310 if (__builtin_object_size (&x
.b
.c
, 2)
311 != sizeof (x
) - offsetof (struct B
, b
)
312 - offsetof (struct A
, c
))
314 if (__builtin_object_size (&x
.b
.c
[0], 2)
315 != sizeof (x
) - offsetof (struct B
, b
)
316 - offsetof (struct A
, c
))
318 if (__builtin_object_size (&x
.b
.c
[3], 2)
319 != sizeof (x
) - offsetof (struct B
, b
)
320 - offsetof (struct A
, c
) - 3)
322 if (__builtin_object_size (&x
.c
, 2)
323 != sizeof (x
) - offsetof (struct B
, c
))
325 if (__builtin_object_size (&x
.c
[0], 2)
326 != sizeof (x
) - offsetof (struct B
, c
))
328 if (__builtin_object_size (&x
.c
[1], 2)
329 != sizeof (x
) - offsetof (struct B
, c
) - 1)
331 if (__builtin_object_size (&x
.d
, 2)
332 != sizeof (x
) - offsetof (struct B
, d
))
334 if (__builtin_object_size (&x
.e
, 2)
335 != sizeof (x
) - offsetof (struct B
, e
))
337 if (__builtin_object_size (&x
.f
, 2)
338 != sizeof (x
) - offsetof (struct B
, f
))
341 if (__builtin_object_size (dp
, 2)
342 != sizeof (x
) - offsetof (struct B
, f
)
343 && __builtin_object_size (dp
, 2) != 0)
346 if (__builtin_object_size (dp
, 2)
347 != sizeof (x
) - offsetof (struct B
, f
) - sizeof (x
.f
) / 2
348 && __builtin_object_size (dp
, 2) != 0)
351 if (__builtin_object_size (dp
, 2) != sizeof (y
)
352 && __builtin_object_size (dp
, 2) != 0)
354 if (__builtin_object_size (&__real__ x
.f
, 2)
355 != sizeof (x
) - offsetof (struct B
, f
))
357 if (__builtin_object_size (&__imag__ x
.f
, 2)
358 != sizeof (x
) - offsetof (struct B
, f
)
361 if (__builtin_object_size (&y
, 2) != sizeof (y
))
363 if (__builtin_object_size (&z
, 2) != sizeof (z
))
366 if (__builtin_object_size (dp
, 2) != sizeof (z
)
367 && __builtin_object_size (dp
, 2) != 0)
370 if (__builtin_object_size (dp
, 2) != sizeof (z
) / 2
371 && __builtin_object_size (dp
, 2) != 0)
373 if (__builtin_object_size (&__real__ z
, 2) != sizeof (z
))
375 if (__builtin_object_size (&__imag__ z
, 2) != sizeof (z
) / 2)
379 struct S
{ unsigned int a
; };
382 __attribute__ ((noinline
))
383 test4 (char *x
, int y
)
388 for (i
= 0; i
< y
; i
++)
392 if (__builtin_object_size (p
, 2) != 0)
399 __attribute__ ((noinline
))
406 for (i
= 0; i
< x
; ++i
)
408 if (__builtin_object_size (p
, 2) != 0)
410 memset (p
, ' ', sizeof (buf
) - 8 - 4 * 4);
414 __attribute__ ((noinline
))
417 struct T
{ char buf
[64]; char buf2
[64]; } t
;
421 for (i
= 0; i
< x
; ++i
)
423 if (__builtin_object_size (p
, 2) != 0)
425 memset (p
, ' ', sizeof (t
) - 8 - 4 * 4);
429 __attribute__ ((noinline
))
433 struct T
{ char buf
[64]; char buf2
[64]; } t
;
434 char *p
= &buf
[64], *q
= &t
.buf
[64];
436 if (__builtin_object_size (p
+ 64, 2) != 0)
438 if (__builtin_object_size (q
+ 63, 2) != sizeof (t
) - 64 - 63
439 && __builtin_object_size (q
+ 63, 2) != 0)
441 if (__builtin_object_size (q
+ 64, 2) != sizeof (t
) - 64 - 64
442 && __builtin_object_size (q
+ 64, 2) != 0)
444 if (__builtin_object_size (q
+ 256, 2) != 0)
446 if (__builtin_object_size (&t
.buf
[64] + 63, 2) != sizeof (t
) - 64 - 63)
448 if (__builtin_object_size (&t
.buf
[64] + 64, 2) != sizeof (t
) - 64 - 64)
453 __attribute__ ((noinline
))
456 struct T
{ char buf
[10]; char buf2
[10]; } t
;
457 char *p
= &t
.buf2
[-4];
458 char *q
= &t
.buf2
[0];
459 if (__builtin_object_size (p
, 2) != sizeof (t
) - 10 + 4
460 && __builtin_object_size (p
, 2) != 0)
462 if (__builtin_object_size (q
, 2) != sizeof (t
) - 10
463 && __builtin_object_size (q
, 2) != 0)
465 /* GCC only handles additions, not subtractions. */
467 if (__builtin_object_size (q
, 2) != 0
468 && __builtin_object_size (q
, 2) != sizeof (t
) - 10 + 8)
471 if (__builtin_object_size (p
, 2) != 0)
473 if (__builtin_object_size (&t
.buf2
[-4], 2) != sizeof (t
) - 10 + 4)
475 if (__builtin_object_size (&t
.buf2
[0], 2) != sizeof (t
) - 10)
477 /* GCC only handles additions, not subtractions. */
478 if (__builtin_object_size (&t
.buf2
[0] - 8, 2) != 0
479 && __builtin_object_size (&t
.buf2
[0] - 8, 2) != sizeof (t
) - 10 + 8)
487 __asm ("" : "=r" (l1
) : "0" (l1
));
491 test4 ((char *) s
, 10);