152bff450SNikolas Klauser //===----------------------------------------------------------------------===// 252bff450SNikolas Klauser // 352bff450SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 452bff450SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 552bff450SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 652bff450SNikolas Klauser // 752bff450SNikolas Klauser //===----------------------------------------------------------------------===// 852bff450SNikolas Klauser 952bff450SNikolas Klauser // bool isfinite(floating-point-type x); // constexpr since C++23 1052bff450SNikolas Klauser 1152bff450SNikolas Klauser // We don't control the implementation on windows 1252bff450SNikolas Klauser // UNSUPPORTED: windows 1352bff450SNikolas Klauser 14*b9a2658aSNikolas Klauser // XFAIL: FROZEN-CXX03-HEADERS-FIXME 15*b9a2658aSNikolas Klauser 1652bff450SNikolas Klauser #include <cassert> 1752bff450SNikolas Klauser #include <cmath> 1852bff450SNikolas Klauser #include <limits> 1952bff450SNikolas Klauser 2052bff450SNikolas Klauser #include "test_macros.h" 2152bff450SNikolas Klauser #include "type_algorithms.h" 2252bff450SNikolas Klauser 2352bff450SNikolas Klauser struct TestFloat { 2452bff450SNikolas Klauser template <class T> 2552bff450SNikolas Klauser static TEST_CONSTEXPR_CXX23 bool test() { 2652bff450SNikolas Klauser assert(std::isnormal(std::numeric_limits<T>::max())); 2752bff450SNikolas Klauser assert(!std::isnormal(std::numeric_limits<T>::infinity())); 2852bff450SNikolas Klauser assert(std::isnormal(std::numeric_limits<T>::min())); 2952bff450SNikolas Klauser assert(!std::isnormal(std::numeric_limits<T>::denorm_min())); 3052bff450SNikolas Klauser assert(std::isnormal(std::numeric_limits<T>::lowest())); 3152bff450SNikolas Klauser assert(!std::isnormal(-std::numeric_limits<T>::infinity())); 3252bff450SNikolas Klauser assert(!std::isnormal(T(0))); 3352bff450SNikolas Klauser assert(!std::isnormal(std::numeric_limits<T>::quiet_NaN())); 3452bff450SNikolas Klauser assert(!std::isnormal(std::numeric_limits<T>::signaling_NaN())); 3552bff450SNikolas Klauser 3652bff450SNikolas Klauser return true; 3752bff450SNikolas Klauser } 3852bff450SNikolas Klauser 3952bff450SNikolas Klauser template <class T> 4052bff450SNikolas Klauser TEST_CONSTEXPR_CXX23 void operator()() { 4152bff450SNikolas Klauser test<T>(); 4252bff450SNikolas Klauser #if TEST_STD_VER >= 23 4352bff450SNikolas Klauser static_assert(test<T>()); 4452bff450SNikolas Klauser #endif 4552bff450SNikolas Klauser } 4652bff450SNikolas Klauser }; 4752bff450SNikolas Klauser 4852bff450SNikolas Klauser struct TestInt { 4952bff450SNikolas Klauser template <class T> 5052bff450SNikolas Klauser static TEST_CONSTEXPR_CXX23 bool test() { 5152bff450SNikolas Klauser assert(std::isnormal(std::numeric_limits<T>::max())); 5252bff450SNikolas Klauser assert(std::isnormal(std::numeric_limits<T>::lowest()) == std::is_signed<T>::value); 5352bff450SNikolas Klauser assert(!std::isnormal(T(0))); 5452bff450SNikolas Klauser 5552bff450SNikolas Klauser return true; 5652bff450SNikolas Klauser } 5752bff450SNikolas Klauser 5852bff450SNikolas Klauser template <class T> 5952bff450SNikolas Klauser TEST_CONSTEXPR_CXX23 void operator()() { 6052bff450SNikolas Klauser test<T>(); 6152bff450SNikolas Klauser #if TEST_STD_VER >= 23 6252bff450SNikolas Klauser static_assert(test<T>()); 6352bff450SNikolas Klauser #endif 6452bff450SNikolas Klauser } 6552bff450SNikolas Klauser }; 6652bff450SNikolas Klauser 67866bec7dSRobin Caloudis template <typename T> 68866bec7dSRobin Caloudis struct ConvertibleTo { 69866bec7dSRobin Caloudis operator T() const { return T(1); } 70866bec7dSRobin Caloudis }; 71866bec7dSRobin Caloudis 7252bff450SNikolas Klauser int main(int, char**) { 73f56dfb78SArthur O'Dwyer types::for_each(types::floating_point_types(), TestFloat()); 74f56dfb78SArthur O'Dwyer types::for_each(types::integral_types(), TestInt()); 7552bff450SNikolas Klauser 76866bec7dSRobin Caloudis // Make sure we can call `std::isnormal` with convertible types. This checks 77866bec7dSRobin Caloudis // whether overloads for all cv-unqualified floating-point types are working 78866bec7dSRobin Caloudis // as expected. 79866bec7dSRobin Caloudis { 80866bec7dSRobin Caloudis assert(std::isnormal(ConvertibleTo<float>())); 81866bec7dSRobin Caloudis assert(std::isnormal(ConvertibleTo<double>())); 82866bec7dSRobin Caloudis assert(std::isnormal(ConvertibleTo<long double>())); 83866bec7dSRobin Caloudis } 84866bec7dSRobin Caloudis 8552bff450SNikolas Klauser return 0; 8652bff450SNikolas Klauser } 87