//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 // template // concept totally_ordered; #include #include #include #include #include #include #include #include #include #include #include #include "compare_types.h" #include "test_macros.h" // `models_totally_ordered` checks that `std::totally_ordered` subsumes // `std::equality_comparable`. This overload should *never* be called. template constexpr bool models_totally_ordered() noexcept { return false; } template constexpr bool models_totally_ordered() noexcept { return true; } namespace fundamentals { static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); #ifndef TEST_COMPILER_GCC static_assert(!std::totally_ordered); #endif struct S {}; static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered < int(S::*)() && noexcept >); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered < int(S::*)() const&& noexcept >); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered < int(S::*)() volatile && noexcept >); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered < int(S::*)() const volatile&& noexcept >); static_assert(!std::totally_ordered); } // namespace fundamentals namespace standard_types { static_assert(models_totally_ordered >()); static_assert(models_totally_ordered >()); static_assert(models_totally_ordered >()); static_assert(models_totally_ordered >()); static_assert(models_totally_ordered >()); static_assert(models_totally_ordered >()); static_assert(models_totally_ordered >()); static_assert(models_totally_ordered >()); static_assert(!std::totally_ordered >); static_assert(!std::totally_ordered >); struct A {}; static_assert(!std::totally_ordered >); static_assert(!std::totally_ordered >); static_assert(!std::totally_ordered >); static_assert(!std::totally_ordered >); static_assert(!std::totally_ordered >); static_assert(!std::totally_ordered >); } // namespace standard_types namespace types_fit_for_purpose { static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(models_totally_ordered()); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(!std::totally_ordered); static_assert(std::totally_ordered); static_assert(std::totally_ordered); static_assert(std::totally_ordered); static_assert(std::totally_ordered); static_assert(std::totally_ordered); } // namespace types_fit_for_purpose