------- 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

Reply via email to