diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/pr16194.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/pr16194.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr16194.c b/gcc/testsuite/gcc.dg/pr16194.c new file mode 100644 index 000000000..8b4492240 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr16194.c @@ -0,0 +1,78 @@ +/* { 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 + |