Fix file cache tunables documentation
[official-gcc.git] / gcc / testsuite / gcc.dg / builtin-object-size-6.c
blobb456b321db06db555c6b8338746a3b68208cc575
1 /* { dg-do run } */
2 /* { dg-options "-O2" } */
4 #include "builtin-object-size-common.h"
6 struct A
8 char a[10];
9 int b;
10 char c[10];
13 void
14 __attribute__ ((noinline))
15 test1 (struct A *p)
17 char *c;
18 if (__builtin_object_size (&p->a, 0) != (size_t) -1)
19 FAIL ();
20 if (__builtin_object_size (&p->a[0], 0) != (size_t) -1)
21 FAIL ();
22 if (__builtin_object_size (&p->a[3], 0) != (size_t) -1)
23 FAIL ();
24 if (__builtin_object_size (&p->b, 0) != (size_t) -1)
25 FAIL ();
26 if (__builtin_object_size (&p->c, 0) != (size_t) -1)
27 FAIL ();
28 c = p->a;
29 if (__builtin_object_size (c, 0) != (size_t) -1)
30 FAIL ();
31 c = &p->a[0];
32 if (__builtin_object_size (c, 0) != (size_t) -1)
33 FAIL ();
34 c = &p->a[3];
35 if (__builtin_object_size (c, 0) != (size_t) -1)
36 FAIL ();
37 c = (char *) &p->b;
38 if (__builtin_object_size (c, 0) != (size_t) -1)
39 FAIL ();
40 c = (char *) &p->c;
41 if (__builtin_object_size (c, 0) != (size_t) -1)
42 FAIL ();
43 if (__builtin_object_size (&p->a, 1) != sizeof (p->a))
44 FAIL ();
45 if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a))
46 FAIL ();
47 if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3)
48 FAIL ();
49 if (__builtin_object_size (&p->b, 1) != sizeof (p->b))
50 FAIL ();
51 if (__builtin_object_size (&p->c, 1) != (size_t) -1)
52 FAIL ();
53 c = p->a;
54 if (__builtin_object_size (c, 1) != sizeof (p->a))
55 FAIL ();
56 c = &p->a[0];
57 if (__builtin_object_size (c, 1) != sizeof (p->a))
58 FAIL ();
59 c = &p->a[3];
60 if (__builtin_object_size (c, 1) != sizeof (p->a) - 3)
61 FAIL ();
62 c = (char *) &p->b;
63 if (__builtin_object_size (c, 1) != sizeof (p->b))
64 FAIL ();
65 c = (char *) &p->c;
66 if (__builtin_object_size (c, 1) != (size_t) -1)
67 FAIL ();
68 if (__builtin_object_size (&p->a, 2) != 0)
69 FAIL ();
70 if (__builtin_object_size (&p->a[0], 2) != 0)
71 FAIL ();
72 if (__builtin_object_size (&p->a[3], 2) != 0)
73 FAIL ();
74 if (__builtin_object_size (&p->b, 2) != 0)
75 FAIL ();
76 if (__builtin_object_size (&p->c, 2) != 0)
77 FAIL ();
78 c = p->a;
79 if (__builtin_object_size (c, 2) != 0)
80 FAIL ();
81 c = &p->a[0];
82 if (__builtin_object_size (c, 2) != 0)
83 FAIL ();
84 c = &p->a[3];
85 if (__builtin_object_size (c, 2) != 0)
86 FAIL ();
87 c = (char *) &p->b;
88 if (__builtin_object_size (c, 2) != 0)
89 FAIL ();
90 c = (char *) &p->c;
91 if (__builtin_object_size (c, 2) != 0)
92 FAIL ();
93 if (__builtin_object_size (&p->a, 3) != sizeof (p->a))
94 FAIL ();
95 if (__builtin_object_size (&p->a[0], 3) != sizeof (p->a))
96 FAIL ();
97 if (__builtin_object_size (&p->a[3], 3) != sizeof (p->a) - 3)
98 FAIL ();
99 if (__builtin_object_size (&p->b, 3) != sizeof (p->b))
100 FAIL ();
101 if (__builtin_object_size (&p->c, 3) != 0)
102 FAIL ();
103 c = p->a;
104 if (__builtin_object_size (c, 3) != sizeof (p->a))
105 FAIL ();
106 c = &p->a[0];
107 if (__builtin_object_size (c, 3) != sizeof (p->a))
108 FAIL ();
109 c = &p->a[3];
110 if (__builtin_object_size (c, 3) != sizeof (p->a) - 3)
111 FAIL ();
112 c = (char *) &p->b;
113 if (__builtin_object_size (c, 3) != sizeof (p->b))
114 FAIL ();
115 c = (char *) &p->c;
116 if (__builtin_object_size (c, 3) != 0)
117 FAIL ();
120 void
121 __attribute__ ((noinline))
122 test2 (void)
124 char *c;
125 size_t s = 2 * sizeof (struct A);
126 struct A *p = malloc (2 * sizeof (struct A));
127 if (__builtin_object_size (&p->a, 0) != s)
128 FAIL ();
129 if (__builtin_object_size (&p->a[0], 0) != s)
130 FAIL ();
131 if (__builtin_object_size (&p->a[3], 0) != s - 3)
132 FAIL ();
133 if (__builtin_object_size (&p->b, 0) != s - __builtin_offsetof (struct A, b))
134 FAIL ();
135 if (__builtin_object_size (&p->c, 0) != s - __builtin_offsetof (struct A, c))
136 FAIL ();
137 c = p->a;
138 if (__builtin_object_size (c, 0) != s)
139 FAIL ();
140 c = &p->a[0];
141 if (__builtin_object_size (c, 0) != s)
142 FAIL ();
143 c = &p->a[3];
144 if (__builtin_object_size (c, 0) != s - 3)
145 FAIL ();
146 c = (char *) &p->b;
147 if (__builtin_object_size (c, 0) != s - __builtin_offsetof (struct A, b))
148 FAIL ();
149 c = (char *) &p->c;
150 if (__builtin_object_size (c, 0) != s - __builtin_offsetof (struct A, c))
151 FAIL ();
152 if (__builtin_object_size (&p->a, 1) != sizeof (p->a))
153 FAIL ();
154 if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a))
155 FAIL ();
156 if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3)
157 FAIL ();
158 if (__builtin_object_size (&p->b, 1) != sizeof (p->b))
159 FAIL ();
160 if (__builtin_object_size (&p->c, 1) != s - __builtin_offsetof (struct A, c))
161 FAIL ();
162 c = p->a;
163 if (__builtin_object_size (c, 1) != sizeof (p->a))
164 FAIL ();
165 c = &p->a[0];
166 if (__builtin_object_size (c, 1) != sizeof (p->a))
167 FAIL ();
168 c = &p->a[3];
169 if (__builtin_object_size (c, 1) != sizeof (p->a) - 3)
170 FAIL ();
171 c = (char *) &p->b;
172 if (__builtin_object_size (c, 1) != sizeof (p->b))
173 FAIL ();
174 c = (char *) &p->c;
175 if (__builtin_object_size (c, 1) != s - __builtin_offsetof (struct A, c))
176 FAIL ();
177 if (__builtin_object_size (&p->a, 2) != s)
178 FAIL ();
179 if (__builtin_object_size (&p->a[0], 2) != s)
180 FAIL ();
181 if (__builtin_object_size (&p->a[3], 2) != s - 3)
182 FAIL ();
183 if (__builtin_object_size (&p->b, 2) != s - __builtin_offsetof (struct A, b))
184 FAIL ();
185 if (__builtin_object_size (&p->c, 2) != s - __builtin_offsetof (struct A, c))
186 FAIL ();
187 c = p->a;
188 if (__builtin_object_size (c, 2) != s)
189 FAIL ();
190 c = &p->a[0];
191 if (__builtin_object_size (c, 2) != s)
192 FAIL ();
193 c = &p->a[3];
194 if (__builtin_object_size (c, 2) != s - 3)
195 FAIL ();
196 c = (char *) &p->b;
197 if (__builtin_object_size (c, 2) != s - __builtin_offsetof (struct A, b))
198 FAIL ();
199 c = (char *) &p->c;
200 if (__builtin_object_size (c, 2) != s - __builtin_offsetof (struct A, c))
201 FAIL ();
202 if (__builtin_object_size (&p->a, 3) != sizeof (p->a))
203 FAIL ();
204 if (__builtin_object_size (&p->a[0], 3) != sizeof (p->a))
205 FAIL ();
206 if (__builtin_object_size (&p->a[3], 3) != sizeof (p->a) - 3)
207 FAIL ();
208 if (__builtin_object_size (&p->b, 3) != sizeof (p->b))
209 FAIL ();
210 if (__builtin_object_size (&p->c, 3) != s - __builtin_offsetof (struct A, c))
211 FAIL ();
212 c = p->a;
213 if (__builtin_object_size (c, 3) != sizeof (p->a))
214 FAIL ();
215 c = &p->a[0];
216 if (__builtin_object_size (c, 3) != sizeof (p->a))
217 FAIL ();
218 c = &p->a[3];
219 if (__builtin_object_size (c, 3) != sizeof (p->a) - 3)
220 FAIL ();
221 c = (char *) &p->b;
222 if (__builtin_object_size (c, 3) != sizeof (p->b))
223 FAIL ();
224 c = (char *) &p->c;
225 if (__builtin_object_size (c, 3) != s - __builtin_offsetof (struct A, c))
226 FAIL ();
227 free (p);
230 void
231 __attribute__ ((noinline))
232 test3 (void)
234 char *c;
235 size_t s;
236 struct A *p = malloc (4);
237 if (__builtin_object_size (&p->a, 0) != 4)
238 FAIL ();
239 if (__builtin_object_size (&p->a[0], 0) != 4)
240 FAIL ();
241 if (__builtin_object_size (&p->a[3], 0) != 1)
242 FAIL ();
243 if (__builtin_object_size (&p->b, 0) != 0)
244 FAIL ();
245 if (__builtin_object_size (&p->c, 0) != 0)
246 FAIL ();
247 if (__builtin_object_size (&p->a, 1) != 4)
248 FAIL ();
249 if (__builtin_object_size (&p->a[0], 1) != 4)
250 FAIL ();
251 if (__builtin_object_size (&p->a[3], 1) != 1)
252 FAIL ();
253 if (__builtin_object_size (&p->b, 1) != 0)
254 FAIL ();
255 if (__builtin_object_size (&p->c, 1) != 0)
256 FAIL ();
257 free (p);
258 s = __builtin_offsetof (struct A, c) + 4;
259 p = malloc (s);
260 if (__builtin_object_size (&p->a, 0) != s)
261 FAIL ();
262 if (__builtin_object_size (&p->a[0], 0) != s)
263 FAIL ();
264 if (__builtin_object_size (&p->a[3], 0) != s - 3)
265 FAIL ();
266 if (__builtin_object_size (&p->b, 0) != s - __builtin_offsetof (struct A, b))
267 FAIL ();
268 if (__builtin_object_size (&p->c, 0) != 4)
269 FAIL ();
270 if (__builtin_object_size (&p->a, 1) != sizeof (p->a))
271 FAIL ();
272 if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a))
273 FAIL ();
274 if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3)
275 FAIL ();
276 if (__builtin_object_size (&p->b, 1) != sizeof (p->b))
277 FAIL ();
278 if (__builtin_object_size (&p->c, 1) != 4)
279 FAIL ();
280 free (p);
283 struct B
285 struct A a[4];
288 void
289 __attribute__ ((noinline))
290 test4 (struct B *q, int i)
292 if (__builtin_object_size (&q->a[2].a[2], 1) != sizeof (q->a[0].a) - 2)
293 FAIL ();
294 if (__builtin_object_size (&q->a[2].c[2], 1) != sizeof (q->a[0].c) - 2)
295 FAIL ();
296 if (__builtin_object_size (&q->a[3].a[2], 1) != sizeof (q->a[0].a) - 2)
297 FAIL ();
298 if (__builtin_object_size (&q->a[3].c[2], 1) != sizeof (q->a[0].c) - 2)
299 FAIL ();
300 if (__builtin_object_size (&q->a[i].a[2], 1) != sizeof (q->a[0].a) - 2)
301 FAIL ();
302 if (__builtin_object_size (&q->a[i].c[2], 1) != sizeof (q->a[0].c) - 2)
303 FAIL ();
306 struct C
308 char a[10];
309 char b;
312 void
313 __attribute__ ((noinline))
314 test5 (struct C *c)
316 if (__builtin_object_size (&c->b, 0) != (size_t) -1)
317 FAIL ();
318 if (__builtin_object_size (&c->b, 1) != 1)
319 FAIL ();
320 if (__builtin_object_size (&c->b, 2) != 0)
321 FAIL ();
322 if (__builtin_object_size (&c->b, 3) != 1)
323 FAIL ();
326 struct D
328 int i;
329 struct D1
331 char b;
332 char a[10];
333 } j;
336 void
337 __attribute__ ((noinline))
338 test6 (struct D *d)
340 if (__builtin_object_size (&d->j.a[3], 0) != (size_t) -1)
341 FAIL ();
342 if (__builtin_object_size (&d->j.a[3], 1) != sizeof (d->j.a) - 3)
343 FAIL ();
344 if (__builtin_object_size (&d->j.a[3], 2) != 0)
345 FAIL ();
346 if (__builtin_object_size (&d->j.a[3], 3) != sizeof (d->j.a) - 3)
347 FAIL ();
350 struct E
352 int i;
353 struct E1
355 char b;
356 char a[10];
357 } j[1];
360 void
361 __attribute__ ((noinline))
362 test7 (struct E *e)
364 if (__builtin_object_size (&e->j[0].a[3], 0) != (size_t) -1)
365 FAIL ();
366 if (__builtin_object_size (&e->j[0].a[3], 1) != sizeof (e->j[0].a) - 3)
367 FAIL ();
368 if (__builtin_object_size (&e->j[0].a[3], 2) != 0)
369 FAIL ();
370 if (__builtin_object_size (&e->j[0].a[3], 3) != sizeof (e->j[0].a) - 3)
371 FAIL ();
372 if (__builtin_object_size ((char *) &e->j[0], 0) != (size_t) -1)
373 FAIL ();
374 if (__builtin_object_size ((char *) &e->j[0], 1) != (size_t) -1)
375 FAIL ();
376 if (__builtin_object_size ((char *) &e->j[0], 2) != 0)
377 FAIL ();
378 if (__builtin_object_size ((char *) &e->j[0], 3) != 0)
379 FAIL ();
382 union F
384 char a[1];
385 struct F1
387 char b;
388 char c[10];
389 } d;
392 void
393 __attribute__ ((noinline))
394 test8 (union F *f)
396 if (__builtin_object_size (&f->d.c[3], 0) != (size_t) -1)
397 FAIL ();
398 if (__builtin_object_size (&f->d.c[3], 1) != (size_t) -1)
399 FAIL ();
400 if (__builtin_object_size (&f->d.c[3], 2) != 0)
401 FAIL ();
402 if (__builtin_object_size (&f->d.c[3], 3) != 0)
403 FAIL ();
407 main (void)
409 struct A a, *p = &a;
410 int i = 1;
411 __asm ("" : "+r" (p));
412 test1 (p);
413 test2 ();
414 test3 ();
415 struct B b, *q = &b;
416 __asm ("" : "+r" (q), "+r" (i));
417 test4 (q, i);
418 struct C c, *cp = &c;
419 __asm ("" : "+r" (cp));
420 test5 (cp);
421 struct D d, *dp = &d;
422 __asm ("" : "+r" (dp));
423 test6 (dp);
424 struct E e, *ep = &e;
425 __asm ("" : "+r" (ep));
426 test7 (ep);
427 union F f, *fp = &f;
428 __asm ("" : "+r" (fp));
429 test8 (fp);
430 DONE ();