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 *);
24 extern struct A extc
[];
28 __attribute__ ((noinline
))
29 test1 (void *q
, int x
)
32 void *p
= &a
.a
[3], *r
;
34 struct A vara
[x
+ 10];
39 if (__builtin_object_size (p
, 1) != sizeof (a
.a
) - 3)
41 if (__builtin_object_size (&a
.c
[9], 1)
44 if (__builtin_object_size (q
, 1) != (size_t) -1)
46 if (__builtin_object_size (r
, 1) != sizeof (a
.c
) - 1)
52 if (__builtin_object_size (&y
, 1) != sizeof (y
))
54 if (__builtin_object_size (w
, 1) != sizeof (w
))
56 if (__builtin_object_size (&y
.b
, 1) != sizeof (a
.b
))
58 if (__builtin_object_size (r
, 1) != sizeof (a
.a
) - 1)
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)
74 if (__builtin_object_size (r
, 1) != 30)
77 r
= malloc (sizeof (a
));
80 if (__builtin_object_size (r
, 1) != sizeof (a
))
82 r
= memcpy (r
, "a", 2);
83 if (__builtin_object_size (r
, 1) != sizeof (a
))
85 r
= memcpy (r
+ 2, "b", 2) + 2;
86 if (__builtin_object_size (r
, 1) != sizeof (a
) - 4)
89 r
= memset (r
, 'a', 2);
90 if (__builtin_object_size (r
, 1) != sizeof (a
.a
) - 4)
92 r
= memset (r
+ 2, 'b', 2) + 2;
93 if (__builtin_object_size (r
, 1) != sizeof (a
.a
) - 8)
97 if (__builtin_object_size (r
, 1) != sizeof (a
.a
) - 1)
99 r
= strcpy (r
+ 2, "cd") + 2;
100 if (__builtin_object_size (r
, 1) != sizeof (a
.a
) - 5)
102 if (__builtin_object_size (exta
, 1) != (size_t) -1)
104 if (__builtin_object_size (exta
+ 10, 1) != (size_t) -1)
106 if (__builtin_object_size (&exta
[5], 1) != (size_t) -1)
108 if (__builtin_object_size (extb
, 1) != sizeof (extb
))
110 if (__builtin_object_size (extb
+ 10, 1) != sizeof (extb
) - 10)
112 if (__builtin_object_size (&extb
[5], 1) != sizeof (extb
) - 5)
114 if (__builtin_object_size (extc
, 1) != (size_t) -1)
116 if (__builtin_object_size (extc
+ 10, 1) != (size_t) -1)
118 if (__builtin_object_size (&extc
[5], 1) != (size_t) -1)
120 if (__builtin_object_size (&extc
->a
, 1) != (size_t) -1)
122 if (__builtin_object_size (&(extc
+ 10)->b
, 1) != (size_t) -1)
124 if (__builtin_object_size (&extc
[5].c
[3], 1) != (size_t) -1)
126 if (__builtin_object_size (var
, 1) != (size_t) -1)
128 if (__builtin_object_size (var
+ 10, 1) != (size_t) -1)
130 if (__builtin_object_size (&var
[5], 1) != (size_t) -1)
132 if (__builtin_object_size (vara
, 1) != (size_t) -1)
134 if (__builtin_object_size (vara
+ 10, 1) != (size_t) -1)
136 if (__builtin_object_size (&vara
[5], 1) != (size_t) -1)
138 if (__builtin_object_size (&vara
[0].a
, 1) != sizeof (vara
[0].a
))
140 if (__builtin_object_size (&vara
[10].a
[0], 1) != sizeof (vara
[0].a
))
142 if (__builtin_object_size (&vara
[5].a
[4], 1) != sizeof (vara
[0].a
) - 4)
144 if (__builtin_object_size (&vara
[5].b
, 1) != sizeof (vara
[0].b
))
146 if (__builtin_object_size (&vara
[7].c
[7], 1) != sizeof (vara
[0].c
) - 7)
148 if (__builtin_object_size (zerol
, 1) != 0)
150 if (__builtin_object_size (&zerol
, 1) != 0)
152 if (__builtin_object_size (&zerol
[0], 1) != 0)
154 if (__builtin_object_size (zerol
[0].a
, 1) != 0)
156 if (__builtin_object_size (&zerol
[0].a
[0], 1) != 0)
158 if (__builtin_object_size (&zerol
[0].b
, 1) != 0)
160 if (__builtin_object_size ("abcdefg", 1) != sizeof ("abcdefg"))
162 if (__builtin_object_size ("abcd\0efg", 1) != sizeof ("abcd\0efg"))
164 if (__builtin_object_size (&"abcd\0efg", 1) != sizeof ("abcd\0efg"))
166 if (__builtin_object_size (&"abcd\0efg"[0], 1) != sizeof ("abcd\0efg"))
168 if (__builtin_object_size (&"abcd\0efg"[4], 1) != sizeof ("abcd\0efg") - 4)
170 if (__builtin_object_size ("abcd\0efg" + 5, 1) != sizeof ("abcd\0efg") - 5)
172 if (__builtin_object_size (L
"abcdefg", 1) != sizeof (L
"abcdefg"))
174 r
= (char *) L
"abcd\0efg";
175 if (__builtin_object_size (r
+ 2, 1) != sizeof (L
"abcd\0efg") - 2)
182 __attribute__ ((noinline
))
185 struct B
{ char buf1
[10]; char buf2
[10]; } a
;
189 if (sizeof (a
) != 20)
193 for (i
= 0; i
< 4; ++i
)
199 else if (i
== l1
+ 1)
201 else if (i
== l1
+ 2)
204 if (__builtin_object_size (r
, 1) != sizeof (buf3
))
207 for (i
= 0; i
< 4; ++i
)
213 else if (i
== l1
+ 1)
215 else if (i
== l1
+ 2)
218 if (__builtin_object_size (r
, 1) != sizeof (buf3
) - 5)
221 if (__builtin_object_size (r
, 1) != sizeof (buf3
) - 13)
223 if (__builtin_object_size (r
+ 6, 1) != sizeof (buf3
) - 19)
228 __attribute__ ((noinline
))
232 struct B
{ struct A a
[2]; struct A b
; char c
[4]; char d
; double e
;
233 _Complex
double f
; } x
;
238 if (__builtin_object_size (buf4
, 1) != sizeof (buf4
))
240 if (__builtin_object_size (&buf4
, 1) != sizeof (buf4
))
242 if (__builtin_object_size (&buf4
[0], 1) != sizeof (buf4
))
244 if (__builtin_object_size (&buf4
[1], 1) != sizeof (buf4
) - 1)
246 if (__builtin_object_size (&x
, 1) != sizeof (x
))
248 if (__builtin_object_size (&x
.a
, 1) != sizeof (x
.a
))
250 if (__builtin_object_size (&x
.a
[0], 1) != sizeof (x
.a
))
252 if (__builtin_object_size (&x
.a
[0].a
, 1) != sizeof (x
.a
[0].a
))
254 if (__builtin_object_size (&x
.a
[0].a
[0], 1) != sizeof (x
.a
[0].a
))
256 if (__builtin_object_size (&x
.a
[0].a
[3], 1) != sizeof (x
.a
[0].a
) - 3)
258 if (__builtin_object_size (&x
.a
[0].b
, 1) != sizeof (x
.a
[0].b
))
260 if (__builtin_object_size (&x
.a
[1].c
, 1) != sizeof (x
.a
[1].c
))
262 if (__builtin_object_size (&x
.a
[1].c
[0], 1) != sizeof (x
.a
[1].c
))
264 if (__builtin_object_size (&x
.a
[1].c
[3], 1) != sizeof (x
.a
[1].c
) - 3)
266 if (__builtin_object_size (&x
.b
, 1) != sizeof (x
.b
))
268 if (__builtin_object_size (&x
.b
.a
, 1) != sizeof (x
.b
.a
))
270 if (__builtin_object_size (&x
.b
.a
[0], 1) != sizeof (x
.b
.a
))
272 if (__builtin_object_size (&x
.b
.a
[3], 1) != sizeof (x
.b
.a
) - 3)
274 if (__builtin_object_size (&x
.b
.b
, 1) != sizeof (x
.b
.b
))
276 if (__builtin_object_size (&x
.b
.c
, 1) != sizeof (x
.b
.c
))
278 if (__builtin_object_size (&x
.b
.c
[0], 1) != sizeof (x
.b
.c
))
280 if (__builtin_object_size (&x
.b
.c
[3], 1) != sizeof (x
.b
.c
) - 3)
282 if (__builtin_object_size (&x
.c
, 1) != sizeof (x
.c
))
284 if (__builtin_object_size (&x
.c
[0], 1) != sizeof (x
.c
))
286 if (__builtin_object_size (&x
.c
[1], 1) != sizeof (x
.c
) - 1)
288 if (__builtin_object_size (&x
.d
, 1) != sizeof (x
.d
))
290 if (__builtin_object_size (&x
.e
, 1) != sizeof (x
.e
))
292 if (__builtin_object_size (&x
.f
, 1) != sizeof (x
.f
))
295 if (__builtin_object_size (dp
, 1) != sizeof (x
.f
) / 2)
298 if (__builtin_object_size (dp
, 1) != sizeof (x
.f
) / 2)
301 if (__builtin_object_size (dp
, 1) != sizeof (y
))
303 if (__builtin_object_size (&z
, 1) != sizeof (z
))
306 if (__builtin_object_size (dp
, 1) != sizeof (z
) / 2)
309 if (__builtin_object_size (dp
, 1) != sizeof (z
) / 2)
313 struct S
{ unsigned int a
; };
316 __attribute__ ((noinline
))
317 test4 (char *x
, int y
)
322 for (i
= 0; i
< y
; i
++)
326 if (__builtin_object_size (p
, 1) != (size_t) -1)
333 __attribute__ ((noinline
))
336 struct T
{ char buf
[64]; char buf2
[64]; } t
;
340 for (i
= 0; i
< x
; ++i
)
342 if (__builtin_object_size (p
, 1) != sizeof (t
.buf
) - 8)
344 memset (p
, ' ', sizeof (t
.buf
) - 8 - 4 * 4);
348 __attribute__ ((noinline
))
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)
357 if (__builtin_object_size (q
+ 0, 1) != 0)
359 if (__builtin_object_size (q
+ 64, 1) != 0)
364 __attribute__ ((noinline
))
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)
372 if (__builtin_object_size (q
, 1) != sizeof (t
.buf2
))
375 if (__builtin_object_size (q
, 1) != 0)
378 if (__builtin_object_size (q
, 1) != 0)
381 if (__builtin_object_size (p
, 1) != 0)
389 __asm ("" : "=r" (l1
) : "0" (l1
));
393 test4 ((char *) s
, 10);