xref: /llvm-project/libcxx/test/std/numerics/c.math/isnormal.pass.cpp (revision b9a2658a3e8bd13b0f9e7a8a440832a95b377216)
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