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)11void 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,...)21void 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)40int 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