1 /* Copyright (C) 2000  Free Software Foundation.
2 
3    Ensure builtin memcpy and strcpy perform correctly.
4 
5    Written by Jakub Jelinek, 11/24/2000.  */
6 
7 extern void abort (void);
8 extern char *strcpy (char *, const char *);
9 typedef __SIZE_TYPE__ size_t;
10 extern void *memcpy (void *, const void *, size_t);
11 extern int memcmp (const void *, const void *, size_t);
12 
13 char p[32] = "";
14 
main()15 int main()
16 {
17   if (strcpy (p, "abcde") != p || memcmp (p, "abcde", 6))
18     abort ();
19   if (strcpy (p + 16, "vwxyz" + 1) != p + 16 || memcmp (p + 16, "wxyz", 5))
20     abort ();
21   if (strcpy (p + 1, "") != p + 1 || memcmp (p, "a\0cde", 6))
22     abort ();
23   if (strcpy (p + 3, "fghij") != p + 3 || memcmp (p, "a\0cfghij", 9))
24     abort ();
25   if (memcpy (p, "ABCDE", 6) != p || memcmp (p, "ABCDE", 6))
26     abort ();
27   if (memcpy (p + 16, "VWX" + 1, 2) != p + 16 || memcmp (p + 16, "WXyz", 5))
28     abort ();
29   if (memcpy (p + 1, "", 1) != p + 1 || memcmp (p, "A\0CDE", 6))
30     abort ();
31   if (memcpy (p + 3, "FGHI", 4) != p + 3 || memcmp (p, "A\0CFGHIj", 9))
32     abort ();
33 
34   /* Test at least one instance of the __builtin_ style.  We do this
35      to ensure that it works and that the prototype is correct.  */
36   if (__builtin_strcpy (p, "abcde") != p || memcmp (p, "abcde", 6))
37     abort ();
38   if (__builtin_memcpy (p, "ABCDE", 6) != p || memcmp (p, "ABCDE", 6))
39     abort ();
40 
41   return 0;
42 }
43 
44 #ifdef __OPTIMIZE__
45 /* When optimizing, all the above cases should be transformed into
46    something else.  So any remaining calls to the original function
47    should abort.  */
48 __attribute__ ((noinline))
49 static char *
strcpy(char * d,const char * s)50 strcpy (char *d, const char *s)
51 {
52   abort ();
53 }
54 #endif
55