/* PR c/3711
   This testcase ICEd on IA-32 at -O0 and was miscompiled otherwise,
   because std_expand_builtin_va_arg didn't handle variable size types.  */

#include <stdarg.h>

extern void abort(void);
extern void exit(int);

void bar(int c) {
    static int d = '0';

    if (c != d++)
        abort();
    if (c < '0' || c > '9')
        abort();
}

void foo(int size, ...) {
    struct
    {
        char x[size];
    } d;
    va_list ap;
    int i;

    va_start(ap, size);
    d = va_arg(ap, typeof(d));
    for (i = 0; i < size; i++)
        bar(d.x[i]);
    d = va_arg(ap, typeof(d));
    for (i = 0; i < size; i++)
        bar(d.x[i]);
    va_end(ap);
}

int main(void) {
    int z = 5;
    struct {
        char a[z];
    } x, y;

    x.a[0] = '0';
    x.a[1] = '1';
    x.a[2] = '2';
    x.a[3] = '3';
    x.a[4] = '4';
    y.a[0] = '5';
    y.a[1] = '6';
    y.a[2] = '7';
    y.a[3] = '8';
    y.a[4] = '9';
    foo(z, x, y);
    exit(0);
}
