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 *);
23 extern struct A extc
[];
27 __attribute__ ((noinline
))
28 test1 (void *q
, int x
)
31 void *p
= &a
.a
[3], *r
;
33 struct A vara
[x
+ 10];
38 if (__builtin_object_size (p
, 1) != sizeof (a
.a
) - 3)
40 if (__builtin_object_size (&a
.c
[9], 1)
43 if (__builtin_object_size (q
, 1) != (size_t) -1)
45 if (__builtin_object_size (r
, 1) != sizeof (a
.c
) - 1)
51 if (__builtin_object_size (&y
, 1) != sizeof (y
))
53 if (__builtin_object_size (w
, 1) != sizeof (w
))
55 if (__builtin_object_size (&y
.b
, 1) != sizeof (a
.b
))
57 if (__builtin_object_size (r
, 1) != sizeof (a
.a
) - 1)
63 /* We may duplicate this test onto the two exit paths. On one path
64 the size will be 32, the other it will be 30. If we don't duplicate
65 this test, then the size will be 32. */
66 if (__builtin_object_size (r
, 1) != 2 * 16
67 && __builtin_object_size (r
, 1) != 30)
73 if (__builtin_object_size (r
, 1) != 30)
76 r
= malloc (sizeof (a
));
79 if (__builtin_object_size (r
, 1) != sizeof (a
))
81 r
= memcpy (r
, "a", 2);
82 if (__builtin_object_size (r
, 1) != sizeof (a
))
84 r
= memcpy (r
+ 2, "b", 2) + 2;
85 if (__builtin_object_size (r
, 1) != sizeof (a
) - 4)
88 r
= memset (r
, 'a', 2);
89 if (__builtin_object_size (r
, 1) != sizeof (a
.a
) - 4)
91 r
= memset (r
+ 2, 'b', 2) + 2;
92 if (__builtin_object_size (r
, 1) != sizeof (a
.a
) - 8)
96 if (__builtin_object_size (r
, 1) != sizeof (a
.a
) - 1)
98 r
= strcpy (r
+ 2, "cd") + 2;
99 if (__builtin_object_size (r
, 1) != sizeof (a
.a
) - 5)
101 if (__builtin_object_size (exta
, 1) != (size_t) -1)
103 if (__builtin_object_size (exta
+ 10, 1) != (size_t) -1)
105 if (__builtin_object_size (&exta
[5], 1) != (size_t) -1)
107 if (__builtin_object_size (extb
, 1) != sizeof (extb
))
109 if (__builtin_object_size (extb
+ 10, 1) != sizeof (extb
) - 10)
111 if (__builtin_object_size (&extb
[5], 1) != sizeof (extb
) - 5)
113 if (__builtin_object_size (extc
, 1) != (size_t) -1)
115 if (__builtin_object_size (extc
+ 10, 1) != (size_t) -1)
117 if (__builtin_object_size (&extc
[5], 1) != (size_t) -1)
119 if (__builtin_object_size (&extc
->a
, 1) != (size_t) -1)
121 if (__builtin_object_size (&(extc
+ 10)->b
, 1) != (size_t) -1)
123 if (__builtin_object_size (&extc
[5].c
[3], 1) != (size_t) -1)
125 if (__builtin_object_size (var
, 1) != (size_t) -1)
127 if (__builtin_object_size (var
+ 10, 1) != (size_t) -1)
129 if (__builtin_object_size (&var
[5], 1) != (size_t) -1)
131 if (__builtin_object_size (vara
, 1) != (size_t) -1)
133 if (__builtin_object_size (vara
+ 10, 1) != (size_t) -1)
135 if (__builtin_object_size (&vara
[5], 1) != (size_t) -1)
137 if (__builtin_object_size (&vara
[0].a
, 1) != sizeof (vara
[0].a
))
139 if (__builtin_object_size (&vara
[10].a
[0], 1) != sizeof (vara
[0].a
))
141 if (__builtin_object_size (&vara
[5].a
[4], 1) != sizeof (vara
[0].a
) - 4)
143 if (__builtin_object_size (&vara
[5].b
, 1) != sizeof (vara
[0].b
))
145 if (__builtin_object_size (&vara
[7].c
[7], 1) != sizeof (vara
[0].c
) - 7)
147 if (__builtin_object_size (zerol
, 1) != 0)
149 if (__builtin_object_size (&zerol
, 1) != 0)
151 if (__builtin_object_size (&zerol
[0], 1) != 0)
153 if (__builtin_object_size (zerol
[0].a
, 1) != 0)
155 if (__builtin_object_size (&zerol
[0].a
[0], 1) != 0)
157 if (__builtin_object_size (&zerol
[0].b
, 1) != 0)
159 if (__builtin_object_size ("abcdefg", 1) != sizeof ("abcdefg"))
161 if (__builtin_object_size ("abcd\0efg", 1) != sizeof ("abcd\0efg"))
163 if (__builtin_object_size (&"abcd\0efg", 1) != sizeof ("abcd\0efg"))
165 if (__builtin_object_size (&"abcd\0efg"[0], 1) != sizeof ("abcd\0efg"))
167 if (__builtin_object_size (&"abcd\0efg"[4], 1) != sizeof ("abcd\0efg") - 4)
169 if (__builtin_object_size ("abcd\0efg" + 5, 1) != sizeof ("abcd\0efg") - 5)
171 if (__builtin_object_size (L
"abcdefg", 1) != sizeof (L
"abcdefg"))
173 r
= (char *) L
"abcd\0efg";
174 if (__builtin_object_size (r
+ 2, 1) != sizeof (L
"abcd\0efg") - 2)
181 __attribute__ ((noinline
))
184 struct B
{ char buf1
[10]; char buf2
[10]; } a
;
188 if (sizeof (a
) != 20)
192 for (i
= 0; i
< 4; ++i
)
198 else if (i
== l1
+ 1)
200 else if (i
== l1
+ 2)
203 if (__builtin_object_size (r
, 1) != sizeof (buf3
))
206 for (i
= 0; i
< 4; ++i
)
212 else if (i
== l1
+ 1)
214 else if (i
== l1
+ 2)
217 if (__builtin_object_size (r
, 1) != sizeof (buf3
) - 5)
220 if (__builtin_object_size (r
, 1) != sizeof (buf3
) - 13)
222 if (__builtin_object_size (r
+ 6, 1) != sizeof (buf3
) - 19)
227 __attribute__ ((noinline
))
231 struct B
{ struct A a
[2]; struct A b
; char c
[4]; char d
; double e
;
232 _Complex
double f
; } x
;
237 if (__builtin_object_size (buf4
, 1) != sizeof (buf4
))
239 if (__builtin_object_size (&buf4
, 1) != sizeof (buf4
))
241 if (__builtin_object_size (&buf4
[0], 1) != sizeof (buf4
))
243 if (__builtin_object_size (&buf4
[1], 1) != sizeof (buf4
) - 1)
245 if (__builtin_object_size (&x
, 1) != sizeof (x
))
247 if (__builtin_object_size (&x
.a
, 1) != sizeof (x
.a
))
249 if (__builtin_object_size (&x
.a
[0], 1) != sizeof (x
.a
))
251 if (__builtin_object_size (&x
.a
[0].a
, 1) != sizeof (x
.a
[0].a
))
253 if (__builtin_object_size (&x
.a
[0].a
[0], 1) != sizeof (x
.a
[0].a
))
255 if (__builtin_object_size (&x
.a
[0].a
[3], 1) != sizeof (x
.a
[0].a
) - 3)
257 if (__builtin_object_size (&x
.a
[0].b
, 1) != sizeof (x
.a
[0].b
))
259 if (__builtin_object_size (&x
.a
[1].c
, 1) != sizeof (x
.a
[1].c
))
261 if (__builtin_object_size (&x
.a
[1].c
[0], 1) != sizeof (x
.a
[1].c
))
263 if (__builtin_object_size (&x
.a
[1].c
[3], 1) != sizeof (x
.a
[1].c
) - 3)
265 if (__builtin_object_size (&x
.b
, 1) != sizeof (x
.b
))
267 if (__builtin_object_size (&x
.b
.a
, 1) != sizeof (x
.b
.a
))
269 if (__builtin_object_size (&x
.b
.a
[0], 1) != sizeof (x
.b
.a
))
271 if (__builtin_object_size (&x
.b
.a
[3], 1) != sizeof (x
.b
.a
) - 3)
273 if (__builtin_object_size (&x
.b
.b
, 1) != sizeof (x
.b
.b
))
275 if (__builtin_object_size (&x
.b
.c
, 1) != sizeof (x
.b
.c
))
277 if (__builtin_object_size (&x
.b
.c
[0], 1) != sizeof (x
.b
.c
))
279 if (__builtin_object_size (&x
.b
.c
[3], 1) != sizeof (x
.b
.c
) - 3)
281 if (__builtin_object_size (&x
.c
, 1) != sizeof (x
.c
))
283 if (__builtin_object_size (&x
.c
[0], 1) != sizeof (x
.c
))
285 if (__builtin_object_size (&x
.c
[1], 1) != sizeof (x
.c
) - 1)
287 if (__builtin_object_size (&x
.d
, 1) != sizeof (x
.d
))
289 if (__builtin_object_size (&x
.e
, 1) != sizeof (x
.e
))
291 if (__builtin_object_size (&x
.f
, 1) != sizeof (x
.f
))
294 if (__builtin_object_size (dp
, 1) != sizeof (x
.f
) / 2)
297 if (__builtin_object_size (dp
, 1) != sizeof (x
.f
) / 2)
300 if (__builtin_object_size (dp
, 1) != sizeof (y
))
302 if (__builtin_object_size (&z
, 1) != sizeof (z
))
305 if (__builtin_object_size (dp
, 1) != sizeof (z
) / 2)
308 if (__builtin_object_size (dp
, 1) != sizeof (z
) / 2)
312 struct S
{ unsigned int a
; };
315 __attribute__ ((noinline
))
316 test4 (char *x
, int y
)
321 for (i
= 0; i
< y
; i
++)
325 if (__builtin_object_size (p
, 1) != (size_t) -1)
332 __attribute__ ((noinline
))
335 struct T
{ char buf
[64]; char buf2
[64]; } t
;
339 for (i
= 0; i
< x
; ++i
)
341 if (__builtin_object_size (p
, 1) != sizeof (t
.buf
) - 8)
343 memset (p
, ' ', sizeof (t
.buf
) - 8 - 4 * 4);
347 __attribute__ ((noinline
))
351 struct T
{ char buf
[64]; char buf2
[64]; } t
;
352 char *p
= &buf
[64], *q
= &t
.buf
[64];
354 if (__builtin_object_size (p
+ 64, 1) != 0)
356 if (__builtin_object_size (q
+ 0, 1) != 0)
358 if (__builtin_object_size (q
+ 64, 1) != 0)
363 __attribute__ ((noinline
))
366 struct T
{ char buf
[10]; char buf2
[10]; } t
;
367 char *p
= &t
.buf2
[-4];
368 char *q
= &t
.buf2
[0];
369 if (__builtin_object_size (p
, 1) != 0)
371 if (__builtin_object_size (q
, 1) != sizeof (t
.buf2
))
374 if (__builtin_object_size (q
, 1) != 0)
377 if (__builtin_object_size (q
, 1) != 0)
380 if (__builtin_object_size (p
, 1) != 0)
388 __asm ("" : "=r" (l1
) : "0" (l1
));
392 test4 ((char *) s
, 10);