mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 23:06:06 +00:00

Implements: https://wg21.link/P0543R3 - https://eel.is/c++draft/numeric.sat Additional references: - Division: https://eel.is/c++draft/expr.mul#4 - Arithmetic conversions: https://eel.is/c++draft/expr.arith.conv#1 - Clang builtins: https://clang.llvm.org/docs/LanguageExtensions.html#builtin-functions Depends on: https://github.com/llvm/llvm-project/pull/78086 --------- Co-authored-by: Zingam <zingam@outlook.com> Co-authored-by: Mark de Wever <zar-rpg@xs4all.nl>
78 lines
2.3 KiB
C++
78 lines
2.3 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// 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
|
|
|
|
// <numeric>
|
|
|
|
// template<class T>
|
|
// constexpr T sub_sat(T x, T y) noexcept; // freestanding
|
|
|
|
#include <concepts>
|
|
#include <numeric>
|
|
|
|
#include "test_macros.h"
|
|
|
|
template <typename T, typename U>
|
|
concept CanDo = requires(T x, U y) {
|
|
{ std::sub_sat(x, y) } -> std::same_as<T>;
|
|
};
|
|
|
|
template <typename T, typename U>
|
|
constexpr void test_constraint_success() {
|
|
static_assert(CanDo<T, T>);
|
|
static_assert(!CanDo<U, T>);
|
|
static_assert(!CanDo<T, U>);
|
|
}
|
|
|
|
template <typename T>
|
|
constexpr void test_constraint_fail() {
|
|
using I = int;
|
|
static_assert(!CanDo<T, T>);
|
|
static_assert(!CanDo<I, T>);
|
|
static_assert(!CanDo<T, I>);
|
|
}
|
|
|
|
constexpr void test() {
|
|
// Contraint success - Signed
|
|
using SI = long long int;
|
|
test_constraint_success<signed char, SI>();
|
|
test_constraint_success<short int, SI>();
|
|
test_constraint_success<signed char, SI>();
|
|
test_constraint_success<short int, SI>();
|
|
test_constraint_success<int, SI>();
|
|
test_constraint_success<long int, SI>();
|
|
test_constraint_success<long long int, int>();
|
|
#ifndef TEST_HAS_NO_INT128
|
|
test_constraint_success<__int128_t, SI>();
|
|
#endif
|
|
// Contraint success - Unsigned
|
|
using UI = unsigned long long int;
|
|
test_constraint_success<unsigned char, UI>();
|
|
test_constraint_success<unsigned short int, UI>();
|
|
test_constraint_success<unsigned int, UI>();
|
|
test_constraint_success<unsigned long int, UI>();
|
|
test_constraint_success<unsigned long long int, unsigned int>();
|
|
#ifndef TEST_HAS_NO_INT128
|
|
test_constraint_success<__uint128_t, UI>();
|
|
#endif
|
|
|
|
// Contraint failure
|
|
test_constraint_fail<bool>();
|
|
test_constraint_fail<char>();
|
|
#ifndef TEST_HAS_NO_INT128
|
|
test_constraint_fail<wchar_t>();
|
|
#endif
|
|
test_constraint_fail<char8_t>();
|
|
test_constraint_fail<char16_t>();
|
|
test_constraint_fail<char32_t>();
|
|
test_constraint_fail<float>();
|
|
test_constraint_fail<double>();
|
|
test_constraint_fail<long double>();
|
|
}
|