/* { dg-do run } */ /* Check that varargs passed partially in registers and partially on the stack works. */ #include #include #include struct s { unsigned int i; double d; char s[16]; }; /* Note specifically that, as there are 4 argument registers, the value of ss.d is split between the last argument register and the stack. */ void f (struct s *sp, ...) { int j, k; unsigned int i; double d; char *s; va_list ap; va_start (ap, sp); j = va_arg (ap, int); i = va_arg (ap, unsigned int); d = va_arg (ap, double); s = va_arg (ap, char *); k = va_arg (ap, int); va_end (ap); if (sp->i != i || sp->d != d || strcmp (sp->s, s)) abort (); if (j != -k) abort (); } int main (void) { struct s ss; ss.i = 0xdeadbeef; ss.d = 2.71828; strcpy (ss.s, "shazam!"); f (&ss, 42, ss.i, ss.d, ss.s, -42); return 0; }