Merge to HEAD at tree-cleanup-merge-20041024 .
[official-gcc.git] / gcc / testsuite / gcc.c-torture / execute / builtins / string-7.c
blob5eb1ac4af78d5b620e8c6692a9387bd16b7bb2fb
1 /* Copyright (C) 2003 Free Software Foundation.
3 Ensure that builtin mempcpy and stpcpy perform correctly.
5 Written by Jakub Jelinek, 21/05/2003. */
7 extern void abort (void);
8 typedef __SIZE_TYPE__ size_t;
9 extern void *mempcpy (void *, const void *, size_t);
10 extern int memcmp (const void *, const void *, size_t);
11 extern char *stpcpy (char *, const char *);
12 extern int inside_main;
14 long buf1[64];
15 char *buf2 = (char *) (buf1 + 32);
16 long buf5[20];
17 char buf7[20];
19 int
20 __attribute__((noinline))
21 test (long *buf3, char *buf4, char *buf6, int n)
23 int i = 0;
25 /* These should probably be handled by store_by_pieces on most arches. */
26 if (mempcpy (buf1, "ABCDEFGHI", 9) != (char *) buf1 + 9
27 || memcmp (buf1, "ABCDEFGHI\0", 11))
28 abort ();
30 if (mempcpy (buf1, "abcdefghijklmnopq", 17) != (char *) buf1 + 17
31 || memcmp (buf1, "abcdefghijklmnopq\0", 19))
32 abort ();
34 if (__builtin_mempcpy (buf3, "ABCDEF", 6) != (char *) buf1 + 6
35 || memcmp (buf1, "ABCDEFghijklmnopq\0", 19))
36 abort ();
38 if (__builtin_mempcpy (buf3, "a", 1) != (char *) buf1 + 1
39 || memcmp (buf1, "aBCDEFghijklmnopq\0", 19))
40 abort ();
42 if (mempcpy ((char *) buf3 + 2, "bcd" + ++i, 2) != (char *) buf1 + 4
43 || memcmp (buf1, "aBcdEFghijklmnopq\0", 19)
44 || i != 1)
45 abort ();
47 /* These should probably be handled by move_by_pieces on most arches. */
48 if (mempcpy ((char *) buf3 + 4, buf5, 6) != (char *) buf1 + 10
49 || memcmp (buf1, "aBcdRSTUVWklmnopq\0", 19))
50 abort ();
52 if (__builtin_mempcpy ((char *) buf1 + ++i + 8, (char *) buf5 + 1, 1)
53 != (char *) buf1 + 11
54 || memcmp (buf1, "aBcdRSTUVWSlmnopq\0", 19)
55 || i != 2)
56 abort ();
58 if (mempcpy ((char *) buf3 + 14, buf6, 2) != (char *) buf1 + 16
59 || memcmp (buf1, "aBcdRSTUVWSlmnrsq\0", 19))
60 abort ();
62 if (mempcpy (buf3, buf5, 8) != (char *) buf1 + 8
63 || memcmp (buf1, "RSTUVWXYVWSlmnrsq\0", 19))
64 abort ();
66 if (mempcpy (buf3, buf5, 17) != (char *) buf1 + 17
67 || memcmp (buf1, "RSTUVWXYZ01234567\0", 19))
68 abort ();
70 __builtin_memcpy (buf3, "aBcdEFghijklmnopq\0", 19);
72 /* These should be handled either by movstrendM or mempcpy
73 call. */
74 if (mempcpy ((char *) buf3 + 4, buf5, n + 6) != (char *) buf1 + 10
75 || memcmp (buf1, "aBcdRSTUVWklmnopq\0", 19))
76 abort ();
78 if (__builtin_mempcpy ((char *) buf1 + ++i + 8, (char *) buf5 + 1, n + 1)
79 != (char *) buf1 + 12
80 || memcmp (buf1, "aBcdRSTUVWkSmnopq\0", 19)
81 || i != 3)
82 abort ();
84 if (mempcpy ((char *) buf3 + 14, buf6, n + 2) != (char *) buf1 + 16
85 || memcmp (buf1, "aBcdRSTUVWkSmnrsq\0", 19))
86 abort ();
88 i = 1;
90 /* These might be handled by store_by_pieces. */
91 if (mempcpy (buf2, "ABCDEFGHI", 9) != buf2 + 9
92 || memcmp (buf2, "ABCDEFGHI\0", 11))
93 abort ();
95 if (mempcpy (buf2, "abcdefghijklmnopq", 17) != buf2 + 17
96 || memcmp (buf2, "abcdefghijklmnopq\0", 19))
97 abort ();
99 if (__builtin_mempcpy (buf4, "ABCDEF", 6) != buf2 + 6
100 || memcmp (buf2, "ABCDEFghijklmnopq\0", 19))
101 abort ();
103 if (__builtin_mempcpy (buf4, "a", 1) != buf2 + 1
104 || memcmp (buf2, "aBCDEFghijklmnopq\0", 19))
105 abort ();
107 if (mempcpy (buf4 + 2, "bcd" + i++, 2) != buf2 + 4
108 || memcmp (buf2, "aBcdEFghijklmnopq\0", 19)
109 || i != 2)
110 abort ();
112 /* These might be handled by move_by_pieces. */
113 if (mempcpy (buf4 + 4, buf7, 6) != buf2 + 10
114 || memcmp (buf2, "aBcdRSTUVWklmnopq\0", 19))
115 abort ();
117 if (__builtin_mempcpy (buf2 + i++ + 8, buf7 + 1, 1)
118 != buf2 + 11
119 || memcmp (buf2, "aBcdRSTUVWSlmnopq\0", 19)
120 || i != 3)
121 abort ();
123 if (mempcpy (buf4 + 14, buf6, 2) != buf2 + 16
124 || memcmp (buf2, "aBcdRSTUVWSlmnrsq\0", 19))
125 abort ();
127 __builtin_memcpy (buf4, "aBcdEFghijklmnopq\0", 19);
129 /* These should be handled either by movstrendM or mempcpy
130 call. */
131 if (mempcpy (buf4 + 4, buf7, n + 6) != buf2 + 10
132 || memcmp (buf2, "aBcdRSTUVWklmnopq\0", 19))
133 abort ();
135 if (__builtin_mempcpy (buf2 + i++ + 8, buf7 + 1, n + 1)
136 != buf2 + 12
137 || memcmp (buf2, "aBcdRSTUVWkSmnopq\0", 19)
138 || i != 4)
139 abort ();
141 if (mempcpy (buf4 + 14, buf6, n + 2) != buf2 + 16
142 || memcmp (buf2, "aBcdRSTUVWkSmnrsq\0", 19))
143 abort ();
145 /* Now stpcpy tests. */
146 if (stpcpy ((char *) buf3, "abcdefghijklmnop") != (char *) buf1 + 16
147 || memcmp (buf1, "abcdefghijklmnop", 17))
148 abort ();
150 if (__builtin_stpcpy ((char *) buf3, "ABCDEFG") != (char *) buf1 + 7
151 || memcmp (buf1, "ABCDEFG\0ijklmnop", 17))
152 abort ();
154 if (stpcpy ((char *) buf3 + i++, "x") != (char *) buf1 + 5
155 || memcmp (buf1, "ABCDx\0G\0ijklmnop", 17))
156 abort ();
158 return 0;
161 void
162 main_test (void)
164 /* All these tests are allowed to call mempcpy/stpcpy. */
165 inside_main = 0;
166 __builtin_memcpy (buf5, "RSTUVWXYZ0123456789", 20);
167 __builtin_memcpy (buf7, "RSTUVWXYZ0123456789", 20);
168 test (buf1, buf2, "rstuvwxyz", 0);