1 /* PR c/3711
2    This testcase ICEd on IA-32 at -O0 and was miscompiled otherwise,
3    because std_expand_builtin_va_arg didn't handle variable size types.  */
4 /* { dg-require-effective-target alloca } */
5 
6 #include <stdarg.h>
7 
8 extern void abort (void);
9 extern void exit (int);
10 
bar(int c)11 void bar (int c)
12 {
13   static int d = '0';
14 
15   if (c != d++)
16     abort ();
17   if (c < '0' || c > '9')
18     abort ();
19 }
20 
foo(int size,...)21 void foo (int size, ...)
22 {
23   struct
24   {
25     char x[size];
26   } d;
27   va_list ap;
28   int i;
29 
30   va_start (ap, size);
31   d = va_arg (ap, typeof (d));
32   for (i = 0; i < size; i++)
33     bar (d.x[i]);
34   d = va_arg (ap, typeof (d));
35   for (i = 0; i < size; i++)
36     bar (d.x[i]);
37   va_end (ap);
38 }
39 
main(void)40 int main (void)
41 {
42   int z = 5;
43   struct { char a[z]; } x, y;
44 
45   x.a[0] = '0';
46   x.a[1] = '1';
47   x.a[2] = '2';
48   x.a[3] = '3';
49   x.a[4] = '4';
50   y.a[0] = '5';
51   y.a[1] = '6';
52   y.a[2] = '7';
53   y.a[3] = '8';
54   y.a[4] = '9';
55   foo (z, x, y);
56   exit (0);
57 }
58