10913ca19SEric Fiselier //===----------------------------------------------------------------------===//
20913ca19SEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60913ca19SEric Fiselier //
70913ca19SEric Fiselier //===----------------------------------------------------------------------===//
80913ca19SEric Fiselier
931cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
100913ca19SEric Fiselier
110913ca19SEric Fiselier // <compare>
120913ca19SEric Fiselier
130913ca19SEric Fiselier // class partial_ordering
140913ca19SEric Fiselier
150913ca19SEric Fiselier
160913ca19SEric Fiselier #include <compare>
170913ca19SEric Fiselier #include <type_traits>
180913ca19SEric Fiselier #include <cassert>
190913ca19SEric Fiselier
200913ca19SEric Fiselier #include "test_macros.h"
210913ca19SEric Fiselier
220913ca19SEric Fiselier const volatile void* volatile sink;
230913ca19SEric Fiselier
test_static_members()240913ca19SEric Fiselier void test_static_members() {
250913ca19SEric Fiselier DoNotOptimize(&std::partial_ordering::less);
260913ca19SEric Fiselier DoNotOptimize(&std::partial_ordering::equivalent);
270913ca19SEric Fiselier DoNotOptimize(&std::partial_ordering::greater);
280913ca19SEric Fiselier DoNotOptimize(&std::partial_ordering::unordered);
290913ca19SEric Fiselier }
300913ca19SEric Fiselier
test_signatures()310913ca19SEric Fiselier void test_signatures() {
320913ca19SEric Fiselier auto& Eq = std::partial_ordering::equivalent;
330913ca19SEric Fiselier
340913ca19SEric Fiselier ASSERT_NOEXCEPT(Eq == 0);
350913ca19SEric Fiselier ASSERT_NOEXCEPT(0 == Eq);
360913ca19SEric Fiselier ASSERT_NOEXCEPT(Eq != 0);
370913ca19SEric Fiselier ASSERT_NOEXCEPT(0 != Eq);
380913ca19SEric Fiselier ASSERT_NOEXCEPT(0 < Eq);
390913ca19SEric Fiselier ASSERT_NOEXCEPT(Eq < 0);
400913ca19SEric Fiselier ASSERT_NOEXCEPT(0 <= Eq);
410913ca19SEric Fiselier ASSERT_NOEXCEPT(Eq <= 0);
420913ca19SEric Fiselier ASSERT_NOEXCEPT(0 > Eq);
430913ca19SEric Fiselier ASSERT_NOEXCEPT(Eq > 0);
440913ca19SEric Fiselier ASSERT_NOEXCEPT(0 >= Eq);
450913ca19SEric Fiselier ASSERT_NOEXCEPT(Eq >= 0);
460913ca19SEric Fiselier #ifndef TEST_HAS_NO_SPACESHIP_OPERATOR
470913ca19SEric Fiselier ASSERT_NOEXCEPT(0 <=> Eq);
480913ca19SEric Fiselier ASSERT_NOEXCEPT(Eq <=> 0);
490913ca19SEric Fiselier ASSERT_SAME_TYPE(decltype(Eq <=> 0), std::partial_ordering);
500913ca19SEric Fiselier ASSERT_SAME_TYPE(decltype(0 <=> Eq), std::partial_ordering);
510913ca19SEric Fiselier #endif
520913ca19SEric Fiselier }
530913ca19SEric Fiselier
test_equality()54*46c17429SChristopher Di Bella constexpr void test_equality() {
55*46c17429SChristopher Di Bella #ifndef TEST_HAS_NO_SPACESHIP_OPERATOR
56*46c17429SChristopher Di Bella auto& PartialEq = std::partial_ordering::equivalent;
57*46c17429SChristopher Di Bella auto& WeakEq = std::weak_ordering::equivalent;
58*46c17429SChristopher Di Bella assert(PartialEq == WeakEq);
59*46c17429SChristopher Di Bella
60*46c17429SChristopher Di Bella auto& StrongEq = std::strong_ordering::equal;
61*46c17429SChristopher Di Bella assert(PartialEq == StrongEq);
62*46c17429SChristopher Di Bella #endif
63*46c17429SChristopher Di Bella }
64*46c17429SChristopher Di Bella
test_constexpr()650913ca19SEric Fiselier constexpr bool test_constexpr() {
660913ca19SEric Fiselier auto& Eq = std::partial_ordering::equivalent;
670913ca19SEric Fiselier auto& Less = std::partial_ordering::less;
680913ca19SEric Fiselier auto& Greater = std::partial_ordering::greater;
690913ca19SEric Fiselier auto& Unord = std::partial_ordering::unordered;
700913ca19SEric Fiselier struct {
710913ca19SEric Fiselier std::partial_ordering Value;
720913ca19SEric Fiselier bool ExpectEq;
730913ca19SEric Fiselier bool ExpectNeq;
740913ca19SEric Fiselier bool ExpectLess;
750913ca19SEric Fiselier bool ExpectGreater;
760913ca19SEric Fiselier } TestCases[] = {
770913ca19SEric Fiselier {Eq, true, false, false, false},
780913ca19SEric Fiselier {Less, false, true, true, false},
790913ca19SEric Fiselier {Greater, false, true, false, true},
800913ca19SEric Fiselier {Unord, false, true, false, false}
810913ca19SEric Fiselier };
820913ca19SEric Fiselier for (auto TC : TestCases) {
830913ca19SEric Fiselier auto V = TC.Value;
840913ca19SEric Fiselier assert((V == 0) == TC.ExpectEq);
850913ca19SEric Fiselier assert((0 == V) == TC.ExpectEq);
860913ca19SEric Fiselier assert((V != 0) == TC.ExpectNeq);
870913ca19SEric Fiselier assert((0 != V) == TC.ExpectNeq);
880913ca19SEric Fiselier
890913ca19SEric Fiselier assert((V < 0) == TC.ExpectLess);
900913ca19SEric Fiselier assert((V > 0) == TC.ExpectGreater);
910913ca19SEric Fiselier assert((V <= 0) == (TC.ExpectLess || TC.ExpectEq));
920913ca19SEric Fiselier assert((V >= 0) == (TC.ExpectGreater || TC.ExpectEq));
930913ca19SEric Fiselier
940913ca19SEric Fiselier assert((0 < V) == TC.ExpectGreater);
950913ca19SEric Fiselier assert((0 > V) == TC.ExpectLess);
960913ca19SEric Fiselier assert((0 <= V) == (TC.ExpectGreater || TC.ExpectEq));
970913ca19SEric Fiselier assert((0 >= V) == (TC.ExpectLess || TC.ExpectEq));
980913ca19SEric Fiselier }
990913ca19SEric Fiselier #ifndef TEST_HAS_NO_SPACESHIP_OPERATOR
1000913ca19SEric Fiselier {
1010913ca19SEric Fiselier std::partial_ordering res = (Eq <=> 0);
1020913ca19SEric Fiselier ((void)res);
1030913ca19SEric Fiselier res = (0 <=> Eq);
1040913ca19SEric Fiselier ((void)res);
1050913ca19SEric Fiselier }
1060913ca19SEric Fiselier enum ExpectRes {
1070913ca19SEric Fiselier ER_Greater,
1080913ca19SEric Fiselier ER_Less,
1090913ca19SEric Fiselier ER_Equiv,
1100913ca19SEric Fiselier ER_Unord
1110913ca19SEric Fiselier };
1120913ca19SEric Fiselier struct {
1130913ca19SEric Fiselier std::partial_ordering Value;
1140913ca19SEric Fiselier ExpectRes Expect;
1150913ca19SEric Fiselier } SpaceshipTestCases[] = {
1160913ca19SEric Fiselier {std::partial_ordering::equivalent, ER_Equiv},
1170913ca19SEric Fiselier {std::partial_ordering::less, ER_Less},
1180913ca19SEric Fiselier {std::partial_ordering::greater, ER_Greater},
1190913ca19SEric Fiselier {std::partial_ordering::unordered, ER_Unord}
1200913ca19SEric Fiselier };
1210913ca19SEric Fiselier for (auto TC : SpaceshipTestCases)
1220913ca19SEric Fiselier {
123dcaaa1baSCasey Carter std::partial_ordering Res = (TC.Value <=> 0);
1240913ca19SEric Fiselier switch (TC.Expect) {
1250913ca19SEric Fiselier case ER_Equiv:
1260913ca19SEric Fiselier assert(Res == 0);
1270913ca19SEric Fiselier assert(0 == Res);
1280913ca19SEric Fiselier break;
1290913ca19SEric Fiselier case ER_Less:
1300913ca19SEric Fiselier assert(Res < 0);
1310913ca19SEric Fiselier break;
1320913ca19SEric Fiselier case ER_Greater:
1330913ca19SEric Fiselier assert(Res > 0);
1340913ca19SEric Fiselier break;
1350913ca19SEric Fiselier case ER_Unord:
1360913ca19SEric Fiselier assert(Res != 0);
1370913ca19SEric Fiselier assert(0 != Res);
1380913ca19SEric Fiselier assert((Res < 0) == false);
1390913ca19SEric Fiselier assert((Res > 0) == false);
1400913ca19SEric Fiselier assert((Res == 0) == false);
1410913ca19SEric Fiselier break;
1420913ca19SEric Fiselier }
1430913ca19SEric Fiselier }
144ec789a41SChristopher Di Bella {
145ec789a41SChristopher Di Bella static_assert(std::partial_ordering::less == std::partial_ordering::less);
146ec789a41SChristopher Di Bella static_assert(std::partial_ordering::less !=
147ec789a41SChristopher Di Bella std::partial_ordering::equivalent);
148ec789a41SChristopher Di Bella static_assert(std::partial_ordering::less !=
149ec789a41SChristopher Di Bella std::partial_ordering::greater);
150ec789a41SChristopher Di Bella static_assert(std::partial_ordering::less !=
151ec789a41SChristopher Di Bella std::partial_ordering::unordered);
152ec789a41SChristopher Di Bella
153ec789a41SChristopher Di Bella static_assert(std::partial_ordering::equivalent !=
154ec789a41SChristopher Di Bella std::partial_ordering::less);
155ec789a41SChristopher Di Bella static_assert(std::partial_ordering::equivalent ==
156ec789a41SChristopher Di Bella std::partial_ordering::equivalent);
157ec789a41SChristopher Di Bella static_assert(std::partial_ordering::equivalent !=
158ec789a41SChristopher Di Bella std::partial_ordering::greater);
159ec789a41SChristopher Di Bella static_assert(std::partial_ordering::equivalent !=
160ec789a41SChristopher Di Bella std::partial_ordering::unordered);
161ec789a41SChristopher Di Bella
162ec789a41SChristopher Di Bella static_assert(std::partial_ordering::greater !=
163ec789a41SChristopher Di Bella std::partial_ordering::less);
164ec789a41SChristopher Di Bella static_assert(std::partial_ordering::greater !=
165ec789a41SChristopher Di Bella std::partial_ordering::equivalent);
166ec789a41SChristopher Di Bella static_assert(std::partial_ordering::greater ==
167ec789a41SChristopher Di Bella std::partial_ordering::greater);
168ec789a41SChristopher Di Bella static_assert(std::partial_ordering::greater !=
169ec789a41SChristopher Di Bella std::partial_ordering::unordered);
170ec789a41SChristopher Di Bella
171ec789a41SChristopher Di Bella static_assert(std::partial_ordering::unordered !=
172ec789a41SChristopher Di Bella std::partial_ordering::less);
173ec789a41SChristopher Di Bella static_assert(std::partial_ordering::unordered !=
174ec789a41SChristopher Di Bella std::partial_ordering::equivalent);
175ec789a41SChristopher Di Bella static_assert(std::partial_ordering::unordered !=
176ec789a41SChristopher Di Bella std::partial_ordering::greater);
177ec789a41SChristopher Di Bella static_assert(std::partial_ordering::unordered ==
178ec789a41SChristopher Di Bella std::partial_ordering::unordered);
179ec789a41SChristopher Di Bella }
180*46c17429SChristopher Di Bella
181*46c17429SChristopher Di Bella test_equality();
1820913ca19SEric Fiselier #endif
1830913ca19SEric Fiselier
1840913ca19SEric Fiselier return true;
1850913ca19SEric Fiselier }
1860913ca19SEric Fiselier
main(int,char **)1872df59c50SJF Bastien int main(int, char**) {
1880913ca19SEric Fiselier test_static_members();
1890913ca19SEric Fiselier test_signatures();
190*46c17429SChristopher Di Bella test_equality();
1910913ca19SEric Fiselier static_assert(test_constexpr(), "constexpr test failed");
1922df59c50SJF Bastien
1932df59c50SJF Bastien return 0;
1940913ca19SEric Fiselier }
195