/* { dg-do compile } */ /* { dg-options "-O" } */ /* { dg-bogus "internal compiler error" "ICE" { target *-*-* } 0 } */ #undef SKIP #define ASMDECL __asm (REG); #define CLOBBER_LIST : REG #define INP_CLOBBER_LIST : CLOBBER_LIST #if defined (__alpha__) # define REG "$1" #elif defined (__CRIS__) || defined (__sh__) # define REG "r10" #elif defined (__hppa__) # define REG "%r10" #elif defined (__i386__) # define REG "%eax" #elif defined (__MMIX__) # define REG "$8" #elif defined (__powerpc__) || defined (__PPC__) || defined (__ppc__) \ || defined (__POWERPC__) || defined (PPC) || defined (_IBMR2) # define REG "6" #elif defined (__x86_64__) # define REG "rax" #elif defined (__m68k__) # define REG "%d0" #else /* Make this test harmless for any target not recognized above. */ # define SKIP 1 #endif #ifndef SKIP struct A { int a; }; struct B { struct A b[3]; }; struct C { struct B c; }; void bug (void) { register char* dst ASMDECL; __asm__ ("":"=g"(*dst): : REG); } /* The tree optimizers currently prevent us from finding an overlap - we end up using a copy of dst rather than dst. But at least make sure we don't get an ICE. */ void bug2 (void) { register char* dst ASMDECL; __asm__ ("": :"g"(*dst) CLOBBER_LIST); } void foo (void) { register struct C *dst ASMDECL; __asm__ ("" : "=g"(dst->c.b[1].a) INP_CLOBBER_LIST); } #else int main () { return 0; } #endif