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
, 3)
38 != sizeof (a
) - offsetof (struct A
, a
) - 3
39 && __builtin_object_size (p
, 3) != 0)
41 if (__builtin_object_size (&a
.c
[9], 3)
42 != sizeof (a
) - offsetof (struct A
, c
) - 9)
44 if (__builtin_object_size (q
, 3) != 0)
46 if (__builtin_object_size (r
, 3)
47 != sizeof (a
) - offsetof (struct A
, c
) - 1
48 && __builtin_object_size (r
, 3) != 0)
54 if (__builtin_object_size (&y
, 3)
57 if (__builtin_object_size (w
, 3)
60 if (__builtin_object_size (&y
.b
, 3)
61 != sizeof (a
) - offsetof (struct A
, b
))
63 if (__builtin_object_size (r
, 3)
64 != sizeof (a
) - offsetof (struct A
, a
) - 6
65 && __builtin_object_size (r
, 3) != 0)
71 if (__builtin_object_size (r
, 3) != 30
72 && __builtin_object_size (r
, 3) != 0)
78 if (__builtin_object_size (r
, 3) != 2 * 14
79 && __builtin_object_size (r
, 3) != 0)
82 r
= malloc (sizeof (a
));
85 if (__builtin_object_size (r
, 3)
86 != sizeof (a
) - offsetof (struct A
, a
) - 3
87 && __builtin_object_size (r
, 3) != 0)
89 r
= memcpy (r
, "a", 2);
90 if (__builtin_object_size (r
, 3)
91 != sizeof (a
) - offsetof (struct A
, a
) - 3
92 && __builtin_object_size (r
, 3) != 0)
94 r
= memcpy (r
+ 2, "b", 2) + 2;
95 if (__builtin_object_size (r
, 3)
96 != sizeof (a
) - offsetof (struct A
, a
) - 3 - 4
97 && __builtin_object_size (r
, 3) != 0)
100 r
= memset (r
, 'a', 2);
101 if (__builtin_object_size (r
, 3)
102 != sizeof (a
) - offsetof (struct A
, a
) - 4
103 && __builtin_object_size (r
, 3) != 0)
105 r
= memset (r
+ 2, 'b', 2) + 2;
106 if (__builtin_object_size (r
, 3)
107 != sizeof (a
) - offsetof (struct A
, a
) - 8
108 && __builtin_object_size (r
, 3) != 0)
111 r
= strcpy (r
, "ab");
112 if (__builtin_object_size (r
, 3)
113 != sizeof (a
) - offsetof (struct A
, a
) - 1
114 && __builtin_object_size (r
, 3) != 0)
116 r
= strcpy (r
+ 2, "cd") + 2;
117 if (__builtin_object_size (r
, 3)
118 != sizeof (a
) - offsetof (struct A
, a
) - 5
119 && __builtin_object_size (r
, 3) != 0)
121 if (__builtin_object_size (exta
, 3) != 0)
123 if (__builtin_object_size (exta
+ 10, 3) != 0)
125 if (__builtin_object_size (&exta
[5], 3) != 0)
127 if (__builtin_object_size (extb
, 3) != sizeof (extb
))
129 if (__builtin_object_size (extb
+ 10, 3) != sizeof (extb
) - 10)
131 if (__builtin_object_size (&extb
[5], 3) != sizeof (extb
) - 5)
133 if (__builtin_object_size (var
, 3) != 0)
135 if (__builtin_object_size (var
+ 10, 3) != 0)
137 if (__builtin_object_size (&var
[5], 3) != 0)
139 if (__builtin_object_size (zerol
, 3) != 0)
141 if (__builtin_object_size (&zerol
, 3) != 0)
143 if (__builtin_object_size (&zerol
[0], 3) != 0)
145 if (__builtin_object_size (zerol
[0].a
, 3) != 0)
147 if (__builtin_object_size (&zerol
[0].a
[0], 3) != 0)
149 if (__builtin_object_size (&zerol
[0].b
, 3) != 0)
151 if (__builtin_object_size ("abcdefg", 3) != sizeof ("abcdefg"))
153 if (__builtin_object_size ("abcd\0efg", 3) != sizeof ("abcd\0efg"))
155 if (__builtin_object_size (&"abcd\0efg", 3) != sizeof ("abcd\0efg"))
157 if (__builtin_object_size (&"abcd\0efg"[0], 3) != sizeof ("abcd\0efg"))
159 if (__builtin_object_size (&"abcd\0efg"[4], 3) != sizeof ("abcd\0efg") - 4)
161 if (__builtin_object_size ("abcd\0efg" + 5, 3) != sizeof ("abcd\0efg") - 5)
163 if (__builtin_object_size (L
"abcdefg", 3) != sizeof (L
"abcdefg"))
165 r
= (char *) L
"abcd\0efg";
166 if (__builtin_object_size (r
+ 2, 3) != sizeof (L
"abcd\0efg") - 2
167 && __builtin_object_size (r
, 3) != 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
, 3) != 3
197 && __builtin_object_size (r
, 3) != 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
, 3) != 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
, 3) != 15
226 && __builtin_object_size (r
, 3) != 0)
229 if (__builtin_object_size (r
, 3) != 7
230 && __builtin_object_size (r
, 3) != 0)
232 if (__builtin_object_size (r
+ 6, 3) != 1
233 && __builtin_object_size (r
+ 6, 3) != 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, 3) != 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
, 3) != sizeof (buf4
))
264 if (__builtin_object_size (&buf4
, 3) != sizeof (buf4
))
266 if (__builtin_object_size (&buf4
[0], 3) != sizeof (buf4
))
268 if (__builtin_object_size (&buf4
[1], 3) != sizeof (buf4
) - 1)
270 if (__builtin_object_size (&x
, 3) != sizeof (x
))
272 if (__builtin_object_size (&x
.a
, 3) != sizeof (x
))
274 if (__builtin_object_size (&x
.a
[0], 3) != sizeof (x
))
276 if (__builtin_object_size (&x
.a
[0].a
, 3) != sizeof (x
))
278 if (__builtin_object_size (&x
.a
[0].a
[0], 3) != sizeof (x
))
280 if (__builtin_object_size (&x
.a
[0].a
[3], 3) != sizeof (x
) - 3)
282 if (__builtin_object_size (&x
.a
[0].b
, 3)
283 != sizeof (x
) - offsetof (struct A
, b
))
285 if (__builtin_object_size (&x
.a
[1].c
, 3)
286 != sizeof (x
) - sizeof (struct A
) - offsetof (struct A
, c
))
288 if (__builtin_object_size (&x
.a
[1].c
[0], 3)
289 != sizeof (x
) - sizeof (struct A
) - offsetof (struct A
, c
))
291 if (__builtin_object_size (&x
.a
[1].c
[3], 3)
292 != sizeof (x
) - sizeof (struct A
) - offsetof (struct A
, c
) - 3)
294 if (__builtin_object_size (&x
.b
, 3)
295 != sizeof (x
) - offsetof (struct B
, b
))
297 if (__builtin_object_size (&x
.b
.a
, 3)
298 != sizeof (x
) - offsetof (struct B
, b
))
300 if (__builtin_object_size (&x
.b
.a
[0], 3)
301 != sizeof (x
) - offsetof (struct B
, b
))
303 if (__builtin_object_size (&x
.b
.a
[3], 3)
304 != sizeof (x
) - offsetof (struct B
, b
) - 3)
306 if (__builtin_object_size (&x
.b
.b
, 3)
307 != sizeof (x
) - offsetof (struct B
, b
)
308 - offsetof (struct A
, b
))
310 if (__builtin_object_size (&x
.b
.c
, 3)
311 != sizeof (x
) - offsetof (struct B
, b
)
312 - offsetof (struct A
, c
))
314 if (__builtin_object_size (&x
.b
.c
[0], 3)
315 != sizeof (x
) - offsetof (struct B
, b
)
316 - offsetof (struct A
, c
))
318 if (__builtin_object_size (&x
.b
.c
[3], 3)
319 != sizeof (x
) - offsetof (struct B
, b
)
320 - offsetof (struct A
, c
) - 3)
322 if (__builtin_object_size (&x
.c
, 3)
323 != sizeof (x
) - offsetof (struct B
, c
))
325 if (__builtin_object_size (&x
.c
[0], 3)
326 != sizeof (x
) - offsetof (struct B
, c
))
328 if (__builtin_object_size (&x
.c
[1], 3)
329 != sizeof (x
) - offsetof (struct B
, c
) - 1)
331 if (__builtin_object_size (&x
.d
, 3)
332 != sizeof (x
) - offsetof (struct B
, d
))
334 if (__builtin_object_size (&x
.e
, 3)
335 != sizeof (x
) - offsetof (struct B
, e
))
337 if (__builtin_object_size (&x
.f
, 3)
338 != sizeof (x
) - offsetof (struct B
, f
))
341 if (__builtin_object_size (dp
, 3) != sizeof (x
.f
) / 2
342 && __builtin_object_size (dp
, 3) != 0)
345 if (__builtin_object_size (dp
, 3) != sizeof (x
.f
) / 2
346 && __builtin_object_size (dp
, 3) != 0)
349 if (__builtin_object_size (dp
, 3) != sizeof (y
)
350 && __builtin_object_size (dp
, 3) != 0)
352 if (__builtin_object_size (&__real__ x
.f
, 3) != sizeof (x
.f
) / 2)
354 if (__builtin_object_size (&__imag__ x
.f
, 3) != sizeof (x
.f
) / 2)
356 if (__builtin_object_size (&y
, 3) != sizeof (y
))
358 if (__builtin_object_size (&z
, 3) != sizeof (z
))
361 if (__builtin_object_size (dp
, 3) != sizeof (z
) / 2
362 && __builtin_object_size (dp
, 3) != 0)
365 if (__builtin_object_size (dp
, 3) != sizeof (z
) / 2
366 && __builtin_object_size (dp
, 3) != 0)
368 if (__builtin_object_size (&__real__ z
, 3) != sizeof (z
) / 2)
370 if (__builtin_object_size (&__imag__ z
, 3) != sizeof (z
) / 2)
374 struct S
{ unsigned int a
; };
377 __attribute__ ((noinline
))
378 test4 (char *x
, int y
)
383 for (i
= 0; i
< y
; i
++)
387 if (__builtin_object_size (p
, 3) != 0)
394 __attribute__ ((noinline
))
401 for (i
= 0; i
< x
; ++i
)
403 if (__builtin_object_size (p
, 3) != 0)
405 memset (p
, ' ', sizeof (buf
) - 8 - 4 * 4);
409 __attribute__ ((noinline
))
412 struct T
{ char buf
[64]; char buf2
[64]; } t
;
416 for (i
= 0; i
< x
; ++i
)
418 if (__builtin_object_size (p
, 3) != 0)
420 memset (p
, ' ', sizeof (t
) - 8 - 4 * 4);
424 __attribute__ ((noinline
))
428 struct T
{ char buf
[64]; char buf2
[64]; } t
;
429 char *p
= &buf
[64], *q
= &t
.buf
[64];
431 if (__builtin_object_size (p
+ 64, 3) != 0)
433 if (__builtin_object_size (q
+ 63, 3) != sizeof (t
) - 64 - 63
434 && __builtin_object_size (q
+ 63, 3) != 0)
436 if (__builtin_object_size (q
+ 64, 3) != sizeof (t
) - 64 - 64
437 && __builtin_object_size (q
+ 64, 3) != 0)
439 if (__builtin_object_size (q
+ 256, 3) != 0)
441 if (__builtin_object_size (&t
.buf
[64] + 63, 3) != sizeof (t
) - 64 - 63)
443 if (__builtin_object_size (&t
.buf
[64] + 64, 3) != sizeof (t
) - 64 - 64)
448 __attribute__ ((noinline
))
451 struct T
{ char buf
[10]; char buf2
[10]; } t
;
452 char *p
= &t
.buf2
[-4];
453 char *q
= &t
.buf2
[0];
454 if (__builtin_object_size (p
, 3) != sizeof (t
) - 10 + 4
455 && __builtin_object_size (p
, 3) != 0)
457 if (__builtin_object_size (q
, 3) != sizeof (t
) - 10
458 && __builtin_object_size (q
, 3) != 0)
460 /* GCC only handles additions, not subtractions. */
462 if (__builtin_object_size (q
, 3) != 0
463 && __builtin_object_size (q
, 3) != sizeof (t
) - 10 + 8)
466 if (__builtin_object_size (p
, 3) != 0)
468 if (__builtin_object_size (&t
.buf2
[-4], 3) != sizeof (t
) - 10 + 4)
470 if (__builtin_object_size (&t
.buf2
[0], 3) != sizeof (t
) - 10)
472 /* GCC only handles additions, not subtractions. */
473 if (__builtin_object_size (&t
.buf2
[0] - 8, 3) != 0
474 && __builtin_object_size (&t
.buf2
[0] - 8, 3) != sizeof (t
) - 10 + 8)
482 __asm ("" : "=r" (l1
) : "0" (l1
));
486 test4 ((char *) s
, 10);