extern void abort (void);

struct A
{
  int i;
};
struct B
{
  struct A a;
  int j;
};

static void
foo (struct B *p)
{
  ((struct A *)p)->i = 1;
}

int main()
{
  struct A a;
  a.i = 0;
  foo ((struct B *)&a);
  if (a.i != 1)
    abort ();
  return 0;
}


Folding (struct A *)p to &p->a causes us to see

  a.i = 0;
  a.0_1 = (struct B *) &a;
  a.0_1->a.i = 1;
  D.2703_2 = a.i;

where the store a.0_1->a.i does not alias a.i because of TBAA on the base
object (you can't access an object of type A via a pointer to type B).

This blocks the fix for PR41316.


-- 
           Summary: folding causes strict aliasing violation
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Keywords: wrong-code, alias
          Severity: normal
          Priority: P3
         Component: middle-end
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: rguenth at gcc dot gnu dot org
OtherBugsDependingO 41316
             nThis:


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41317

Reply via email to