2 /* { dg-require-effective-target mempcpy } */
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);
22 memset (p
+ 4, ' ', 2);
26 __attribute__((noinline
, noclone
)) void
29 char *p
= mempcpy (&a
[0].c
[13], "123456", 4);
33 __attribute__((noinline
, noclone
)) void
38 memcpy (q
+ 4, "__1234567" + 2, 7);
39 memset (&p
->c
[21], '9', 3);
42 __attribute__((noinline
, noclone
)) 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
)
53 for (q
= (const char *) &a
; q
< p
; q
++)
56 if (memcmp (p
, str
, size
) != 0)
58 for (q
= p
+ size
; q
< (const char *) (&a
[0] + 2); q
++)
61 memset (&a
, '\0', sizeof a
);
67 if (f1 (&a
[0].c
[7], 1, 2) != 125)
69 check (&a
[0].c
[7], "abcd ", 6);
71 check (&a
[0].c
[13], "1234777", 7);
73 check (&a
[1].c
[14], "1234567999", 10);
75 check (&a
[0].c
[10], "012 6789", 10);