------- Comment #7 from hubicka at gcc dot gnu dot org 2006-01-16 14:56 ------- These two testcases seems to still fail for me even with the patch. (I use b.c -mpreferred-stack-boundary=2 -S -march=i686 -frename-registers) extern void abort (void) __attribute__((noreturn));
struct setconflict { char a[36]; int b; }; int main () { int sum = 0; { struct setconflict a; short *c; c = (void *)a.a; asm ("": "=r" (c):"0" (c)); *c = 0; asm ("": "=r" (c):"0" (c)); sum += *c; } { struct setconflict a; int *c; c = (void *)a.a; asm ("": "=r" (c):"0" (c)); *c = 1; asm ("": "=r" (c):"0" (c)); sum += *c; } printf ("%d\n",sum); if (sum != 1) abort(); return 0; } extern void abort (void) __attribute__((noreturn)); struct wrapper { union setconflict { short a[20]; int b[10]; } a; }; int main () { int sum = 0; { struct wrapper a; short *c; c = a.a.a; asm ("": "=r" (c):"0" (c)); *c = 0; asm ("": "=r" (c):"0" (c)); sum += *c; } { struct wrapper a; int *c; c = a.a.b; asm ("": "=r" (c):"0" (c)); *c = 1; asm ("": "=r" (c):"0" (c)); sum += *c; } printf ("%d\n",sum); if (sum != 1) abort(); return 0; } So looking for unions is IMO not strong enought test. Not sure what proper solution shall be :( Honza -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25654