OSDN Git Service

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