Merge from mainline (165734:167278).
[official-gcc/graphite-test-results.git] / gcc / testsuite / gcc.dg / torture / pr45636.c
blob0566de86e16ed6380ecae7cb4b514986027abf10
1 /* { dg-do run } */
2 /* { dg-require-effective-target mempcpy } */
3 /* PR fortran/45636 */
5 typedef __SIZE_TYPE__ size_t;
6 void *memcpy (void *__restrict__, const void *__restrict__, size_t);
7 void *mempcpy (void *__restrict__, const void *__restrict__, size_t);
8 void *memset (void *, int, size_t);
9 int memcmp (const void *, const void *, size_t);
10 extern void abort (void);
12 struct A { int i; char c[32]; } a[2];
14 __attribute__((noinline, noclone)) int
15 f1 (char *p, int q, int z)
17 memcpy (p, "abcd", 4);
18 if (q)
19 z = z + 123;
20 else
21 z *= 114;
22 memset (p + 4, ' ', 2);
23 return z;
26 __attribute__((noinline, noclone)) void
27 f2 (void)
29 char *p = mempcpy (&a[0].c[13], "123456", 4);
30 memset (p, '7', 3);
33 __attribute__((noinline, noclone)) void
34 f3 (struct A *p)
36 p++;
37 char *q = &p->c[10];
38 memcpy (q + 4, "__1234567" + 2, 7);
39 memset (&p->c[21], '9', 3);
42 __attribute__((noinline, noclone)) void
43 f4 (void)
45 memcpy (&a[0].c[10], "0123456789", 10);
46 memset (&a[0].c[13], ' ', 3);
49 __attribute__((noinline, noclone)) void
50 check (const char *p, const char *str, size_t size)
52 const char *q;
53 for (q = (const char *) &a; q < p; q++)
54 if (*q)
55 abort ();
56 if (memcmp (p, str, size) != 0)
57 abort ();
58 for (q = p + size; q < (const char *) (&a[0] + 2); q++)
59 if (*q)
60 abort ();
61 memset (&a, '\0', sizeof a);
64 int
65 main (void)
67 if (f1 (&a[0].c[7], 1, 2) != 125)
68 abort ();
69 check (&a[0].c[7], "abcd ", 6);
70 f2 ();
71 check (&a[0].c[13], "1234777", 7);
72 f3 (&a[0]);
73 check (&a[1].c[14], "1234567999", 10);
74 f4 ();
75 check (&a[0].c[10], "012 6789", 10);
76 return 0;