diff options
Diffstat (limited to 'test/std/language.support/cmp/cmp.strongeq/cmp.strongeq.pass.cpp')
-rw-r--r-- | test/std/language.support/cmp/cmp.strongeq/cmp.strongeq.pass.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/test/std/language.support/cmp/cmp.strongeq/cmp.strongeq.pass.cpp b/test/std/language.support/cmp/cmp.strongeq/cmp.strongeq.pass.cpp new file mode 100644 index 0000000000000..07fc26eed5b18 --- /dev/null +++ b/test/std/language.support/cmp/cmp.strongeq/cmp.strongeq.pass.cpp @@ -0,0 +1,96 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 + +// <compare> + +// class strong_equality + + +#include <compare> +#include <type_traits> +#include <cassert> + +#include "test_macros.h" + +const volatile void* volatile sink; + +void test_static_members() { + DoNotOptimize(&std::strong_equality::equal); + DoNotOptimize(&std::strong_equality::nonequal); + DoNotOptimize(&std::strong_equality::equivalent); + DoNotOptimize(&std::strong_equality::nonequivalent); +} + +void test_signatures() { + auto& Eq = std::strong_equality::equivalent; + + ASSERT_NOEXCEPT(Eq == 0); + ASSERT_NOEXCEPT(0 == Eq); + ASSERT_NOEXCEPT(Eq != 0); + ASSERT_NOEXCEPT(0 != Eq); +#ifndef TEST_HAS_NO_SPACESHIP_OPERATOR + ASSERT_NOEXCEPT(0 <=> Eq); + ASSERT_NOEXCEPT(Eq <=> 0); + ASSERT_SAME_TYPE(decltype(Eq <=> 0), std::strong_equality); + ASSERT_SAME_TYPE(decltype(0 <=> Eq), std::strong_equality); +#endif +} + +void test_conversion() { + constexpr std::weak_equality res = std::strong_equality::equivalent; + static_assert(res == 0, ""); + static_assert(std::is_convertible<const std::strong_equality&, + std::weak_equality>::value, ""); + static_assert(res == 0, "expected equal"); + + constexpr std::weak_equality neq_res = std::strong_equality::nonequivalent; + static_assert(neq_res != 0, "expected not equal"); +} + +constexpr bool test_constexpr() { + auto& Eq = std::strong_equality::equal; + auto& NEq = std::strong_equality::nonequal; + auto& Equiv = std::strong_equality::equivalent; + auto& NEquiv = std::strong_equality::nonequivalent; + assert((Eq == 0) == true); + assert((0 == Eq) == true); + assert((Equiv == 0) == true); + assert((0 == Equiv) == true); + assert((NEq == 0) == false); + assert((0 == NEq) == false); + assert((NEquiv == 0) == false); + assert((0 == NEquiv) == false); + + assert((Eq != 0) == false); + assert((0 != Eq) == false); + assert((Equiv != 0) == false); + assert((0 != Equiv) == false); + assert((NEq != 0) == true); + assert((0 != NEq) == true); + assert((NEquiv != 0) == true); + assert((0 != NEquiv) == true); + +#ifndef TEST_HAS_NO_SPACESHIP_OPERATOR + std::strong_equality res = (Eq <=> 0); + ((void)res); + res = (0 <=> Eq); + ((void)res); +#endif + + return true; +} + +int main() { + test_static_members(); + test_signatures(); + test_conversion(); + static_assert(test_constexpr(), "constexpr test failed"); +} |