1 /* PR c++/34459 */
2 
3 extern void abort (void);
4 extern void *memset (void *s, int c, __SIZE_TYPE__ n);
5 
6 struct S
7 {
8   char s[25];
9 };
10 
11 struct S *p;
12 
13 void __attribute__((noinline,noclone))
foo(struct S * x,int set)14 foo (struct S *x, int set)
15 {
16   int i;
17   for (i = 0; i < sizeof (x->s); ++i)
18     if (x->s[i] != 0)
19       abort ();
20     else if (set)
21       x->s[i] = set;
22   p = x;
23 }
24 
25 void __attribute__((noinline,noclone))
test1(void)26 test1 (void)
27 {
28   struct S a;
29   memset (&a.s, '\0', sizeof (a.s));
30   foo (&a, 0);
31   struct S b = a;
32   foo (&b, 1);
33   b = a;
34   b = b;
35   foo (&b, 0);
36 }
37 
38 void __attribute__((noinline,noclone))
test2(void)39 test2 (void)
40 {
41   struct S a;
42   memset (&a.s, '\0', sizeof (a.s));
43   foo (&a, 0);
44   struct S b = a;
45   foo (&b, 1);
46   b = a;
47   b = *p;
48   foo (&b, 0);
49 }
50 
51 void __attribute__((noinline,noclone))
test3(void)52 test3 (void)
53 {
54   struct S a;
55   memset (&a.s, '\0', sizeof (a.s));
56   foo (&a, 0);
57   struct S b = a;
58   foo (&b, 1);
59   *p = a;
60   *p = b;
61   foo (&b, 0);
62 }
63 
64 int
main(void)65 main (void)
66 {
67   test1 ();
68   test2 ();
69   test3 ();
70   return 0;
71 }
72