------- Comment #5 from rguenth at gcc dot gnu dot org 2005-12-19 11:34 ------- We add some alignment fluff in the SSE type case. The following works as expected:
#include <stdarg.h> typedef int __attribute__ ((vector_size (16))) foo_t; extern void abort(void); struct s { _Complex double f[0]; } s1; void check (int x, ...) { int y; va_list ap; va_start (ap, x); va_arg (ap, struct s); y = va_arg (ap, int); /* Expect output: 3 7 */ if (y != 7) abort (); } int main() { check (3, s1, 7); return 0; } .vars dump difference, working agains non-working: --- t2.c.t96.vars 2005-12-19 12:22:09.000000000 +0100 +++ t.c.t96.vars 2005-12-19 12:15:08.000000000 +0100 @@ -5,10 +5,12 @@ { char * ap; char * D.1699; + char * ap.0; <bb 2>: __builtin_va_start (&ap, 0, 0); - D.1699 = ap; + ap.0 = ap; + D.1699 = ap.0 + 15B & -16B; if (*(int *) D.1699 != 7) goto <L0>; else goto <L1>; <L0>:; We have a bug here in the generic builtins.c and the config/i386/i386.c variant of gimplify_va_arg_expr - and I have a fix. -- rguenth at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- AssignedTo|unassigned at gcc dot gnu |rguenth at gcc dot gnu dot |dot org |org Status|NEW |ASSIGNED Last reconfirmed|2005-10-11 14:02:39 |2005-12-19 11:34:31 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24306