/* PR middle-end/29272 */ extern void abort (void); struct S { struct S *s; } s; struct T { struct T *t; } t; static inline void foo (void *s) { struct T *p = s; __builtin_memcpy (&p->t, &t.t, sizeof (t.t)); } void * __attribute__((noinline)) bar (void *p, struct S *q) { q->s = &s; foo (p); return q->s; } int main (void) { t.t = &t; if (bar (&s, &s) != (void *) &t) abort (); return 0; }