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