//===----------------------------------------------------------------------===// // // 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 // constexpr bool in_range(T t) noexcept; // C++20 #include #include #include #include #include #include #include "test_macros.h" template struct Tuple { T min; T max; T mid; constexpr Tuple() { min = std::numeric_limits::min(); max = std::numeric_limits::max(); mid = std::midpoint(min, max); } }; template constexpr void test_in_range1() { constexpr Tuple tup; assert(std::in_range(tup.min)); assert(std::in_range(tup.min + 1)); assert(std::in_range(tup.max)); assert(std::in_range(tup.max - 1)); assert(std::in_range(tup.mid)); assert(std::in_range(tup.mid - 1)); assert(std::in_range(tup.mid + 1)); } constexpr void test_in_range() { constexpr Tuple utup8; constexpr Tuple stup8; assert(!std::in_range(utup8.max)); assert(std::in_range(utup8.max)); assert(!std::in_range(stup8.min)); assert(std::in_range(utup8.mid)); assert(!std::in_range(stup8.mid)); assert(!std::in_range(-1)); } template constexpr void test1(const std::tuple&) { (test_in_range1() , ...); } constexpr bool test() { std::tuple< #ifndef TEST_HAS_NO_INT128 __int128_t, __uint128_t, #endif unsigned long long, long long, unsigned long, long, unsigned int, int, unsigned short, short, unsigned char, signed char> types; test1(types); test_in_range(); return true; } int main(int, char**) { ASSERT_NOEXCEPT(std::in_range(-1)); test(); static_assert(test()); return 0; }