1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// <string>
10
11// int compare(size_type pos1, size_type n1, const basic_string& str) const; // constexpr since C++20
12
13#include <string>
14#include <stdexcept>
15#include <cassert>
16
17#include "test_macros.h"
18#include "min_allocator.h"
19
20TEST_CONSTEXPR_CXX20 int sign(int x) {
21 if (x == 0)
22 return 0;
23 if (x < 0)
24 return -1;
25 return 1;
26}
27
28template <class S>
29TEST_CONSTEXPR_CXX20 void test(const S& s, typename S::size_type pos1, typename S::size_type n1, const S& str, int x) {
30 if (pos1 <= s.size())
31 assert(sign(s.compare(pos1, n1, str)) == sign(x));
32#ifndef TEST_HAS_NO_EXCEPTIONS
33 else if (!TEST_IS_CONSTANT_EVALUATED) {
34 try {
35 TEST_IGNORE_NODISCARD s.compare(pos1, n1, str);
36 assert(false);
37 } catch (std::out_of_range&) {
38 assert(pos1 > s.size());
39 }
40 }
41#endif
42}
43
44template <class S>
45TEST_CONSTEXPR_CXX20 bool test0() {
46 test(S(""), 0, 0, S(""), 0);
47 test(S(""), 0, 0, S("abcde"), -5);
48 test(S(""), 0, 0, S("abcdefghij"), -10);
49 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), -20);
50 test(S(""), 0, 1, S(""), 0);
51 test(S(""), 0, 1, S("abcde"), -5);
52 test(S(""), 0, 1, S("abcdefghij"), -10);
53 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), -20);
54 test(S(""), 1, 0, S(""), 0);
55 test(S(""), 1, 0, S("abcde"), 0);
56 test(S(""), 1, 0, S("abcdefghij"), 0);
57 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0);
58 test(S("abcde"), 0, 0, S(""), 0);
59 test(S("abcde"), 0, 0, S("abcde"), -5);
60 test(S("abcde"), 0, 0, S("abcdefghij"), -10);
61 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), -20);
62 test(S("abcde"), 0, 1, S(""), 1);
63 test(S("abcde"), 0, 1, S("abcde"), -4);
64 test(S("abcde"), 0, 1, S("abcdefghij"), -9);
65 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), -19);
66 test(S("abcde"), 0, 2, S(""), 2);
67 test(S("abcde"), 0, 2, S("abcde"), -3);
68 test(S("abcde"), 0, 2, S("abcdefghij"), -8);
69 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), -18);
70 test(S("abcde"), 0, 4, S(""), 4);
71 test(S("abcde"), 0, 4, S("abcde"), -1);
72 test(S("abcde"), 0, 4, S("abcdefghij"), -6);
73 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), -16);
74 test(S("abcde"), 0, 5, S(""), 5);
75 test(S("abcde"), 0, 5, S("abcde"), 0);
76 test(S("abcde"), 0, 5, S("abcdefghij"), -5);
77 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), -15);
78 test(S("abcde"), 0, 6, S(""), 5);
79 test(S("abcde"), 0, 6, S("abcde"), 0);
80 test(S("abcde"), 0, 6, S("abcdefghij"), -5);
81 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), -15);
82 test(S("abcde"), 1, 0, S(""), 0);
83 test(S("abcde"), 1, 0, S("abcde"), -5);
84 test(S("abcde"), 1, 0, S("abcdefghij"), -10);
85 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), -20);
86 test(S("abcde"), 1, 1, S(""), 1);
87 test(S("abcde"), 1, 1, S("abcde"), 1);
88 test(S("abcde"), 1, 1, S("abcdefghij"), 1);
89 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1);
90 test(S("abcde"), 1, 2, S(""), 2);
91 test(S("abcde"), 1, 2, S("abcde"), 1);
92 test(S("abcde"), 1, 2, S("abcdefghij"), 1);
93 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1);
94 test(S("abcde"), 1, 3, S(""), 3);
95 test(S("abcde"), 1, 3, S("abcde"), 1);
96 test(S("abcde"), 1, 3, S("abcdefghij"), 1);
97 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1);
98 test(S("abcde"), 1, 4, S(""), 4);
99 test(S("abcde"), 1, 4, S("abcde"), 1);
100 test(S("abcde"), 1, 4, S("abcdefghij"), 1);
101 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1);
102 test(S("abcde"), 1, 5, S(""), 4);
103 test(S("abcde"), 1, 5, S("abcde"), 1);
104 test(S("abcde"), 1, 5, S("abcdefghij"), 1);
105 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1);
106 test(S("abcde"), 2, 0, S(""), 0);
107 test(S("abcde"), 2, 0, S("abcde"), -5);
108 test(S("abcde"), 2, 0, S("abcdefghij"), -10);
109 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), -20);
110 test(S("abcde"), 2, 1, S(""), 1);
111 test(S("abcde"), 2, 1, S("abcde"), 2);
112 test(S("abcde"), 2, 1, S("abcdefghij"), 2);
113 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 2);
114 test(S("abcde"), 2, 2, S(""), 2);
115 test(S("abcde"), 2, 2, S("abcde"), 2);
116 test(S("abcde"), 2, 2, S("abcdefghij"), 2);
117 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 2);
118 test(S("abcde"), 2, 3, S(""), 3);
119 test(S("abcde"), 2, 3, S("abcde"), 2);
120 test(S("abcde"), 2, 3, S("abcdefghij"), 2);
121 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 2);
122 test(S("abcde"), 2, 4, S(""), 3);
123 test(S("abcde"), 2, 4, S("abcde"), 2);
124 test(S("abcde"), 2, 4, S("abcdefghij"), 2);
125 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 2);
126 test(S("abcde"), 4, 0, S(""), 0);
127 test(S("abcde"), 4, 0, S("abcde"), -5);
128 test(S("abcde"), 4, 0, S("abcdefghij"), -10);
129 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), -20);
130 test(S("abcde"), 4, 1, S(""), 1);
131 test(S("abcde"), 4, 1, S("abcde"), 4);
132 test(S("abcde"), 4, 1, S("abcdefghij"), 4);
133 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 4);
134 test(S("abcde"), 4, 2, S(""), 1);
135 test(S("abcde"), 4, 2, S("abcde"), 4);
136 test(S("abcde"), 4, 2, S("abcdefghij"), 4);
137 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 4);
138 test(S("abcde"), 5, 0, S(""), 0);
139 test(S("abcde"), 5, 0, S("abcde"), -5);
140 test(S("abcde"), 5, 0, S("abcdefghij"), -10);
141 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), -20);
142 test(S("abcde"), 5, 1, S(""), 0);
143 test(S("abcde"), 5, 1, S("abcde"), -5);
144 test(S("abcde"), 5, 1, S("abcdefghij"), -10);
145 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), -20);
146 return true;
147}
148
149template <class S>
150TEST_CONSTEXPR_CXX20 bool test1() {
151 test(S("abcde"), 6, 0, S(""), 0);
152 test(S("abcde"), 6, 0, S("abcde"), 0);
153 test(S("abcde"), 6, 0, S("abcdefghij"), 0);
154 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0);
155 test(S("abcdefghij"), 0, 0, S(""), 0);
156 test(S("abcdefghij"), 0, 0, S("abcde"), -5);
157 test(S("abcdefghij"), 0, 0, S("abcdefghij"), -10);
158 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), -20);
159 test(S("abcdefghij"), 0, 1, S(""), 1);
160 test(S("abcdefghij"), 0, 1, S("abcde"), -4);
161 test(S("abcdefghij"), 0, 1, S("abcdefghij"), -9);
162 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), -19);
163 test(S("abcdefghij"), 0, 5, S(""), 5);
164 test(S("abcdefghij"), 0, 5, S("abcde"), 0);
165 test(S("abcdefghij"), 0, 5, S("abcdefghij"), -5);
166 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), -15);
167 test(S("abcdefghij"), 0, 9, S(""), 9);
168 test(S("abcdefghij"), 0, 9, S("abcde"), 4);
169 test(S("abcdefghij"), 0, 9, S("abcdefghij"), -1);
170 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), -11);
171 test(S("abcdefghij"), 0, 10, S(""), 10);
172 test(S("abcdefghij"), 0, 10, S("abcde"), 5);
173 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0);
174 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), -10);
175 test(S("abcdefghij"), 0, 11, S(""), 10);
176 test(S("abcdefghij"), 0, 11, S("abcde"), 5);
177 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0);
178 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), -10);
179 test(S("abcdefghij"), 1, 0, S(""), 0);
180 test(S("abcdefghij"), 1, 0, S("abcde"), -5);
181 test(S("abcdefghij"), 1, 0, S("abcdefghij"), -10);
182 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), -20);
183 test(S("abcdefghij"), 1, 1, S(""), 1);
184 test(S("abcdefghij"), 1, 1, S("abcde"), 1);
185 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1);
186 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1);
187 test(S("abcdefghij"), 1, 4, S(""), 4);
188 test(S("abcdefghij"), 1, 4, S("abcde"), 1);
189 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1);
190 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1);
191 test(S("abcdefghij"), 1, 8, S(""), 8);
192 test(S("abcdefghij"), 1, 8, S("abcde"), 1);
193 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1);
194 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1);
195 test(S("abcdefghij"), 1, 9, S(""), 9);
196 test(S("abcdefghij"), 1, 9, S("abcde"), 1);
197 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1);
198 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1);
199 test(S("abcdefghij"), 1, 10, S(""), 9);
200 test(S("abcdefghij"), 1, 10, S("abcde"), 1);
201 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1);
202 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1);
203 test(S("abcdefghij"), 5, 0, S(""), 0);
204 test(S("abcdefghij"), 5, 0, S("abcde"), -5);
205 test(S("abcdefghij"), 5, 0, S("abcdefghij"), -10);
206 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), -20);
207 test(S("abcdefghij"), 5, 1, S(""), 1);
208 test(S("abcdefghij"), 5, 1, S("abcde"), 5);
209 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5);
210 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 5);
211 test(S("abcdefghij"), 5, 2, S(""), 2);
212 test(S("abcdefghij"), 5, 2, S("abcde"), 5);
213 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5);
214 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 5);
215 test(S("abcdefghij"), 5, 4, S(""), 4);
216 test(S("abcdefghij"), 5, 4, S("abcde"), 5);
217 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5);
218 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 5);
219 test(S("abcdefghij"), 5, 5, S(""), 5);
220 test(S("abcdefghij"), 5, 5, S("abcde"), 5);
221 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5);
222 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 5);
223 test(S("abcdefghij"), 5, 6, S(""), 5);
224 test(S("abcdefghij"), 5, 6, S("abcde"), 5);
225 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5);
226 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 5);
227 test(S("abcdefghij"), 9, 0, S(""), 0);
228 test(S("abcdefghij"), 9, 0, S("abcde"), -5);
229 test(S("abcdefghij"), 9, 0, S("abcdefghij"), -10);
230 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), -20);
231 test(S("abcdefghij"), 9, 1, S(""), 1);
232 test(S("abcdefghij"), 9, 1, S("abcde"), 9);
233 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9);
234 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 9);
235 test(S("abcdefghij"), 9, 2, S(""), 1);
236 test(S("abcdefghij"), 9, 2, S("abcde"), 9);
237 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9);
238 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 9);
239 test(S("abcdefghij"), 10, 0, S(""), 0);
240 test(S("abcdefghij"), 10, 0, S("abcde"), -5);
241 test(S("abcdefghij"), 10, 0, S("abcdefghij"), -10);
242 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), -20);
243 test(S("abcdefghij"), 10, 1, S(""), 0);
244 test(S("abcdefghij"), 10, 1, S("abcde"), -5);
245 test(S("abcdefghij"), 10, 1, S("abcdefghij"), -10);
246 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), -20);
247 test(S("abcdefghij"), 11, 0, S(""), 0);
248 test(S("abcdefghij"), 11, 0, S("abcde"), 0);
249 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0);
250 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0);
251 return true;
252}
253
254template <class S>
255TEST_CONSTEXPR_CXX20 bool test2() {
256 test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 0);
257 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), -5);
258 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), -10);
259 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), -20);
260 test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 1);
261 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), -4);
262 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), -9);
263 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), -19);
264 test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 10);
265 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 5);
266 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0);
267 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), -10);
268 test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 19);
269 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 14);
270 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9);
271 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), -1);
272 test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 20);
273 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 15);
274 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 10);
275 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0);
276 test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 20);
277 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 15);
278 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 10);
279 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0);
280 test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 0);
281 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), -5);
282 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), -10);
283 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), -20);
284 test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 1);
285 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1);
286 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1);
287 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1);
288 test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 9);
289 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1);
290 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1);
291 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1);
292 test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 18);
293 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1);
294 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1);
295 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1);
296 test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 19);
297 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1);
298 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1);
299 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1);
300 test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 19);
301 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1);
302 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1);
303 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1);
304 test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 0);
305 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), -5);
306 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), -10);
307 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), -20);
308 test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 1);
309 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 10);
310 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 10);
311 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10);
312 test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 5);
313 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 10);
314 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 10);
315 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10);
316 test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 9);
317 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 10);
318 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 10);
319 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10);
320 test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 10);
321 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 10);
322 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 10);
323 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10);
324 test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 10);
325 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 10);
326 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 10);
327 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10);
328 test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 0);
329 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), -5);
330 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), -10);
331 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), -20);
332 test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 1);
333 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 19);
334 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 19);
335 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19);
336 test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 1);
337 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 19);
338 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 19);
339 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19);
340 test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 0);
341 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), -5);
342 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), -10);
343 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), -20);
344 test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 0);
345 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), -5);
346 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), -10);
347 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), -20);
348 test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 0);
349 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0);
350 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0);
351 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0);
352 return true;
353}
354
355template <class S>
356void test() {
357 test0<S>();
358 test1<S>();
359 test2<S>();
360
361#if TEST_STD_VER > 17
362 static_assert(test0<S>());
363 static_assert(test1<S>());
364 static_assert(test2<S>());
365#endif
366}
367
368int main(int, char**) {
369 test<std::string>();
370#if TEST_STD_VER >= 11
371 test<std::basic_string<char, std::char_traits<char>, min_allocator<char> > >();
372 { // LWG 2946
373 std::string s = " !";
374 assert(s.compare(0, 1, {"abc", 1}) < 0);
375 }
376#endif
377
378 return 0;
379}
380

source code of libcxx/test/std/strings/basic.string/string.ops/string_compare/size_size_string.pass.cpp