1 /* { dg-do run } */
2 /* { dg-options "-fsanitize=undefined -fno-sanitize-recover=undefined" } */
3 
4 int c;
5 
6 __attribute__((noinline, noclone)) void
f1(int * a,char * b)7 f1 (int *a, char *b)
8 {
9   __builtin_memcpy (a, b, sizeof (*a));
10 }
11 
12 __attribute__((noinline, noclone)) void
f2(int * a,char * b)13 f2 (int *a, char *b)
14 {
15   __builtin_memcpy (b, a, sizeof (*a));
16 }
17 
18 __attribute__((noinline, noclone)) void
f3(char * b)19 f3 (char *b)
20 {
21   __builtin_memcpy (&c, b, sizeof (c));
22 }
23 
24 __attribute__((noinline, noclone)) void
f4(char * b)25 f4 (char *b)
26 {
27   __builtin_memcpy (b, &c, sizeof (c));
28 }
29 
30 struct T
31 {
32   char a;
33   short b;
34   int c;
35   long d;
36   long long e;
37   short f;
38   float g;
39   double h;
40   long double i;
41 } __attribute__((packed));
42 
43 __attribute__((noinline, noclone)) int
f5(struct T * p)44 f5 (struct T *p)
45 {
46   return p->a + p->b + p->c + p->d + p->e + p->f + p->g + p->h + p->i;
47 }
48 
49 int
main()50 main ()
51 {
52   struct S { int a; char b[sizeof (int) + 1]; } s;
53   s.a = 6;
54   f2 (&s.a, &s.b[1]);
55   f1 (&s.a, &s.b[1]);
56   c = s.a + 1;
57   f4 (&s.b[1]);
58   f3 (&s.b[1]);
59   if (c != 7 || s.a != 6)
60     __builtin_abort ();
61   struct U { long long a; long double b; char c; struct T d; } u;
62   __builtin_memset (&u, 0, sizeof (u));
63   if (f5 (&u.d) != 0)
64     __builtin_abort ();
65   return 0;
66 }
67