1 // Copyright (C) 2018-2020 Free Software Foundation, Inc.
2 //
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
7 // any later version.
8
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
17
18 // { dg-options "-std=gnu++2a" }
19 // { dg-do run { target c++2a } }
20
21 #include <regex>
22 #include <testsuite_hooks.h>
23 #include <testsuite_iterators.h>
24
25 using __gnu_test::test_container;
26 using __gnu_test::bidirectional_iterator_wrapper;
27
28 template<typename C> struct traits : std::char_traits<C> { };
29
30 void
test01()31 test01()
32 {
33 const std::basic_string<char, traits<char>> s0, s1 = "1";
34 const std::ssub_match sm, sm2;
35
36 VERIFY( sm.compare(sm) == 0 );
37 VERIFY( sm.compare(sm2) == 0 );
38 VERIFY( sm.compare(sm.str()) == 0 );
39 VERIFY( sm.compare(sm.str().c_str()) == 0 );
40 VERIFY( sm.compare(sm2.str()) == 0 );
41 VERIFY( sm.compare(sm2.str().c_str()) == 0 );
42 VERIFY( sm.compare(std::string(s1.c_str())) == -1 );
43 VERIFY( sm.compare(s1.c_str()) == -1 );
44
45
46 VERIFY( sm == sm2 );
47 VERIFY( !(sm != sm2) );
48 VERIFY( !(sm < sm2) );
49 VERIFY( !(sm > sm2) );
50 VERIFY( sm <= sm2 );
51 VERIFY( sm >= sm2 );
52 VERIFY( std::is_eq(sm <=> sm2) );
53
54 VERIFY( sm == s0 );
55 VERIFY( !(sm != s0) );
56 VERIFY( !(sm < s0) );
57 VERIFY( !(sm > s0) );
58 VERIFY( sm <= s0 );
59 VERIFY( sm >= s0 );
60 VERIFY( std::is_eq(sm <=> s0) );
61
62 VERIFY( s0 == sm );
63 VERIFY( !(s0 != sm) );
64 VERIFY( !(s0 < sm) );
65 VERIFY( !(s0 > sm) );
66 VERIFY( s0 <= sm );
67 VERIFY( s0 >= sm );
68 VERIFY( std::is_eq(s0 <=> sm) );
69
70 VERIFY( sm == s0.c_str() );
71 VERIFY( !(sm != s0.c_str()) );
72 VERIFY( !(sm < s0.c_str()) );
73 VERIFY( !(sm > s0.c_str()) );
74 VERIFY( sm <= s0.c_str() );
75 VERIFY( sm >= s0.c_str() );
76 VERIFY( std::is_eq(sm <=> s0.c_str()) );
77
78 VERIFY( s0.c_str() == sm );
79 VERIFY( !(s0.c_str() != sm) );
80 VERIFY( !(s0.c_str() < sm) );
81 VERIFY( !(s0.c_str() > sm) );
82 VERIFY( s0.c_str() <= sm );
83 VERIFY( s0.c_str() >= sm );
84 VERIFY( std::is_eq(s0.c_str() <=> sm) );
85
86 VERIFY( !(sm == s1) );
87 VERIFY( sm != s1 );
88 VERIFY( sm < s1 );
89 VERIFY( !(sm > s1) );
90 VERIFY( sm <= s1 );
91 VERIFY( !(sm >= s1) );
92 VERIFY( std::is_lt(sm <=> s1) );
93
94 VERIFY( !(sm == s1.c_str()) );
95 VERIFY( sm != s1.c_str() );
96 VERIFY( sm < s1.c_str() );
97 VERIFY( !(sm > s1.c_str()) );
98 VERIFY( sm <= s1.c_str() );
99 VERIFY( !(sm >= s1.c_str()) );
100 VERIFY( std::is_lt(sm <=> s1.c_str()) );
101
102 VERIFY( !(s1.c_str() == sm) );
103 VERIFY( s1.c_str() != sm );
104 VERIFY( !(s1.c_str() < sm) );
105 VERIFY( s1.c_str() > sm );
106 VERIFY( !(s1.c_str() <= sm) );
107 VERIFY( s1.c_str() >= sm );
108 VERIFY( std::is_gt(s1.c_str() <=> sm) );
109
110 VERIFY( !(sm == s1[0]) );
111 VERIFY( sm != s1[0] );
112 VERIFY( sm < s1[0] );
113 VERIFY( !(sm > s1[0]) );
114 VERIFY( sm <= s1[0] );
115 VERIFY( !(sm >= s1[0]) );
116 VERIFY( std::is_lt(sm <=> s1[0]) );
117
118 VERIFY( !(s1[0] == sm) );
119 VERIFY( s1[0] != sm );
120 VERIFY( !(s1[0] < sm) );
121 VERIFY( s1[0] > sm );
122 VERIFY( !(s1[0] <= sm) );
123 VERIFY( s1[0] >= sm );
124 VERIFY( std::is_gt(s1[0] <=> sm) );
125 }
126
127 void
test02()128 test02()
129 {
130 const std::basic_string<char, traits<char>> s0, s1 = "1";
131 std::csub_match sm;
132 const std::csub_match sm2;
133 const char c[] = "1";
134 sm.matched = true;
135 sm.first = c;
136 sm.second = c+1;
137
138 VERIFY( sm.compare(sm) == 0 );
139 VERIFY( sm.compare(sm2) == 1 );
140 VERIFY( sm.compare(sm.str()) == 0 );
141 VERIFY( sm.compare(sm.str().c_str()) == 0 );
142 VERIFY( sm.compare(sm2.str()) == 1 );
143 VERIFY( sm.compare(sm2.str().c_str()) == 1 );
144 VERIFY( sm.compare(std::string(s1.c_str())) == 0 );
145 VERIFY( sm.compare(s1.c_str()) == 0 );
146
147 VERIFY( !(sm == sm2) );
148 VERIFY( sm != sm2 );
149 VERIFY( !(sm < sm2) );
150 VERIFY( sm > sm2 );
151 VERIFY( !(sm <= sm2) );
152 VERIFY( sm >= sm2 );
153 VERIFY( std::is_gt(sm <=> sm2) );
154
155 VERIFY( !(sm2 == sm) );
156 VERIFY( sm2 != sm );
157 VERIFY( sm2 < sm );
158 VERIFY( !(sm2 > sm) );
159 VERIFY( sm2 <= sm );
160 VERIFY( !(sm2 >= sm) );
161 VERIFY( std::is_lt(sm2 <=> sm) );
162
163 VERIFY( !(sm == s0) );
164 VERIFY( sm != s0 );
165 VERIFY( !(sm < s0) );
166 VERIFY( sm > s0 );
167 VERIFY( !(sm <= s0) );
168 VERIFY( sm >= s0 );
169 VERIFY( std::is_gt(sm <=> s0) );
170
171 VERIFY( !(sm == s0.c_str()) );
172 VERIFY( sm != s0.c_str() );
173 VERIFY( !(sm < s0.c_str()) );
174 VERIFY( sm > s0.c_str() );
175 VERIFY( !(sm <= s0.c_str()) );
176 VERIFY( sm >= s0.c_str() );
177 VERIFY( std::is_gt(sm <=> s0.c_str()) );
178
179 VERIFY( !(s0.c_str() == sm) );
180 VERIFY( s0.c_str() != sm );
181 VERIFY( s0.c_str() < sm );
182 VERIFY( !(s0.c_str() > sm) );
183 VERIFY( s0.c_str() <= sm );
184 VERIFY( !(s0.c_str() >= sm) );
185 VERIFY( std::is_lt(s0.c_str() <=> sm) );
186
187 VERIFY( s1 == sm );
188 VERIFY( !(s1 != sm) );
189 VERIFY( !(s1 < sm) );
190 VERIFY( !(s1 > sm) );
191 VERIFY( s1 <= sm );
192 VERIFY( s1 >= sm );
193 VERIFY( std::is_eq(s1 <=> sm) );
194
195 VERIFY( sm == s1.c_str() );
196 VERIFY( !(sm != s1.c_str()) );
197 VERIFY( !(sm < s1.c_str()) );
198 VERIFY( !(sm > s1.c_str()) );
199 VERIFY( sm <= s1.c_str() );
200 VERIFY( sm >= s1.c_str() );
201 VERIFY( std::is_eq(sm <=> s1.c_str()) );
202
203 VERIFY( s1.c_str() == sm );
204 VERIFY( !(s1.c_str() != sm) );
205 VERIFY( !(s1.c_str() < sm) );
206 VERIFY( !(s1.c_str() > sm) );
207 VERIFY( s1.c_str() <= sm );
208 VERIFY( s1.c_str() >= sm );
209 VERIFY( std::is_eq(s1.c_str() <=> sm) );
210
211 VERIFY( sm == s1[0] );
212 VERIFY( !(sm != s1[0]) );
213 VERIFY( !(sm < s1[0]) );
214 VERIFY( !(sm > s1[0]) );
215 VERIFY( sm <= s1[0] );
216 VERIFY( sm >= s1[0] );
217 VERIFY( std::is_eq(sm <=> s1[0]) );
218
219 VERIFY( s1[0] == sm );
220 VERIFY( !(s1[0] != sm) );
221 VERIFY( !(s1[0] < sm) );
222 VERIFY( !(s1[0] > sm) );
223 VERIFY( s1[0] <= sm );
224 VERIFY( s1[0] >= sm );
225 VERIFY( std::is_eq(s1[0] <=> sm) );
226 }
227
228 void
test03()229 test03()
230 {
231 const std::basic_string<char, traits<char>> s0, s1 = "1";
232 const char c[] = "1";
233 test_container<const char, bidirectional_iterator_wrapper> tc(c, c+1);
234 std::sub_match<bidirectional_iterator_wrapper<const char>> sm;
235 const std::sub_match<bidirectional_iterator_wrapper<const char>> sm2;
236 sm.matched = true;
237 sm.first = tc.begin();
238 sm.second = tc.end();
239
240 VERIFY( sm.compare(sm) == 0 );
241 VERIFY( sm.compare(sm2) == 1 );
242 VERIFY( sm.compare(sm.str()) == 0 );
243 VERIFY( sm.compare(sm.str().c_str()) == 0 );
244 VERIFY( sm.compare(sm2.str()) == 1 );
245 VERIFY( sm.compare(sm2.str().c_str()) == 1 );
246 VERIFY( sm.compare(std::string(s1.c_str())) == 0 );
247 VERIFY( sm.compare(s1.c_str()) == 0 );
248
249 VERIFY( !(sm == sm2) );
250 VERIFY( sm != sm2 );
251 VERIFY( !(sm < sm2) );
252 VERIFY( sm > sm2 );
253 VERIFY( !(sm <= sm2) );
254 VERIFY( sm >= sm2 );
255 VERIFY( std::is_gt(sm <=> sm2) );
256
257 VERIFY( !(sm2 == sm) );
258 VERIFY( sm2 != sm );
259 VERIFY( sm2 < sm );
260 VERIFY( !(sm2 > sm) );
261 VERIFY( sm2 <= sm );
262 VERIFY( !(sm2 >= sm) );
263 VERIFY( std::is_lt(sm2 <=> sm) );
264
265 VERIFY( !(sm == s0) );
266 VERIFY( sm != s0 );
267 VERIFY( !(sm < s0) );
268 VERIFY( sm > s0 );
269 VERIFY( !(sm <= s0) );
270 VERIFY( sm >= s0 );
271 VERIFY( std::is_gt(sm <=> s0) );
272
273 VERIFY( !(sm == s0.c_str()) );
274 VERIFY( sm != s0.c_str() );
275 VERIFY( !(sm < s0.c_str()) );
276 VERIFY( sm > s0.c_str() );
277 VERIFY( !(sm <= s0.c_str()) );
278 VERIFY( sm >= s0.c_str() );
279 VERIFY( std::is_gt(sm <=> s0.c_str()) );
280
281 VERIFY( !(s0.c_str() == sm) );
282 VERIFY( s0.c_str() != sm );
283 VERIFY( s0.c_str() < sm );
284 VERIFY( !(s0.c_str() > sm) );
285 VERIFY( s0.c_str() <= sm );
286 VERIFY( !(s0.c_str() >= sm) );
287 VERIFY( std::is_lt(s0.c_str() <=> sm) );
288
289 VERIFY( s1 == sm );
290 VERIFY( !(s1 != sm) );
291 VERIFY( !(s1 < sm) );
292 VERIFY( !(s1 > sm) );
293 VERIFY( s1 <= sm );
294 VERIFY( s1 >= sm );
295 VERIFY( std::is_eq(s1 <=> sm) );
296
297 VERIFY( sm == s1.c_str() );
298 VERIFY( !(sm != s1.c_str()) );
299 VERIFY( !(sm < s1.c_str()) );
300 VERIFY( !(sm > s1.c_str()) );
301 VERIFY( sm <= s1.c_str() );
302 VERIFY( sm >= s1.c_str() );
303 VERIFY( std::is_eq(sm <=> s1.c_str()) );
304
305 VERIFY( s1.c_str() == sm );
306 VERIFY( !(s1.c_str() != sm) );
307 VERIFY( !(s1.c_str() < sm) );
308 VERIFY( !(s1.c_str() > sm) );
309 VERIFY( s1.c_str() <= sm );
310 VERIFY( s1.c_str() >= sm );
311 VERIFY( std::is_eq(s1.c_str() <=> sm) );
312
313 VERIFY( sm == s1[0] );
314 VERIFY( !(sm != s1[0]) );
315 VERIFY( !(sm < s1[0]) );
316 VERIFY( !(sm > s1[0]) );
317 VERIFY( sm <= s1[0] );
318 VERIFY( sm >= s1[0] );
319 VERIFY( std::is_eq(sm <=> s1[0]) );
320
321 VERIFY( s1[0] == sm );
322 VERIFY( !(s1[0] != sm) );
323 VERIFY( !(s1[0] < sm) );
324 VERIFY( !(s1[0] > sm) );
325 VERIFY( s1[0] <= sm );
326 VERIFY( s1[0] >= sm );
327 VERIFY( std::is_eq(s1[0] <=> sm) );
328 }
329
main()330 int main()
331 {
332 test01();
333 test02();
334 test03();
335 }
336