1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 11 12 // <compare> 13 14 // class strong_equality 15 16 17 #include <compare> 18 #include <type_traits> 19 #include <cassert> 20 21 #include "test_macros.h" 22 23 const volatile void* volatile sink; 24 25 void test_static_members() { 26 DoNotOptimize(&std::strong_equality::equal); 27 DoNotOptimize(&std::strong_equality::nonequal); 28 DoNotOptimize(&std::strong_equality::equivalent); 29 DoNotOptimize(&std::strong_equality::nonequivalent); 30 } 31 32 void test_signatures() { 33 auto& Eq = std::strong_equality::equivalent; 34 35 ASSERT_NOEXCEPT(Eq == 0); 36 ASSERT_NOEXCEPT(0 == Eq); 37 ASSERT_NOEXCEPT(Eq != 0); 38 ASSERT_NOEXCEPT(0 != Eq); 39 #ifndef TEST_HAS_NO_SPACESHIP_OPERATOR 40 ASSERT_NOEXCEPT(0 <=> Eq); 41 ASSERT_NOEXCEPT(Eq <=> 0); 42 ASSERT_SAME_TYPE(decltype(Eq <=> 0), std::strong_equality); 43 ASSERT_SAME_TYPE(decltype(0 <=> Eq), std::strong_equality); 44 #endif 45 } 46 47 void test_conversion() { 48 constexpr std::weak_equality res = std::strong_equality::equivalent; 49 static_assert(res == 0, ""); 50 static_assert(std::is_convertible<const std::strong_equality&, 51 std::weak_equality>::value, ""); 52 static_assert(res == 0, "expected equal"); 53 54 constexpr std::weak_equality neq_res = std::strong_equality::nonequivalent; 55 static_assert(neq_res != 0, "expected not equal"); 56 } 57 58 constexpr bool test_constexpr() { 59 auto& Eq = std::strong_equality::equal; 60 auto& NEq = std::strong_equality::nonequal; 61 auto& Equiv = std::strong_equality::equivalent; 62 auto& NEquiv = std::strong_equality::nonequivalent; 63 assert((Eq == 0) == true); 64 assert((0 == Eq) == true); 65 assert((Equiv == 0) == true); 66 assert((0 == Equiv) == true); 67 assert((NEq == 0) == false); 68 assert((0 == NEq) == false); 69 assert((NEquiv == 0) == false); 70 assert((0 == NEquiv) == false); 71 72 assert((Eq != 0) == false); 73 assert((0 != Eq) == false); 74 assert((Equiv != 0) == false); 75 assert((0 != Equiv) == false); 76 assert((NEq != 0) == true); 77 assert((0 != NEq) == true); 78 assert((NEquiv != 0) == true); 79 assert((0 != NEquiv) == true); 80 81 #ifndef TEST_HAS_NO_SPACESHIP_OPERATOR 82 std::strong_equality res = (Eq <=> 0); 83 ((void)res); 84 res = (0 <=> Eq); 85 ((void)res); 86 #endif 87 88 return true; 89 } 90 91 int main() { 92 test_static_members(); 93 test_signatures(); 94 test_conversion(); 95 static_assert(test_constexpr(), "constexpr test failed"); 96 } 97