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 1452bff450SNikolas Klauser #include <cassert> 1552bff450SNikolas Klauser #include <cmath> 1652bff450SNikolas Klauser #include <limits> 1752bff450SNikolas Klauser 1852bff450SNikolas Klauser #include "test_macros.h" 1952bff450SNikolas Klauser #include "type_algorithms.h" 2052bff450SNikolas Klauser 2152bff450SNikolas Klauser struct TestFloat { 2252bff450SNikolas Klauser template <class T> 2352bff450SNikolas Klauser static TEST_CONSTEXPR_CXX23 bool test() { 2452bff450SNikolas Klauser assert(!std::isinf(std::numeric_limits<T>::max())); 2552bff450SNikolas Klauser assert(std::isinf(std::numeric_limits<T>::infinity())); 2652bff450SNikolas Klauser assert(!std::isinf(std::numeric_limits<T>::min())); 2752bff450SNikolas Klauser assert(!std::isinf(std::numeric_limits<T>::denorm_min())); 2852bff450SNikolas Klauser assert(!std::isinf(std::numeric_limits<T>::lowest())); 2952bff450SNikolas Klauser assert(std::isinf(-std::numeric_limits<T>::infinity())); 3052bff450SNikolas Klauser assert(!std::isinf(T(0))); 3152bff450SNikolas Klauser assert(!std::isinf(std::numeric_limits<T>::quiet_NaN())); 3252bff450SNikolas Klauser assert(!std::isinf(std::numeric_limits<T>::signaling_NaN())); 3352bff450SNikolas Klauser 3452bff450SNikolas Klauser return true; 3552bff450SNikolas Klauser } 3652bff450SNikolas Klauser 3752bff450SNikolas Klauser template <class T> 3852bff450SNikolas Klauser TEST_CONSTEXPR_CXX23 void operator()() { 3952bff450SNikolas Klauser test<T>(); 4052bff450SNikolas Klauser #if TEST_STD_VER >= 23 4152bff450SNikolas Klauser static_assert(test<T>()); 4252bff450SNikolas Klauser #endif 4352bff450SNikolas Klauser } 4452bff450SNikolas Klauser }; 4552bff450SNikolas Klauser 4652bff450SNikolas Klauser struct TestInt { 4752bff450SNikolas Klauser template <class T> 4852bff450SNikolas Klauser static TEST_CONSTEXPR_CXX23 bool test() { 4952bff450SNikolas Klauser assert(!std::isinf(std::numeric_limits<T>::max())); 5052bff450SNikolas Klauser assert(!std::isinf(std::numeric_limits<T>::lowest())); 5152bff450SNikolas Klauser assert(!std::isinf(T(0))); 5252bff450SNikolas Klauser 5352bff450SNikolas Klauser return true; 5452bff450SNikolas Klauser } 5552bff450SNikolas Klauser 5652bff450SNikolas Klauser template <class T> 5752bff450SNikolas Klauser TEST_CONSTEXPR_CXX23 void operator()() { 5852bff450SNikolas Klauser test<T>(); 5952bff450SNikolas Klauser #if TEST_STD_VER >= 23 6052bff450SNikolas Klauser static_assert(test<T>()); 6152bff450SNikolas Klauser #endif 6252bff450SNikolas Klauser } 6352bff450SNikolas Klauser }; 6452bff450SNikolas Klauser 65*2fe59d52SRobin Caloudis template <typename T> 66*2fe59d52SRobin Caloudis struct ConvertibleTo { 67*2fe59d52SRobin Caloudis operator T() const { return T(); } 68*2fe59d52SRobin Caloudis }; 69*2fe59d52SRobin Caloudis 7052bff450SNikolas Klauser int main(int, char**) { 71f56dfb78SArthur O'Dwyer types::for_each(types::floating_point_types(), TestFloat()); 72f56dfb78SArthur O'Dwyer types::for_each(types::integral_types(), TestInt()); 7352bff450SNikolas Klauser 74*2fe59d52SRobin Caloudis // Make sure we can call `std::isinf` with convertible types 75*2fe59d52SRobin Caloudis { 76*2fe59d52SRobin Caloudis assert(!std::isinf(ConvertibleTo<float>())); 77*2fe59d52SRobin Caloudis assert(!std::isinf(ConvertibleTo<double>())); 78*2fe59d52SRobin Caloudis assert(!std::isinf(ConvertibleTo<long double>())); 79*2fe59d52SRobin Caloudis } 80*2fe59d52SRobin Caloudis 8152bff450SNikolas Klauser return 0; 8252bff450SNikolas Klauser } 83