/* PR c++/34459 */ extern void abort (void); extern void *memset (void *s, int c, __SIZE_TYPE__ n); struct S { char s[25]; }; struct S *p; void __attribute__((noinline)) foo (struct S *x, int set) { int i; for (i = 0; i < sizeof (x->s); ++i) if (x->s[i] != 0) abort (); else if (set) x->s[i] = set; p = x; } void __attribute__((noinline)) test1 (void) { struct S a; memset (&a.s, '\0', sizeof (a.s)); foo (&a, 0); struct S b = a; foo (&b, 1); b = a; b = b; foo (&b, 0); } void __attribute__((noinline)) test2 (void) { struct S a; memset (&a.s, '\0', sizeof (a.s)); foo (&a, 0); struct S b = a; foo (&b, 1); b = a; b = *p; foo (&b, 0); } void __attribute__((noinline)) test3 (void) { struct S a; memset (&a.s, '\0', sizeof (a.s)); foo (&a, 0); struct S b = a; foo (&b, 1); *p = a; *p = b; foo (&b, 0); } int main (void) { test1 (); test2 (); test3 (); return 0; }