//===----------------------------------------------------------------------===// // // 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, c++20, c++23 // // template // constexpr T div_sat(T x, T y) noexcept; // freestanding #include #include #include #include "test_macros.h" // Constraints template concept CanDo = requires(T x, U y) { { std::div_sat(x, y) } -> std::same_as; }; template constexpr void test_constraint_success() { static_assert(CanDo); static_assert(!CanDo); static_assert(!CanDo); } template constexpr void test_constraint_fail() { using I = int; static_assert(!CanDo); static_assert(!CanDo); static_assert(!CanDo); } constexpr void test() { // Contraint success - Signed using SI = long long int; test_constraint_success(); test_constraint_success(); test_constraint_success(); test_constraint_success(); test_constraint_success(); test_constraint_success(); test_constraint_success(); #ifndef TEST_HAS_NO_INT128 test_constraint_success<__int128_t, SI>(); #endif // Contraint success - Unsigned using UI = unsigned long long int; test_constraint_success(); test_constraint_success(); test_constraint_success(); test_constraint_success(); test_constraint_success(); #ifndef TEST_HAS_NO_INT128 test_constraint_success<__uint128_t, UI>(); #endif // Contraint failure test_constraint_fail(); test_constraint_fail(); #ifndef TEST_HAS_NO_INT128 test_constraint_fail(); #endif test_constraint_fail(); test_constraint_fail(); test_constraint_fail(); test_constraint_fail(); test_constraint_fail(); test_constraint_fail(); } // A function call expression that violates the precondition in the Preconditions: element is not a core constant expression (7.7 [expr.const]). template using QuotT = std::integral_constant; template QuotT div_by_zero(); template concept CanDivByZero = requires { div_by_zero(); }; static_assert(!CanDivByZero(0)>); static_assert(!CanDivByZero(0)>); static_assert(!CanDivByZero<0>); static_assert(!CanDivByZero<0L>); static_assert(!CanDivByZero<0LL>); #ifndef TEST_HAS_NO_INT128 static_assert(!CanDivByZero(0)>); #endif static_assert(!CanDivByZero(0)>); static_assert(!CanDivByZero(0)>); static_assert(!CanDivByZero<0U>); static_assert(!CanDivByZero<0UL>); static_assert(!CanDivByZero<0ULL>); #ifndef TEST_HAS_NO_INT128 static_assert(!CanDivByZero(0)>); #endif