]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/18_support/comparisons/algorithms/strong_order.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 18_support / comparisons / algorithms / strong_order.cc
1 // Copyright (C) 2019-2022 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 compile { target c++2a } }
20
21 #include <compare>
22 #include <limits>
23
24 using std::strong_order;
25 using std::strong_ordering;
26
27 static_assert( strong_order(1, 2) == strong_ordering::less );
28 static_assert( strong_order(1, 1) == strong_ordering::equal );
29 static_assert( strong_order(2, 1) == strong_ordering::greater );
30 static_assert( noexcept(strong_order(1, 1)) );
31
32 constexpr strong_ordering different_cv_quals(int i, const int j)
33 {
34 return strong_order(i, j);
35 }
36 static_assert( different_cv_quals(42, 999) == strong_ordering::less );
37 static_assert( different_cv_quals(-999, -999) == strong_ordering::equal );
38 static_assert( different_cv_quals(-99, -111) == strong_ordering::greater );
39
40 namespace N
41 {
42 struct X { int i; };
43
44 constexpr strong_ordering operator<=>(X l, X r)
45 {
46 if (l.i < 0 && r.i < 0)
47 return strong_ordering::equivalent;
48 return r.i <=> l.i;
49 }
50
51 constexpr bool operator==(X l, X r) { return std::is_eq(l <=> r); }
52
53 static_assert(std::three_way_comparable<X>);
54 }
55 using N::X;
56
57 static_assert( strong_order(X{1}, X{1}) == strong_ordering::equal );
58 static_assert( strong_order(X{-1}, X{-2}) == strong_ordering::equivalent );
59 static_assert( strong_order(X{1}, X{2}) == strong_ordering::greater );
60 static_assert( !noexcept(strong_order(X{1}, X{2})) );