(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
torture/
pr56965-2.c
       1  extern void abort (void);
       2  
       3  struct S { int i; int j; };
       4  struct X { struct S s; int k; };
       5  struct Y { int k; struct S s; };
       6  union U { struct X x; struct Y y; } __attribute__((may_alias));
       7  
       8  int __attribute__((noinline))
       9  foo (union U *p, union U *q)
      10  {
      11    p->x.s.j = 1;
      12    q->y.s.i = 0;
      13    return p->x.s.j;
      14  }
      15  
      16  struct R { int i; int j; } __attribute__((may_alias));
      17  
      18  int __attribute__((noinline))
      19  bar (struct R *p, struct R *q)
      20  {
      21    p->i = 1;
      22    q->j = 0;
      23    return p->i;
      24  }
      25  
      26  int main()
      27  {
      28    int a[3];
      29    if (foo ((union U *)&a[0], (union U *)&a[0]) != 0)
      30      abort ();
      31    if (bar ((struct R *)&a[1], (struct R *)&a[0]) != 0)
      32      abort ();
      33    return 0;
      34  }