blob: bbacc4299c66ba393395e51a2d37b7f364c3db8d [file] [log] [blame]
/* { dg-do run } */
/* { dg-options "-fsanitize=undefined -fno-sanitize-recover=undefined" } */
int c;
__attribute__((noinline, noclone)) void
f1 (int *a, char *b)
{
__builtin_memcpy (a, b, sizeof (*a));
}
__attribute__((noinline, noclone)) void
f2 (int *a, char *b)
{
__builtin_memcpy (b, a, sizeof (*a));
}
__attribute__((noinline, noclone)) void
f3 (char *b)
{
__builtin_memcpy (&c, b, sizeof (c));
}
__attribute__((noinline, noclone)) void
f4 (char *b)
{
__builtin_memcpy (b, &c, sizeof (c));
}
struct T
{
char a;
short b;
int c;
long d;
long long e;
short f;
float g;
double h;
long double i;
} __attribute__((packed));
__attribute__((noinline, noclone)) int
f5 (struct T *p)
{
return p->a + p->b + p->c + p->d + p->e + p->f + p->g + p->h + p->i;
}
int
main ()
{
struct S { int a; char b[sizeof (int) + 1]; } s;
s.a = 6;
f2 (&s.a, &s.b[1]);
f1 (&s.a, &s.b[1]);
c = s.a + 1;
f4 (&s.b[1]);
f3 (&s.b[1]);
if (c != 7 || s.a != 6)
__builtin_abort ();
struct U { long long a; long double b; char c; struct T d; } u;
__builtin_memset (&u, 0, sizeof (u));
if (f5 (&u.d) != 0)
__builtin_abort ();
return 0;
}