brintos

brintos / llvm-project-archived public Read only

0
0
Text · 107.2 KiB · e02ac34 Raw
1724 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <cmath>10 11#include <cmath>12#include <array>13#include <cassert>14#include <limits>15#include <type_traits>16#include <utility>17 18#include "fp_compare.h"19#include "test_macros.h"20#include "hexfloat.h"21#include "truncate_fp.h"22#include "type_algorithms.h"23 24// convertible to int/float/double/etc25template <class T, int N=0>26struct Value {27    operator T () { return T(N); }28};29 30// See PR2108331// Ambiguous is a user-defined type that defines its own overloads of cmath32// functions. When the std overloads are candidates too (by using or adl),33// they should not interfere.34struct Ambiguous : std::true_type { // ADL35    operator float () { return 0.f; }36    operator double () { return 0.; }37};38Ambiguous abs(Ambiguous){ return Ambiguous(); }39Ambiguous acos(Ambiguous){ return Ambiguous(); }40Ambiguous asin(Ambiguous){ return Ambiguous(); }41Ambiguous atan(Ambiguous){ return Ambiguous(); }42Ambiguous atan2(Ambiguous, Ambiguous){ return Ambiguous(); }43Ambiguous ceil(Ambiguous){ return Ambiguous(); }44Ambiguous cos(Ambiguous){ return Ambiguous(); }45Ambiguous cosh(Ambiguous){ return Ambiguous(); }46Ambiguous exp(Ambiguous){ return Ambiguous(); }47Ambiguous fabs(Ambiguous){ return Ambiguous(); }48Ambiguous floor(Ambiguous){ return Ambiguous(); }49Ambiguous fmod(Ambiguous, Ambiguous){ return Ambiguous(); }50Ambiguous frexp(Ambiguous, int*){ return Ambiguous(); }51Ambiguous ldexp(Ambiguous, int){ return Ambiguous(); }52Ambiguous log(Ambiguous){ return Ambiguous(); }53Ambiguous log10(Ambiguous){ return Ambiguous(); }54Ambiguous modf(Ambiguous, Ambiguous*){ return Ambiguous(); }55Ambiguous pow(Ambiguous, Ambiguous){ return Ambiguous(); }56Ambiguous sin(Ambiguous){ return Ambiguous(); }57Ambiguous sinh(Ambiguous){ return Ambiguous(); }58Ambiguous sqrt(Ambiguous){ return Ambiguous(); }59Ambiguous tan(Ambiguous){ return Ambiguous(); }60Ambiguous tanh(Ambiguous){ return Ambiguous(); }61Ambiguous signbit(Ambiguous){ return Ambiguous(); }62Ambiguous fpclassify(Ambiguous){ return Ambiguous(); }63Ambiguous isfinite(Ambiguous){ return Ambiguous(); }64Ambiguous isnormal(Ambiguous){ return Ambiguous(); }65Ambiguous isgreater(Ambiguous, Ambiguous){ return Ambiguous(); }66Ambiguous isgreaterequal(Ambiguous, Ambiguous){ return Ambiguous(); }67Ambiguous isless(Ambiguous, Ambiguous){ return Ambiguous(); }68Ambiguous islessequal(Ambiguous, Ambiguous){ return Ambiguous(); }69Ambiguous islessgreater(Ambiguous, Ambiguous){ return Ambiguous(); }70Ambiguous isunordered(Ambiguous, Ambiguous){ return Ambiguous(); }71Ambiguous acosh(Ambiguous){ return Ambiguous(); }72Ambiguous asinh(Ambiguous){ return Ambiguous(); }73Ambiguous atanh(Ambiguous){ return Ambiguous(); }74Ambiguous cbrt(Ambiguous){ return Ambiguous(); }75Ambiguous copysign(Ambiguous, Ambiguous){ return Ambiguous(); }76Ambiguous erf(Ambiguous){ return Ambiguous(); }77Ambiguous erfc(Ambiguous){ return Ambiguous(); }78Ambiguous exp2(Ambiguous){ return Ambiguous(); }79Ambiguous expm1(Ambiguous){ return Ambiguous(); }80Ambiguous fdim(Ambiguous, Ambiguous){ return Ambiguous(); }81Ambiguous fma(Ambiguous, Ambiguous, Ambiguous){ return Ambiguous(); }82Ambiguous fmax(Ambiguous, Ambiguous){ return Ambiguous(); }83Ambiguous fmin(Ambiguous, Ambiguous){ return Ambiguous(); }84Ambiguous hypot(Ambiguous, Ambiguous){ return Ambiguous(); }85Ambiguous hypot(Ambiguous, Ambiguous, Ambiguous){ return Ambiguous(); }86Ambiguous ilogb(Ambiguous){ return Ambiguous(); }87Ambiguous lerp(Ambiguous, Ambiguous, Ambiguous){ return Ambiguous(); }88Ambiguous lgamma(Ambiguous){ return Ambiguous(); }89Ambiguous llrint(Ambiguous){ return Ambiguous(); }90Ambiguous llround(Ambiguous){ return Ambiguous(); }91Ambiguous log1p(Ambiguous){ return Ambiguous(); }92Ambiguous log2(Ambiguous){ return Ambiguous(); }93Ambiguous logb(Ambiguous){ return Ambiguous(); }94Ambiguous lrint(Ambiguous){ return Ambiguous(); }95Ambiguous lround(Ambiguous){ return Ambiguous(); }96Ambiguous nearbyint(Ambiguous){ return Ambiguous(); }97Ambiguous nextafter(Ambiguous, Ambiguous){ return Ambiguous(); }98Ambiguous nexttoward(Ambiguous, Ambiguous){ return Ambiguous(); }99Ambiguous remainder(Ambiguous, Ambiguous){ return Ambiguous(); }100Ambiguous remquo(Ambiguous, Ambiguous, int*){ return Ambiguous(); }101Ambiguous rint(Ambiguous){ return Ambiguous(); }102Ambiguous round(Ambiguous){ return Ambiguous(); }103Ambiguous scalbln(Ambiguous, Ambiguous){ return Ambiguous(); }104Ambiguous scalbn(Ambiguous, Ambiguous){ return Ambiguous(); }105Ambiguous tgamma(Ambiguous){ return Ambiguous(); }106Ambiguous trunc(Ambiguous){ return Ambiguous(); }107 108template <class T, class = decltype(std::abs(std::declval<T>()))>109std::true_type has_abs_imp(int);110template <class T>111std::false_type has_abs_imp(...);112 113template <class T>114struct has_abs : decltype(has_abs_imp<T>(0)) {};115 116void test_abs()117{118    // See also "abs.pass.cpp"119 120    TEST_DIAGNOSTIC_PUSH121    TEST_CLANG_DIAGNOSTIC_IGNORED("-Wabsolute-value")122 123    static_assert((std::is_same<decltype(std::abs((float)0)), float>::value), "");124    static_assert((std::is_same<decltype(std::abs((double)0)), double>::value), "");125    static_assert((std::is_same<decltype(std::abs((long double)0)), long double>::value), "");126    static_assert((std::is_same<decltype(std::abs((int)0)), int>::value), "");127    static_assert((std::is_same<decltype(std::abs((long)0)), long>::value), "");128    static_assert((std::is_same<decltype(std::abs((long long)0)), long long>::value), "");129    static_assert((std::is_same<decltype(std::abs((unsigned char)0)), int>::value), "");130    static_assert((std::is_same<decltype(std::abs((unsigned short)0)), int>::value), "");131    static_assert((std::is_same<decltype(std::abs((signed char)0)), int>::value), "");132    static_assert((std::is_same<decltype(std::abs((short)0)), int>::value), "");133    static_assert((std::is_same<decltype(std::abs((unsigned char)0)), int>::value), "");134    static_assert((std::is_same<decltype(std::abs((char)0)), int>::value), "");135    static_assert((std::is_same<decltype(abs(Ambiguous())), Ambiguous>::value), "");136 137    static_assert(!has_abs<unsigned>::value, "");138    static_assert(!has_abs<unsigned long>::value, "");139    static_assert(!has_abs<unsigned long long>::value, "");140    static_assert(!has_abs<std::size_t>::value, "");141 142    TEST_DIAGNOSTIC_POP143 144    assert(std::abs(-1.) == 1);145}146 147 148void test_acos()149{150    static_assert((std::is_same<decltype(std::acos((float)0)), float>::value), "");151    static_assert((std::is_same<decltype(std::acos((bool)0)), double>::value), "");152    static_assert((std::is_same<decltype(std::acos((unsigned short)0)), double>::value), "");153    static_assert((std::is_same<decltype(std::acos((int)0)), double>::value), "");154    static_assert((std::is_same<decltype(std::acos((unsigned int)0)), double>::value), "");155    static_assert((std::is_same<decltype(std::acos((long)0)), double>::value), "");156    static_assert((std::is_same<decltype(std::acos((unsigned long)0)), double>::value), "");157    static_assert((std::is_same<decltype(std::acos((long long)0)), double>::value), "");158    static_assert((std::is_same<decltype(std::acos((unsigned long long)0)), double>::value), "");159    static_assert((std::is_same<decltype(std::acos((double)0)), double>::value), "");160    static_assert((std::is_same<decltype(std::acos((long double)0)), long double>::value), "");161    static_assert((std::is_same<decltype(std::acosf(0)), float>::value), "");162    static_assert((std::is_same<decltype(std::acosl(0)), long double>::value), "");163    static_assert((std::is_same<decltype(acos(Ambiguous())), Ambiguous>::value), "");164    assert(std::acos(1) == 0);165}166 167void test_asin()168{169    static_assert((std::is_same<decltype(std::asin((float)0)), float>::value), "");170    static_assert((std::is_same<decltype(std::asin((bool)0)), double>::value), "");171    static_assert((std::is_same<decltype(std::asin((unsigned short)0)), double>::value), "");172    static_assert((std::is_same<decltype(std::asin((int)0)), double>::value), "");173    static_assert((std::is_same<decltype(std::asin((unsigned int)0)), double>::value), "");174    static_assert((std::is_same<decltype(std::asin((long)0)), double>::value), "");175    static_assert((std::is_same<decltype(std::asin((unsigned long)0)), double>::value), "");176    static_assert((std::is_same<decltype(std::asin((long long)0)), double>::value), "");177    static_assert((std::is_same<decltype(std::asin((unsigned long long)0)), double>::value), "");178    static_assert((std::is_same<decltype(std::asin((double)0)), double>::value), "");179    static_assert((std::is_same<decltype(std::asin((long double)0)), long double>::value), "");180    static_assert((std::is_same<decltype(std::asinf(0)), float>::value), "");181    static_assert((std::is_same<decltype(std::asinl(0)), long double>::value), "");182    static_assert((std::is_same<decltype(asin(Ambiguous())), Ambiguous>::value), "");183    assert(std::asin(0) == 0);184}185 186void test_atan()187{188    static_assert((std::is_same<decltype(std::atan((float)0)), float>::value), "");189    static_assert((std::is_same<decltype(std::atan((bool)0)), double>::value), "");190    static_assert((std::is_same<decltype(std::atan((unsigned short)0)), double>::value), "");191    static_assert((std::is_same<decltype(std::atan((int)0)), double>::value), "");192    static_assert((std::is_same<decltype(std::atan((unsigned int)0)), double>::value), "");193    static_assert((std::is_same<decltype(std::atan((long)0)), double>::value), "");194    static_assert((std::is_same<decltype(std::atan((unsigned long)0)), double>::value), "");195    static_assert((std::is_same<decltype(std::atan((long long)0)), double>::value), "");196    static_assert((std::is_same<decltype(std::atan((unsigned long long)0)), double>::value), "");197    static_assert((std::is_same<decltype(std::atan((double)0)), double>::value), "");198    static_assert((std::is_same<decltype(std::atan((long double)0)), long double>::value), "");199    static_assert((std::is_same<decltype(std::atanf(0)), float>::value), "");200    static_assert((std::is_same<decltype(std::atanl(0)), long double>::value), "");201    static_assert((std::is_same<decltype(atan(Ambiguous())), Ambiguous>::value), "");202    assert(std::atan(0) == 0);203}204 205void test_atan2()206{207    static_assert((std::is_same<decltype(std::atan2((float)0, (float)0)), float>::value), "");208    static_assert((std::is_same<decltype(std::atan2((bool)0, (float)0)), double>::value), "");209    static_assert((std::is_same<decltype(std::atan2((unsigned short)0, (double)0)), double>::value), "");210    static_assert((std::is_same<decltype(std::atan2((int)0, (long double)0)), long double>::value), "");211    static_assert((std::is_same<decltype(std::atan2((float)0, (unsigned int)0)), double>::value), "");212    static_assert((std::is_same<decltype(std::atan2((double)0, (long)0)), double>::value), "");213    static_assert((std::is_same<decltype(std::atan2((long double)0, (unsigned long)0)), long double>::value), "");214    static_assert((std::is_same<decltype(std::atan2((int)0, (long long)0)), double>::value), "");215    static_assert((std::is_same<decltype(std::atan2((int)0, (unsigned long long)0)), double>::value), "");216    static_assert((std::is_same<decltype(std::atan2((double)0, (double)0)), double>::value), "");217    static_assert((std::is_same<decltype(std::atan2((long double)0, (long double)0)), long double>::value), "");218    static_assert((std::is_same<decltype(std::atan2((float)0, (double)0)), double>::value), "");219    static_assert((std::is_same<decltype(std::atan2((float)0, (long double)0)), long double>::value), "");220    static_assert((std::is_same<decltype(std::atan2((double)0, (long double)0)), long double>::value), "");221    static_assert((std::is_same<decltype(std::atan2f(0,0)), float>::value), "");222    static_assert((std::is_same<decltype(std::atan2l(0,0)), long double>::value), "");223    static_assert((std::is_same<decltype(std::atan2((int)0, (int)0)), double>::value), "");224    static_assert((std::is_same<decltype(atan2(Ambiguous(), Ambiguous())), Ambiguous>::value), "");225    assert(std::atan2(0,1) == 0);226}227 228void test_ceil()229{230    static_assert((std::is_same<decltype(std::ceil((float)0)), float>::value), "");231    static_assert((std::is_same<decltype(std::ceil((bool)0)), double>::value), "");232    static_assert((std::is_same<decltype(std::ceil((unsigned short)0)), double>::value), "");233    static_assert((std::is_same<decltype(std::ceil((int)0)), double>::value), "");234    static_assert((std::is_same<decltype(std::ceil((unsigned int)0)), double>::value), "");235    static_assert((std::is_same<decltype(std::ceil((long)0)), double>::value), "");236    static_assert((std::is_same<decltype(std::ceil((unsigned long)0)), double>::value), "");237    static_assert((std::is_same<decltype(std::ceil((long long)0)), double>::value), "");238    static_assert((std::is_same<decltype(std::ceil((unsigned long long)0)), double>::value), "");239    static_assert((std::is_same<decltype(std::ceil((double)0)), double>::value), "");240    static_assert((std::is_same<decltype(std::ceil((long double)0)), long double>::value), "");241    static_assert((std::is_same<decltype(std::ceilf(0)), float>::value), "");242    static_assert((std::is_same<decltype(std::ceill(0)), long double>::value), "");243    static_assert((std::is_same<decltype(ceil(Ambiguous())), Ambiguous>::value), "");244    assert(std::ceil(0) == 0);245}246 247void test_cos()248{249    static_assert((std::is_same<decltype(std::cos((float)0)), float>::value), "");250    static_assert((std::is_same<decltype(std::cos((bool)0)), double>::value), "");251    static_assert((std::is_same<decltype(std::cos((unsigned short)0)), double>::value), "");252    static_assert((std::is_same<decltype(std::cos((int)0)), double>::value), "");253    static_assert((std::is_same<decltype(std::cos((unsigned int)0)), double>::value), "");254    static_assert((std::is_same<decltype(std::cos((long)0)), double>::value), "");255    static_assert((std::is_same<decltype(std::cos((unsigned long)0)), double>::value), "");256    static_assert((std::is_same<decltype(std::cos((long long)0)), double>::value), "");257    static_assert((std::is_same<decltype(std::cos((unsigned long long)0)), double>::value), "");258    static_assert((std::is_same<decltype(std::cos((double)0)), double>::value), "");259    static_assert((std::is_same<decltype(std::cos((long double)0)), long double>::value), "");260    static_assert((std::is_same<decltype(std::cosf(0)), float>::value), "");261    static_assert((std::is_same<decltype(std::cosl(0)), long double>::value), "");262    static_assert((std::is_same<decltype(cos(Ambiguous())), Ambiguous>::value), "");263    assert(std::cos(0) == 1);264}265 266void test_cosh()267{268    static_assert((std::is_same<decltype(std::cosh((float)0)), float>::value), "");269    static_assert((std::is_same<decltype(std::cosh((bool)0)), double>::value), "");270    static_assert((std::is_same<decltype(std::cosh((unsigned short)0)), double>::value), "");271    static_assert((std::is_same<decltype(std::cosh((int)0)), double>::value), "");272    static_assert((std::is_same<decltype(std::cosh((unsigned int)0)), double>::value), "");273    static_assert((std::is_same<decltype(std::cosh((long)0)), double>::value), "");274    static_assert((std::is_same<decltype(std::cosh((unsigned long)0)), double>::value), "");275    static_assert((std::is_same<decltype(std::cosh((long long)0)), double>::value), "");276    static_assert((std::is_same<decltype(std::cosh((unsigned long long)0)), double>::value), "");277    static_assert((std::is_same<decltype(std::cosh((double)0)), double>::value), "");278    static_assert((std::is_same<decltype(std::cosh((long double)0)), long double>::value), "");279    static_assert((std::is_same<decltype(std::coshf(0)), float>::value), "");280    static_assert((std::is_same<decltype(std::coshl(0)), long double>::value), "");281    static_assert((std::is_same<decltype(cosh(Ambiguous())), Ambiguous>::value), "");282    assert(std::cosh(0) == 1);283}284 285void test_exp()286{287    static_assert((std::is_same<decltype(std::exp((float)0)), float>::value), "");288    static_assert((std::is_same<decltype(std::exp((bool)0)), double>::value), "");289    static_assert((std::is_same<decltype(std::exp((unsigned short)0)), double>::value), "");290    static_assert((std::is_same<decltype(std::exp((int)0)), double>::value), "");291    static_assert((std::is_same<decltype(std::exp((unsigned int)0)), double>::value), "");292    static_assert((std::is_same<decltype(std::exp((long)0)), double>::value), "");293    static_assert((std::is_same<decltype(std::exp((unsigned long)0)), double>::value), "");294    static_assert((std::is_same<decltype(std::exp((long long)0)), double>::value), "");295    static_assert((std::is_same<decltype(std::exp((unsigned long long)0)), double>::value), "");296    static_assert((std::is_same<decltype(std::exp((double)0)), double>::value), "");297    static_assert((std::is_same<decltype(std::exp((long double)0)), long double>::value), "");298    static_assert((std::is_same<decltype(std::expf(0)), float>::value), "");299    static_assert((std::is_same<decltype(std::expl(0)), long double>::value), "");300    static_assert((std::is_same<decltype(exp(Ambiguous())), Ambiguous>::value), "");301    assert(std::exp(0) == 1);302}303 304void test_fabs()305{306    static_assert((std::is_same<decltype(std::fabs((float)0)), float>::value), "");307    static_assert((std::is_same<decltype(std::fabs((bool)0)), double>::value), "");308    static_assert((std::is_same<decltype(std::fabs((unsigned short)0)), double>::value), "");309    static_assert((std::is_same<decltype(std::fabs((int)0)), double>::value), "");310    static_assert((std::is_same<decltype(std::fabs((unsigned int)0)), double>::value), "");311    static_assert((std::is_same<decltype(std::fabs((long)0)), double>::value), "");312    static_assert((std::is_same<decltype(std::fabs((unsigned long)0)), double>::value), "");313    static_assert((std::is_same<decltype(std::fabs((long long)0)), double>::value), "");314    static_assert((std::is_same<decltype(std::fabs((unsigned long long)0)), double>::value), "");315    static_assert((std::is_same<decltype(std::fabs((double)0)), double>::value), "");316    static_assert((std::is_same<decltype(std::fabs((long double)0)), long double>::value), "");317    static_assert((std::is_same<decltype(std::fabsf(0.0f)), float>::value), "");318    static_assert((std::is_same<decltype(std::fabsl(0.0L)), long double>::value), "");319    static_assert((std::is_same<decltype(fabs(Ambiguous())), Ambiguous>::value), "");320    assert(std::fabs(-1) == 1);321}322 323void test_floor()324{325    static_assert((std::is_same<decltype(std::floor((float)0)), float>::value), "");326    static_assert((std::is_same<decltype(std::floor((bool)0)), double>::value), "");327    static_assert((std::is_same<decltype(std::floor((unsigned short)0)), double>::value), "");328    static_assert((std::is_same<decltype(std::floor((int)0)), double>::value), "");329    static_assert((std::is_same<decltype(std::floor((unsigned int)0)), double>::value), "");330    static_assert((std::is_same<decltype(std::floor((long)0)), double>::value), "");331    static_assert((std::is_same<decltype(std::floor((unsigned long)0)), double>::value), "");332    static_assert((std::is_same<decltype(std::floor((long long)0)), double>::value), "");333    static_assert((std::is_same<decltype(std::floor((unsigned long long)0)), double>::value), "");334    static_assert((std::is_same<decltype(std::floor((double)0)), double>::value), "");335    static_assert((std::is_same<decltype(std::floor((long double)0)), long double>::value), "");336    static_assert((std::is_same<decltype(std::floorf(0)), float>::value), "");337    static_assert((std::is_same<decltype(std::floorl(0)), long double>::value), "");338    static_assert((std::is_same<decltype(floor(Ambiguous())), Ambiguous>::value), "");339    assert(std::floor(1) == 1);340}341 342void test_fmod()343{344    static_assert((std::is_same<decltype(std::fmod((float)0, (float)0)), float>::value), "");345    static_assert((std::is_same<decltype(std::fmod((bool)0, (float)0)), double>::value), "");346    static_assert((std::is_same<decltype(std::fmod((unsigned short)0, (double)0)), double>::value), "");347    static_assert((std::is_same<decltype(std::fmod((int)0, (long double)0)), long double>::value), "");348    static_assert((std::is_same<decltype(std::fmod((float)0, (unsigned int)0)), double>::value), "");349    static_assert((std::is_same<decltype(std::fmod((double)0, (long)0)), double>::value), "");350    static_assert((std::is_same<decltype(std::fmod((long double)0, (unsigned long)0)), long double>::value), "");351    static_assert((std::is_same<decltype(std::fmod((int)0, (long long)0)), double>::value), "");352    static_assert((std::is_same<decltype(std::fmod((int)0, (unsigned long long)0)), double>::value), "");353    static_assert((std::is_same<decltype(std::fmod((double)0, (double)0)), double>::value), "");354    static_assert((std::is_same<decltype(std::fmod((long double)0, (long double)0)), long double>::value), "");355    static_assert((std::is_same<decltype(std::fmod((float)0, (double)0)), double>::value), "");356    static_assert((std::is_same<decltype(std::fmod((float)0, (long double)0)), long double>::value), "");357    static_assert((std::is_same<decltype(std::fmod((double)0, (long double)0)), long double>::value), "");358    static_assert((std::is_same<decltype(std::fmodf(0,0)), float>::value), "");359    static_assert((std::is_same<decltype(std::fmodl(0,0)), long double>::value), "");360    static_assert((std::is_same<decltype(std::fmod((int)0, (int)0)), double>::value), "");361    static_assert((std::is_same<decltype(fmod(Ambiguous(), Ambiguous())), Ambiguous>::value), "");362    assert(std::fmod(1.5,1) == .5);363}364 365void test_frexp()366{367    int ip;368    static_assert((std::is_same<decltype(std::frexp((float)0, &ip)), float>::value), "");369    static_assert((std::is_same<decltype(std::frexp((bool)0, &ip)), double>::value), "");370    static_assert((std::is_same<decltype(std::frexp((unsigned short)0, &ip)), double>::value), "");371    static_assert((std::is_same<decltype(std::frexp((int)0, &ip)), double>::value), "");372    static_assert((std::is_same<decltype(std::frexp((unsigned int)0, &ip)), double>::value), "");373    static_assert((std::is_same<decltype(std::frexp((long)0, &ip)), double>::value), "");374    static_assert((std::is_same<decltype(std::frexp((unsigned long)0, &ip)), double>::value), "");375    static_assert((std::is_same<decltype(std::frexp((long long)0, &ip)), double>::value), "");376    static_assert((std::is_same<decltype(std::frexp((unsigned long long)0, &ip)), double>::value), "");377    static_assert((std::is_same<decltype(std::frexp((double)0, &ip)), double>::value), "");378    static_assert((std::is_same<decltype(std::frexp((long double)0, &ip)), long double>::value), "");379    static_assert((std::is_same<decltype(std::frexpf(0, &ip)), float>::value), "");380    static_assert((std::is_same<decltype(std::frexpl(0, &ip)), long double>::value), "");381    static_assert((std::is_same<decltype(frexp(Ambiguous(), &ip)), Ambiguous>::value), "");382    assert(std::frexp(0, &ip) == 0);383}384 385void test_ldexp()386{387    int ip = 1;388    static_assert((std::is_same<decltype(std::ldexp((float)0, ip)), float>::value), "");389    static_assert((std::is_same<decltype(std::ldexp((bool)0, ip)), double>::value), "");390    static_assert((std::is_same<decltype(std::ldexp((unsigned short)0, ip)), double>::value), "");391    static_assert((std::is_same<decltype(std::ldexp((int)0, ip)), double>::value), "");392    static_assert((std::is_same<decltype(std::ldexp((unsigned int)0, ip)), double>::value), "");393    static_assert((std::is_same<decltype(std::ldexp((long)0, ip)), double>::value), "");394    static_assert((std::is_same<decltype(std::ldexp((unsigned long)0, ip)), double>::value), "");395    static_assert((std::is_same<decltype(std::ldexp((long long)0, ip)), double>::value), "");396    static_assert((std::is_same<decltype(std::ldexp((unsigned long long)0, ip)), double>::value), "");397    static_assert((std::is_same<decltype(std::ldexp((double)0, ip)), double>::value), "");398    static_assert((std::is_same<decltype(std::ldexp((long double)0, ip)), long double>::value), "");399    static_assert((std::is_same<decltype(std::ldexpf(0, ip)), float>::value), "");400    static_assert((std::is_same<decltype(std::ldexpl(0, ip)), long double>::value), "");401    static_assert((std::is_same<decltype(ldexp(Ambiguous(), ip)), Ambiguous>::value), "");402    assert(std::ldexp(1, ip) == 2);403}404 405void test_log()406{407    static_assert((std::is_same<decltype(std::log((float)0)), float>::value), "");408    static_assert((std::is_same<decltype(std::log((bool)0)), double>::value), "");409    static_assert((std::is_same<decltype(std::log((unsigned short)0)), double>::value), "");410    static_assert((std::is_same<decltype(std::log((int)0)), double>::value), "");411    static_assert((std::is_same<decltype(std::log((unsigned int)0)), double>::value), "");412    static_assert((std::is_same<decltype(std::log((long)0)), double>::value), "");413    static_assert((std::is_same<decltype(std::log((unsigned long)0)), double>::value), "");414    static_assert((std::is_same<decltype(std::log((long long)0)), double>::value), "");415    static_assert((std::is_same<decltype(std::log((unsigned long long)0)), double>::value), "");416    static_assert((std::is_same<decltype(std::log((double)0)), double>::value), "");417    static_assert((std::is_same<decltype(std::log((long double)0)), long double>::value), "");418    static_assert((std::is_same<decltype(std::logf(0)), float>::value), "");419    static_assert((std::is_same<decltype(std::logl(0)), long double>::value), "");420    static_assert((std::is_same<decltype(log(Ambiguous())), Ambiguous>::value), "");421    assert(std::log(1) == 0);422}423 424void test_log10()425{426    static_assert((std::is_same<decltype(std::log10((float)0)), float>::value), "");427    static_assert((std::is_same<decltype(std::log10((bool)0)), double>::value), "");428    static_assert((std::is_same<decltype(std::log10((unsigned short)0)), double>::value), "");429    static_assert((std::is_same<decltype(std::log10((int)0)), double>::value), "");430    static_assert((std::is_same<decltype(std::log10((unsigned int)0)), double>::value), "");431    static_assert((std::is_same<decltype(std::log10((long)0)), double>::value), "");432    static_assert((std::is_same<decltype(std::log10((unsigned long)0)), double>::value), "");433    static_assert((std::is_same<decltype(std::log10((long long)0)), double>::value), "");434    static_assert((std::is_same<decltype(std::log10((unsigned long long)0)), double>::value), "");435    static_assert((std::is_same<decltype(std::log10((double)0)), double>::value), "");436    static_assert((std::is_same<decltype(std::log10((long double)0)), long double>::value), "");437    static_assert((std::is_same<decltype(std::log10f(0)), float>::value), "");438    static_assert((std::is_same<decltype(std::log10l(0)), long double>::value), "");439    static_assert((std::is_same<decltype(log10(Ambiguous())), Ambiguous>::value), "");440    assert(std::log10(1) == 0);441}442 443void test_modf()444{445    static_assert((std::is_same<decltype(std::modf((float)0, (float*)0)), float>::value), "");446    static_assert((std::is_same<decltype(std::modf((double)0, (double*)0)), double>::value), "");447    static_assert((std::is_same<decltype(std::modf((long double)0, (long double*)0)), long double>::value), "");448    static_assert((std::is_same<decltype(std::modff(0, (float*)0)), float>::value), "");449    static_assert((std::is_same<decltype(std::modfl(0, (long double*)0)), long double>::value), "");450    static_assert((std::is_same<decltype(modf(Ambiguous(), (Ambiguous*)0)), Ambiguous>::value), "");451    double i;452    assert(std::modf(1., &i) == 0);453}454 455void test_pow()456{457    static_assert((std::is_same<decltype(std::pow((float)0, (float)0)), float>::value), "");458    static_assert((std::is_same<decltype(std::pow((bool)0, (float)0)), double>::value), "");459    static_assert((std::is_same<decltype(std::pow((unsigned short)0, (double)0)), double>::value), "");460    static_assert((std::is_same<decltype(std::pow((int)0, (long double)0)), long double>::value), "");461    static_assert((std::is_same<decltype(std::pow((float)0, (unsigned int)0)), double>::value), "");462    static_assert((std::is_same<decltype(std::pow((double)0, (long)0)), double>::value), "");463    static_assert((std::is_same<decltype(std::pow((long double)0, (unsigned long)0)), long double>::value), "");464    static_assert((std::is_same<decltype(std::pow((int)0, (long long)0)), double>::value), "");465    static_assert((std::is_same<decltype(std::pow((int)0, (unsigned long long)0)), double>::value), "");466    static_assert((std::is_same<decltype(std::pow((double)0, (double)0)), double>::value), "");467    static_assert((std::is_same<decltype(std::pow((long double)0, (long double)0)), long double>::value), "");468    static_assert((std::is_same<decltype(std::pow((float)0, (double)0)), double>::value), "");469    static_assert((std::is_same<decltype(std::pow((float)0, (long double)0)), long double>::value), "");470    static_assert((std::is_same<decltype(std::pow((double)0, (long double)0)), long double>::value), "");471    static_assert((std::is_same<decltype(std::powf(0,0)), float>::value), "");472    static_assert((std::is_same<decltype(std::powl(0,0)), long double>::value), "");473    static_assert((std::is_same<decltype(std::pow((int)0, (int)0)), double>::value), "");474//     static_assert((std::is_same<decltype(std::pow(Value<int>(), (int)0)), double>::value), "");475//     static_assert((std::is_same<decltype(std::pow(Value<long double>(), (float)0)), long double>::value), "");476//     static_assert((std::is_same<decltype(std::pow((float) 0, Value<float>())), float>::value), "");477    static_assert((std::is_same<decltype(pow(Ambiguous(), Ambiguous())), Ambiguous>::value), "");478    assert(std::pow(1,1) == 1);479//     assert(std::pow(Value<int,1>(), Value<float,1>())  == 1);480//     assert(std::pow(1.0f, Value<double,1>()) == 1);481//     assert(std::pow(1.0, Value<int,1>()) == 1);482//     assert(std::pow(Value<long double,1>(), 1LL) == 1);483}484 485void test_sin()486{487    static_assert((std::is_same<decltype(std::sin((float)0)), float>::value), "");488    static_assert((std::is_same<decltype(std::sin((bool)0)), double>::value), "");489    static_assert((std::is_same<decltype(std::sin((unsigned short)0)), double>::value), "");490    static_assert((std::is_same<decltype(std::sin((int)0)), double>::value), "");491    static_assert((std::is_same<decltype(std::sin((unsigned int)0)), double>::value), "");492    static_assert((std::is_same<decltype(std::sin((long)0)), double>::value), "");493    static_assert((std::is_same<decltype(std::sin((unsigned long)0)), double>::value), "");494    static_assert((std::is_same<decltype(std::sin((long long)0)), double>::value), "");495    static_assert((std::is_same<decltype(std::sin((unsigned long long)0)), double>::value), "");496    static_assert((std::is_same<decltype(std::sin((double)0)), double>::value), "");497    static_assert((std::is_same<decltype(std::sin((long double)0)), long double>::value), "");498    static_assert((std::is_same<decltype(std::sinf(0)), float>::value), "");499    static_assert((std::is_same<decltype(std::sinl(0)), long double>::value), "");500    static_assert((std::is_same<decltype(sin(Ambiguous())), Ambiguous>::value), "");501    assert(std::sin(0) == 0);502}503 504void test_sinh()505{506    static_assert((std::is_same<decltype(std::sinh((float)0)), float>::value), "");507    static_assert((std::is_same<decltype(std::sinh((bool)0)), double>::value), "");508    static_assert((std::is_same<decltype(std::sinh((unsigned short)0)), double>::value), "");509    static_assert((std::is_same<decltype(std::sinh((int)0)), double>::value), "");510    static_assert((std::is_same<decltype(std::sinh((unsigned int)0)), double>::value), "");511    static_assert((std::is_same<decltype(std::sinh((long)0)), double>::value), "");512    static_assert((std::is_same<decltype(std::sinh((unsigned long)0)), double>::value), "");513    static_assert((std::is_same<decltype(std::sinh((long long)0)), double>::value), "");514    static_assert((std::is_same<decltype(std::sinh((unsigned long long)0)), double>::value), "");515    static_assert((std::is_same<decltype(std::sinh((double)0)), double>::value), "");516    static_assert((std::is_same<decltype(std::sinh((long double)0)), long double>::value), "");517    static_assert((std::is_same<decltype(std::sinhf(0)), float>::value), "");518    static_assert((std::is_same<decltype(std::sinhl(0)), long double>::value), "");519    static_assert((std::is_same<decltype(sinh(Ambiguous())), Ambiguous>::value), "");520    assert(std::sinh(0) == 0);521}522 523void test_sqrt()524{525    static_assert((std::is_same<decltype(std::sqrt((float)0)), float>::value), "");526    static_assert((std::is_same<decltype(std::sqrt((bool)0)), double>::value), "");527    static_assert((std::is_same<decltype(std::sqrt((unsigned short)0)), double>::value), "");528    static_assert((std::is_same<decltype(std::sqrt((int)0)), double>::value), "");529    static_assert((std::is_same<decltype(std::sqrt((unsigned int)0)), double>::value), "");530    static_assert((std::is_same<decltype(std::sqrt((long)0)), double>::value), "");531    static_assert((std::is_same<decltype(std::sqrt((unsigned long)0)), double>::value), "");532    static_assert((std::is_same<decltype(std::sqrt((long long)0)), double>::value), "");533    static_assert((std::is_same<decltype(std::sqrt((unsigned long long)0)), double>::value), "");534    static_assert((std::is_same<decltype(std::sqrt((double)0)), double>::value), "");535    static_assert((std::is_same<decltype(std::sqrt((long double)0)), long double>::value), "");536    static_assert((std::is_same<decltype(std::sqrtf(0)), float>::value), "");537    static_assert((std::is_same<decltype(std::sqrtl(0)), long double>::value), "");538    static_assert((std::is_same<decltype(sqrt(Ambiguous())), Ambiguous>::value), "");539    assert(std::sqrt(4) == 2);540}541 542void test_tan()543{544    static_assert((std::is_same<decltype(std::tan((float)0)), float>::value), "");545    static_assert((std::is_same<decltype(std::tan((bool)0)), double>::value), "");546    static_assert((std::is_same<decltype(std::tan((unsigned short)0)), double>::value), "");547    static_assert((std::is_same<decltype(std::tan((int)0)), double>::value), "");548    static_assert((std::is_same<decltype(std::tan((unsigned int)0)), double>::value), "");549    static_assert((std::is_same<decltype(std::tan((long)0)), double>::value), "");550    static_assert((std::is_same<decltype(std::tan((unsigned long)0)), double>::value), "");551    static_assert((std::is_same<decltype(std::tan((long long)0)), double>::value), "");552    static_assert((std::is_same<decltype(std::tan((unsigned long long)0)), double>::value), "");553    static_assert((std::is_same<decltype(std::tan((double)0)), double>::value), "");554    static_assert((std::is_same<decltype(std::tan((long double)0)), long double>::value), "");555    static_assert((std::is_same<decltype(std::tanf(0)), float>::value), "");556    static_assert((std::is_same<decltype(std::tanl(0)), long double>::value), "");557    static_assert((std::is_same<decltype(tan(Ambiguous())), Ambiguous>::value), "");558    assert(std::tan(0) == 0);559}560 561void test_tanh()562{563    static_assert((std::is_same<decltype(std::tanh((float)0)), float>::value), "");564    static_assert((std::is_same<decltype(std::tanh((bool)0)), double>::value), "");565    static_assert((std::is_same<decltype(std::tanh((unsigned short)0)), double>::value), "");566    static_assert((std::is_same<decltype(std::tanh((int)0)), double>::value), "");567    static_assert((std::is_same<decltype(std::tanh((unsigned int)0)), double>::value), "");568    static_assert((std::is_same<decltype(std::tanh((long)0)), double>::value), "");569    static_assert((std::is_same<decltype(std::tanh((unsigned long)0)), double>::value), "");570    static_assert((std::is_same<decltype(std::tanh((long long)0)), double>::value), "");571    static_assert((std::is_same<decltype(std::tanh((unsigned long long)0)), double>::value), "");572    static_assert((std::is_same<decltype(std::tanh((double)0)), double>::value), "");573    static_assert((std::is_same<decltype(std::tanh((long double)0)), long double>::value), "");574    static_assert((std::is_same<decltype(std::tanhf(0)), float>::value), "");575    static_assert((std::is_same<decltype(std::tanhl(0)), long double>::value), "");576    static_assert((std::is_same<decltype(tanh(Ambiguous())), Ambiguous>::value), "");577    assert(std::tanh(0) == 0);578}579 580void test_signbit()581{582#ifdef signbit583#error signbit defined584#endif585    static_assert((std::is_same<decltype(std::signbit((float)0)), bool>::value), "");586    static_assert((std::is_same<decltype(std::signbit((double)0)), bool>::value), "");587    static_assert((std::is_same<decltype(std::signbit(0)), bool>::value), "");588    static_assert((std::is_same<decltype(std::signbit((long double)0)), bool>::value), "");589    static_assert((std::is_same<decltype(signbit(Ambiguous())), Ambiguous>::value), "");590    assert(std::signbit(-1.0) == true);591    assert(std::signbit(0u) == false);592    assert(std::signbit(std::numeric_limits<unsigned>::max()) == false);593    assert(std::signbit(0) == false);594    assert(std::signbit(1) == false);595    assert(std::signbit(-1) == true);596    assert(std::signbit(std::numeric_limits<int>::max()) == false);597    assert(std::signbit(std::numeric_limits<int>::min()) == true);598}599 600void test_fpclassify()601{602#ifdef fpclassify603#error fpclassify defined604#endif605    static_assert((std::is_same<decltype(std::fpclassify((float)0)), int>::value), "");606    static_assert((std::is_same<decltype(std::fpclassify((double)0)), int>::value), "");607    static_assert((std::is_same<decltype(std::fpclassify(0)), int>::value), "");608    static_assert((std::is_same<decltype(std::fpclassify((long double)0)), int>::value), "");609    static_assert((std::is_same<decltype(fpclassify(Ambiguous())), Ambiguous>::value), "");610    static_assert((std::is_same<decltype(fpclassify(Value<float>())), int>::value), "");611    static_assert((std::is_same<decltype(fpclassify(Value<double>())), int>::value), "");612    static_assert((std::is_same<decltype(fpclassify(Value<long double>())), int>::value), "");613    ASSERT_NOEXCEPT(std::fpclassify((float)0));614    ASSERT_NOEXCEPT(std::fpclassify((double)0));615    ASSERT_NOEXCEPT(std::fpclassify((long double)0));616    ASSERT_NOEXCEPT(std::fpclassify(0));617    assert(std::fpclassify(-1.0) == FP_NORMAL);618    assert(std::fpclassify(0) == FP_ZERO);619    assert(std::fpclassify(1) == FP_NORMAL);620    assert(std::fpclassify(-1) == FP_NORMAL);621    assert(std::fpclassify(std::numeric_limits<int>::max()) == FP_NORMAL);622    assert(std::fpclassify(std::numeric_limits<int>::min()) == FP_NORMAL);623    assert(std::fpclassify(Value<double, 1>()) == FP_NORMAL);624}625 626void test_isfinite()627{628#ifdef isfinite629#error isfinite defined630#endif631    static_assert((std::is_same<decltype(std::isfinite((float)0)), bool>::value), "");632    static_assert((std::is_same<decltype(std::isfinite((double)0)), bool>::value), "");633    static_assert((std::is_same<decltype(std::isfinite(0)), bool>::value), "");634    static_assert((std::is_same<decltype(std::isfinite((long double)0)), bool>::value), "");635    static_assert((std::is_same<decltype(isfinite(Ambiguous())), Ambiguous>::value), "");636    assert(std::isfinite(-1.0) == true);637    assert(std::isfinite(0) == true);638    assert(std::isfinite(1) == true);639    assert(std::isfinite(-1) == true);640    assert(std::isfinite(std::numeric_limits<int>::max()) == true);641    assert(std::isfinite(std::numeric_limits<int>::min()) == true);642}643 644void test_isnormal()645{646#ifdef isnormal647#error isnormal defined648#endif649    static_assert((std::is_same<decltype(std::isnormal((float)0)), bool>::value), "");650    static_assert((std::is_same<decltype(std::isnormal((double)0)), bool>::value), "");651    static_assert((std::is_same<decltype(std::isnormal(0)), bool>::value), "");652    static_assert((std::is_same<decltype(std::isnormal((long double)0)), bool>::value), "");653    static_assert((std::is_same<decltype(isnormal(Ambiguous())), Ambiguous>::value), "");654    assert(std::isnormal(-1.0) == true);655    assert(std::isnormal(0) == false);656    assert(std::isnormal(1) == true);657    assert(std::isnormal(-1) == true);658    assert(std::isnormal(std::numeric_limits<int>::max()) == true);659    assert(std::isnormal(std::numeric_limits<int>::min()) == true);660}661 662void test_isgreater()663{664#ifdef isgreater665#error isgreater defined666#endif667    static_assert((std::is_same<decltype(std::isgreater((float)0, (float)0)), bool>::value), "");668    static_assert((std::is_same<decltype(std::isgreater((float)0, (double)0)), bool>::value), "");669    static_assert((std::is_same<decltype(std::isgreater((float)0, (long double)0)), bool>::value), "");670    static_assert((std::is_same<decltype(std::isgreater((double)0, (float)0)), bool>::value), "");671    static_assert((std::is_same<decltype(std::isgreater((double)0, (double)0)), bool>::value), "");672    static_assert((std::is_same<decltype(std::isgreater(0, (double)0)), bool>::value), "");673    static_assert((std::is_same<decltype(std::isgreater((double)0, (long double)0)), bool>::value), "");674    static_assert((std::is_same<decltype(std::isgreater((long double)0, (float)0)), bool>::value), "");675    static_assert((std::is_same<decltype(std::isgreater((long double)0, (double)0)), bool>::value), "");676    static_assert((std::is_same<decltype(std::isgreater((long double)0, (long double)0)), bool>::value), "");677    static_assert((std::is_same<decltype(isgreater(Ambiguous(), Ambiguous())), Ambiguous>::value), "");678    assert(std::isgreater(-1.0, 0.F) == false);679}680 681void test_isgreaterequal()682{683#ifdef isgreaterequal684#error isgreaterequal defined685#endif686    static_assert((std::is_same<decltype(std::isgreaterequal((float)0, (float)0)), bool>::value), "");687    static_assert((std::is_same<decltype(std::isgreaterequal((float)0, (double)0)), bool>::value), "");688    static_assert((std::is_same<decltype(std::isgreaterequal((float)0, (long double)0)), bool>::value), "");689    static_assert((std::is_same<decltype(std::isgreaterequal((double)0, (float)0)), bool>::value), "");690    static_assert((std::is_same<decltype(std::isgreaterequal((double)0, (double)0)), bool>::value), "");691    static_assert((std::is_same<decltype(std::isgreaterequal(0, (double)0)), bool>::value), "");692    static_assert((std::is_same<decltype(std::isgreaterequal((double)0, (long double)0)), bool>::value), "");693    static_assert((std::is_same<decltype(std::isgreaterequal((long double)0, (float)0)), bool>::value), "");694    static_assert((std::is_same<decltype(std::isgreaterequal((long double)0, (double)0)), bool>::value), "");695    static_assert((std::is_same<decltype(std::isgreaterequal((long double)0, (long double)0)), bool>::value), "");696    static_assert((std::is_same<decltype(isgreaterequal(Ambiguous(), Ambiguous())), Ambiguous>::value), "");697    assert(std::isgreaterequal(-1.0, 0.F) == false);698}699 700void test_isinf()701{702#ifdef isinf703#error isinf defined704#endif705    static_assert((std::is_same<decltype(std::isinf((float)0)), bool>::value), "");706 707    typedef decltype(std::isinf((double)0)) DoubleRetType;708#if defined(__GLIBC__) && TEST_STD_VER == 03 && defined(TEST_COMPILER_CLANG)709    // GLIBC < 2.23 defines 'isinf(double)' with a return type of 'int' in710    // all C++ dialects. The test should tolerate this when libc++ can't work711    // around it via `_LIBCPP_PREFERRED_OVERLOAD`, which is only available712    // in modern versions of Clang, and not elsewhere.713    // See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439714    static_assert((std::is_same<DoubleRetType, bool>::value715                || std::is_same<DoubleRetType, int>::value), "");716#else717    static_assert((std::is_same<DoubleRetType, bool>::value), "");718#endif719 720    static_assert((std::is_same<decltype(std::isinf(0)), bool>::value), "");721    static_assert((std::is_same<decltype(std::isinf((long double)0)), bool>::value), "");722    assert(std::isinf(-1.0) == false);723    assert(std::isinf(0) == false);724    assert(std::isinf(1) == false);725    assert(std::isinf(-1) == false);726    assert(std::isinf(std::numeric_limits<int>::max()) == false);727    assert(std::isinf(std::numeric_limits<int>::min()) == false);728}729 730void test_isless()731{732#ifdef isless733#error isless defined734#endif735    static_assert((std::is_same<decltype(std::isless((float)0, (float)0)), bool>::value), "");736    static_assert((std::is_same<decltype(std::isless((float)0, (double)0)), bool>::value), "");737    static_assert((std::is_same<decltype(std::isless((float)0, (long double)0)), bool>::value), "");738    static_assert((std::is_same<decltype(std::isless((double)0, (float)0)), bool>::value), "");739    static_assert((std::is_same<decltype(std::isless((double)0, (double)0)), bool>::value), "");740    static_assert((std::is_same<decltype(std::isless(0, (double)0)), bool>::value), "");741    static_assert((std::is_same<decltype(std::isless((double)0, (long double)0)), bool>::value), "");742    static_assert((std::is_same<decltype(std::isless((long double)0, (float)0)), bool>::value), "");743    static_assert((std::is_same<decltype(std::isless((long double)0, (double)0)), bool>::value), "");744    static_assert((std::is_same<decltype(std::isless((long double)0, (long double)0)), bool>::value), "");745    static_assert((std::is_same<decltype(isless(Ambiguous(), Ambiguous())), Ambiguous>::value), "");746    assert(std::isless(-1.0, 0.F) == true);747}748 749void test_islessequal()750{751#ifdef islessequal752#error islessequal defined753#endif754    static_assert((std::is_same<decltype(std::islessequal((float)0, (float)0)), bool>::value), "");755    static_assert((std::is_same<decltype(std::islessequal((float)0, (double)0)), bool>::value), "");756    static_assert((std::is_same<decltype(std::islessequal((float)0, (long double)0)), bool>::value), "");757    static_assert((std::is_same<decltype(std::islessequal((double)0, (float)0)), bool>::value), "");758    static_assert((std::is_same<decltype(std::islessequal((double)0, (double)0)), bool>::value), "");759    static_assert((std::is_same<decltype(std::islessequal(0, (double)0)), bool>::value), "");760    static_assert((std::is_same<decltype(std::islessequal((double)0, (long double)0)), bool>::value), "");761    static_assert((std::is_same<decltype(std::islessequal((long double)0, (float)0)), bool>::value), "");762    static_assert((std::is_same<decltype(std::islessequal((long double)0, (double)0)), bool>::value), "");763    static_assert((std::is_same<decltype(std::islessequal((long double)0, (long double)0)), bool>::value), "");764    static_assert((std::is_same<decltype(islessequal(Ambiguous(), Ambiguous())), Ambiguous>::value), "");765    assert(std::islessequal(-1.0, 0.F) == true);766}767 768void test_islessgreater()769{770#ifdef islessgreater771#error islessgreater defined772#endif773    static_assert((std::is_same<decltype(std::islessgreater((float)0, (float)0)), bool>::value), "");774    static_assert((std::is_same<decltype(std::islessgreater((float)0, (double)0)), bool>::value), "");775    static_assert((std::is_same<decltype(std::islessgreater((float)0, (long double)0)), bool>::value), "");776    static_assert((std::is_same<decltype(std::islessgreater((double)0, (float)0)), bool>::value), "");777    static_assert((std::is_same<decltype(std::islessgreater((double)0, (double)0)), bool>::value), "");778    static_assert((std::is_same<decltype(std::islessgreater(0, (double)0)), bool>::value), "");779    static_assert((std::is_same<decltype(std::islessgreater((double)0, (long double)0)), bool>::value), "");780    static_assert((std::is_same<decltype(std::islessgreater((long double)0, (float)0)), bool>::value), "");781    static_assert((std::is_same<decltype(std::islessgreater((long double)0, (double)0)), bool>::value), "");782    static_assert((std::is_same<decltype(std::islessgreater((long double)0, (long double)0)), bool>::value), "");783    static_assert((std::is_same<decltype(islessgreater(Ambiguous(), Ambiguous())), Ambiguous>::value), "");784    assert(std::islessgreater(-1.0, 0.F) == true);785}786 787void test_isnan()788{789#ifdef isnan790#error isnan defined791#endif792    static_assert((std::is_same<decltype(std::isnan((float)0)), bool>::value), "");793 794    typedef decltype(std::isnan((double)0)) DoubleRetType;795#if defined(__GLIBC__) && TEST_STD_VER == 03 && defined(TEST_COMPILER_CLANG)796    // GLIBC < 2.23 defines 'isnan(double)' with a return type of 'int' in797    // all C++ dialects. The test should tolerate this when libc++ can't work798    // around it via `_LIBCPP_PREFERRED_OVERLOAD`, which is only available799    // in modern versions of Clang, and not elsewhere.800    // See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439801    static_assert((std::is_same<DoubleRetType, bool>::value802                || std::is_same<DoubleRetType, int>::value), "");803#else804    static_assert((std::is_same<DoubleRetType, bool>::value), "");805#endif806 807    static_assert((std::is_same<decltype(std::isnan(0)), bool>::value), "");808    static_assert((std::is_same<decltype(std::isnan((long double)0)), bool>::value), "");809    assert(std::isnan(-1.0) == false);810    assert(std::isnan(0) == false);811    assert(std::isnan(1) == false);812    assert(std::isnan(-1) == false);813    assert(std::isnan(std::numeric_limits<int>::max()) == false);814    assert(std::isnan(std::numeric_limits<int>::min()) == false);815}816 817void test_isunordered()818{819#ifdef isunordered820#error isunordered defined821#endif822    static_assert((std::is_same<decltype(std::isunordered((float)0, (float)0)), bool>::value), "");823    static_assert((std::is_same<decltype(std::isunordered((float)0, (double)0)), bool>::value), "");824    static_assert((std::is_same<decltype(std::isunordered((float)0, (long double)0)), bool>::value), "");825    static_assert((std::is_same<decltype(std::isunordered((double)0, (float)0)), bool>::value), "");826    static_assert((std::is_same<decltype(std::isunordered((double)0, (double)0)), bool>::value), "");827    static_assert((std::is_same<decltype(std::isunordered(0, (double)0)), bool>::value), "");828    static_assert((std::is_same<decltype(std::isunordered((double)0, (long double)0)), bool>::value), "");829    static_assert((std::is_same<decltype(std::isunordered((long double)0, (float)0)), bool>::value), "");830    static_assert((std::is_same<decltype(std::isunordered((long double)0, (double)0)), bool>::value), "");831    static_assert((std::is_same<decltype(std::isunordered((long double)0, (long double)0)), bool>::value), "");832    static_assert((std::is_same<decltype(isunordered(Ambiguous(), Ambiguous())), Ambiguous>::value), "");833    assert(std::isunordered(-1.0, 0.F) == false);834}835 836void test_acosh()837{838    static_assert((std::is_same<decltype(std::acosh((float)0)), float>::value), "");839    static_assert((std::is_same<decltype(std::acosh((bool)0)), double>::value), "");840    static_assert((std::is_same<decltype(std::acosh((unsigned short)0)), double>::value), "");841    static_assert((std::is_same<decltype(std::acosh((int)0)), double>::value), "");842    static_assert((std::is_same<decltype(std::acosh((unsigned int)0)), double>::value), "");843    static_assert((std::is_same<decltype(std::acosh((long)0)), double>::value), "");844    static_assert((std::is_same<decltype(std::acosh((unsigned long)0)), double>::value), "");845    static_assert((std::is_same<decltype(std::acosh((long long)0)), double>::value), "");846    static_assert((std::is_same<decltype(std::acosh((unsigned long long)0)), double>::value), "");847    static_assert((std::is_same<decltype(std::acosh((double)0)), double>::value), "");848    static_assert((std::is_same<decltype(std::acosh((long double)0)), long double>::value), "");849    static_assert((std::is_same<decltype(std::acoshf(0)), float>::value), "");850    static_assert((std::is_same<decltype(std::acoshl(0)), long double>::value), "");851    static_assert((std::is_same<decltype(acosh(Ambiguous())), Ambiguous>::value), "");852    assert(std::acosh(1) == 0);853}854 855void test_asinh()856{857    static_assert((std::is_same<decltype(std::asinh((float)0)), float>::value), "");858    static_assert((std::is_same<decltype(std::asinh((bool)0)), double>::value), "");859    static_assert((std::is_same<decltype(std::asinh((unsigned short)0)), double>::value), "");860    static_assert((std::is_same<decltype(std::asinh((int)0)), double>::value), "");861    static_assert((std::is_same<decltype(std::asinh((unsigned int)0)), double>::value), "");862    static_assert((std::is_same<decltype(std::asinh((long)0)), double>::value), "");863    static_assert((std::is_same<decltype(std::asinh((unsigned long)0)), double>::value), "");864    static_assert((std::is_same<decltype(std::asinh((long long)0)), double>::value), "");865    static_assert((std::is_same<decltype(std::asinh((unsigned long long)0)), double>::value), "");866    static_assert((std::is_same<decltype(std::asinh((double)0)), double>::value), "");867    static_assert((std::is_same<decltype(std::asinh((long double)0)), long double>::value), "");868    static_assert((std::is_same<decltype(std::asinhf(0)), float>::value), "");869    static_assert((std::is_same<decltype(std::asinhl(0)), long double>::value), "");870    static_assert((std::is_same<decltype(asinh(Ambiguous())), Ambiguous>::value), "");871    assert(std::asinh(0) == 0);872}873 874void test_atanh()875{876    static_assert((std::is_same<decltype(std::atanh((float)0)), float>::value), "");877    static_assert((std::is_same<decltype(std::atanh((bool)0)), double>::value), "");878    static_assert((std::is_same<decltype(std::atanh((unsigned short)0)), double>::value), "");879    static_assert((std::is_same<decltype(std::atanh((int)0)), double>::value), "");880    static_assert((std::is_same<decltype(std::atanh((unsigned int)0)), double>::value), "");881    static_assert((std::is_same<decltype(std::atanh((long)0)), double>::value), "");882    static_assert((std::is_same<decltype(std::atanh((unsigned long)0)), double>::value), "");883    static_assert((std::is_same<decltype(std::atanh((long long)0)), double>::value), "");884    static_assert((std::is_same<decltype(std::atanh((unsigned long long)0)), double>::value), "");885    static_assert((std::is_same<decltype(std::atanh((double)0)), double>::value), "");886    static_assert((std::is_same<decltype(std::atanh((long double)0)), long double>::value), "");887    static_assert((std::is_same<decltype(std::atanhf(0)), float>::value), "");888    static_assert((std::is_same<decltype(std::atanhl(0)), long double>::value), "");889    static_assert((std::is_same<decltype(atanh(Ambiguous())), Ambiguous>::value), "");890    assert(std::atanh(0) == 0);891}892 893void test_cbrt()894{895    static_assert((std::is_same<decltype(std::cbrt((float)0)), float>::value), "");896    static_assert((std::is_same<decltype(std::cbrt((bool)0)), double>::value), "");897    static_assert((std::is_same<decltype(std::cbrt((unsigned short)0)), double>::value), "");898    static_assert((std::is_same<decltype(std::cbrt((int)0)), double>::value), "");899    static_assert((std::is_same<decltype(std::cbrt((unsigned int)0)), double>::value), "");900    static_assert((std::is_same<decltype(std::cbrt((long)0)), double>::value), "");901    static_assert((std::is_same<decltype(std::cbrt((unsigned long)0)), double>::value), "");902    static_assert((std::is_same<decltype(std::cbrt((long long)0)), double>::value), "");903    static_assert((std::is_same<decltype(std::cbrt((unsigned long long)0)), double>::value), "");904    static_assert((std::is_same<decltype(std::cbrt((double)0)), double>::value), "");905    static_assert((std::is_same<decltype(std::cbrt((long double)0)), long double>::value), "");906    static_assert((std::is_same<decltype(std::cbrtf(0)), float>::value), "");907    static_assert((std::is_same<decltype(std::cbrtl(0)), long double>::value), "");908    static_assert((std::is_same<decltype(cbrt(Ambiguous())), Ambiguous>::value), "");909    assert(truncate_fp(std::cbrt(1)) == 1);910}911 912void test_copysign()913{914    static_assert((std::is_same<decltype(std::copysign((float)0, (float)0)), float>::value), "");915    static_assert((std::is_same<decltype(std::copysign((bool)0, (float)0)), double>::value), "");916    static_assert((std::is_same<decltype(std::copysign((unsigned short)0, (double)0)), double>::value), "");917    static_assert((std::is_same<decltype(std::copysign((int)0, (long double)0)), long double>::value), "");918    static_assert((std::is_same<decltype(std::copysign((float)0, (unsigned int)0)), double>::value), "");919    static_assert((std::is_same<decltype(std::copysign((double)0, (long)0)), double>::value), "");920    static_assert((std::is_same<decltype(std::copysign((long double)0, (unsigned long)0)), long double>::value), "");921    static_assert((std::is_same<decltype(std::copysign((int)0, (long long)0)), double>::value), "");922    static_assert((std::is_same<decltype(std::copysign((int)0, (unsigned long long)0)), double>::value), "");923    static_assert((std::is_same<decltype(std::copysign((double)0, (double)0)), double>::value), "");924    static_assert((std::is_same<decltype(std::copysign((long double)0, (long double)0)), long double>::value), "");925    static_assert((std::is_same<decltype(std::copysign((float)0, (double)0)), double>::value), "");926    static_assert((std::is_same<decltype(std::copysign((float)0, (long double)0)), long double>::value), "");927    static_assert((std::is_same<decltype(std::copysign((double)0, (long double)0)), long double>::value), "");928    static_assert((std::is_same<decltype(std::copysignf(0,0)), float>::value), "");929    static_assert((std::is_same<decltype(std::copysignl(0,0)), long double>::value), "");930    static_assert((std::is_same<decltype(std::copysign((int)0, (int)0)), double>::value), "");931    static_assert((std::is_same<decltype(copysign(Ambiguous(), Ambiguous())), Ambiguous>::value), "");932    assert(std::copysign(1,1) == 1);933}934 935void test_erf()936{937    static_assert((std::is_same<decltype(std::erf((float)0)), float>::value), "");938    static_assert((std::is_same<decltype(std::erf((bool)0)), double>::value), "");939    static_assert((std::is_same<decltype(std::erf((unsigned short)0)), double>::value), "");940    static_assert((std::is_same<decltype(std::erf((int)0)), double>::value), "");941    static_assert((std::is_same<decltype(std::erf((unsigned int)0)), double>::value), "");942    static_assert((std::is_same<decltype(std::erf((long)0)), double>::value), "");943    static_assert((std::is_same<decltype(std::erf((unsigned long)0)), double>::value), "");944    static_assert((std::is_same<decltype(std::erf((long long)0)), double>::value), "");945    static_assert((std::is_same<decltype(std::erf((unsigned long long)0)), double>::value), "");946    static_assert((std::is_same<decltype(std::erf((double)0)), double>::value), "");947    static_assert((std::is_same<decltype(std::erf((long double)0)), long double>::value), "");948    static_assert((std::is_same<decltype(std::erff(0)), float>::value), "");949    static_assert((std::is_same<decltype(std::erfl(0)), long double>::value), "");950    static_assert((std::is_same<decltype(erf(Ambiguous())), Ambiguous>::value), "");951    assert(std::erf(0) == 0);952}953 954void test_erfc()955{956    static_assert((std::is_same<decltype(std::erfc((float)0)), float>::value), "");957    static_assert((std::is_same<decltype(std::erfc((bool)0)), double>::value), "");958    static_assert((std::is_same<decltype(std::erfc((unsigned short)0)), double>::value), "");959    static_assert((std::is_same<decltype(std::erfc((int)0)), double>::value), "");960    static_assert((std::is_same<decltype(std::erfc((unsigned int)0)), double>::value), "");961    static_assert((std::is_same<decltype(std::erfc((long)0)), double>::value), "");962    static_assert((std::is_same<decltype(std::erfc((unsigned long)0)), double>::value), "");963    static_assert((std::is_same<decltype(std::erfc((long long)0)), double>::value), "");964    static_assert((std::is_same<decltype(std::erfc((unsigned long long)0)), double>::value), "");965    static_assert((std::is_same<decltype(std::erfc((double)0)), double>::value), "");966    static_assert((std::is_same<decltype(std::erfc((long double)0)), long double>::value), "");967    static_assert((std::is_same<decltype(std::erfcf(0)), float>::value), "");968    static_assert((std::is_same<decltype(std::erfcl(0)), long double>::value), "");969    static_assert((std::is_same<decltype(erfc(Ambiguous())), Ambiguous>::value), "");970    assert(std::erfc(0) == 1);971}972 973void test_exp2()974{975    static_assert((std::is_same<decltype(std::exp2((float)0)), float>::value), "");976    static_assert((std::is_same<decltype(std::exp2((bool)0)), double>::value), "");977    static_assert((std::is_same<decltype(std::exp2((unsigned short)0)), double>::value), "");978    static_assert((std::is_same<decltype(std::exp2((int)0)), double>::value), "");979    static_assert((std::is_same<decltype(std::exp2((unsigned int)0)), double>::value), "");980    static_assert((std::is_same<decltype(std::exp2((long)0)), double>::value), "");981    static_assert((std::is_same<decltype(std::exp2((unsigned long)0)), double>::value), "");982    static_assert((std::is_same<decltype(std::exp2((long long)0)), double>::value), "");983    static_assert((std::is_same<decltype(std::exp2((unsigned long long)0)), double>::value), "");984    static_assert((std::is_same<decltype(std::exp2((double)0)), double>::value), "");985    static_assert((std::is_same<decltype(std::exp2((long double)0)), long double>::value), "");986    static_assert((std::is_same<decltype(std::exp2f(0)), float>::value), "");987    static_assert((std::is_same<decltype(std::exp2l(0)), long double>::value), "");988    static_assert((std::is_same<decltype(exp2(Ambiguous())), Ambiguous>::value), "");989    assert(std::exp2(1) == 2);990}991 992void test_expm1()993{994    static_assert((std::is_same<decltype(std::expm1((float)0)), float>::value), "");995    static_assert((std::is_same<decltype(std::expm1((bool)0)), double>::value), "");996    static_assert((std::is_same<decltype(std::expm1((unsigned short)0)), double>::value), "");997    static_assert((std::is_same<decltype(std::expm1((int)0)), double>::value), "");998    static_assert((std::is_same<decltype(std::expm1((unsigned int)0)), double>::value), "");999    static_assert((std::is_same<decltype(std::expm1((long)0)), double>::value), "");1000    static_assert((std::is_same<decltype(std::expm1((unsigned long)0)), double>::value), "");1001    static_assert((std::is_same<decltype(std::expm1((long long)0)), double>::value), "");1002    static_assert((std::is_same<decltype(std::expm1((unsigned long long)0)), double>::value), "");1003    static_assert((std::is_same<decltype(std::expm1((double)0)), double>::value), "");1004    static_assert((std::is_same<decltype(std::expm1((long double)0)), long double>::value), "");1005    static_assert((std::is_same<decltype(std::expm1f(0)), float>::value), "");1006    static_assert((std::is_same<decltype(std::expm1l(0)), long double>::value), "");1007    static_assert((std::is_same<decltype(expm1(Ambiguous())), Ambiguous>::value), "");1008    assert(std::expm1(0) == 0);1009}1010 1011void test_fdim()1012{1013    static_assert((std::is_same<decltype(std::fdim((float)0, (float)0)), float>::value), "");1014    static_assert((std::is_same<decltype(std::fdim((bool)0, (float)0)), double>::value), "");1015    static_assert((std::is_same<decltype(std::fdim((unsigned short)0, (double)0)), double>::value), "");1016    static_assert((std::is_same<decltype(std::fdim((int)0, (long double)0)), long double>::value), "");1017    static_assert((std::is_same<decltype(std::fdim((float)0, (unsigned int)0)), double>::value), "");1018    static_assert((std::is_same<decltype(std::fdim((double)0, (long)0)), double>::value), "");1019    static_assert((std::is_same<decltype(std::fdim((long double)0, (unsigned long)0)), long double>::value), "");1020    static_assert((std::is_same<decltype(std::fdim((int)0, (long long)0)), double>::value), "");1021    static_assert((std::is_same<decltype(std::fdim((int)0, (unsigned long long)0)), double>::value), "");1022    static_assert((std::is_same<decltype(std::fdim((double)0, (double)0)), double>::value), "");1023    static_assert((std::is_same<decltype(std::fdim((long double)0, (long double)0)), long double>::value), "");1024    static_assert((std::is_same<decltype(std::fdim((float)0, (double)0)), double>::value), "");1025    static_assert((std::is_same<decltype(std::fdim((float)0, (long double)0)), long double>::value), "");1026    static_assert((std::is_same<decltype(std::fdim((double)0, (long double)0)), long double>::value), "");1027    static_assert((std::is_same<decltype(std::fdimf(0,0)), float>::value), "");1028    static_assert((std::is_same<decltype(std::fdiml(0,0)), long double>::value), "");1029    static_assert((std::is_same<decltype(std::fdim((int)0, (int)0)), double>::value), "");1030    static_assert((std::is_same<decltype(fdim(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1031    assert(std::fdim(1,0) == 1);1032}1033 1034void test_fma()1035{1036    static_assert((std::is_same<decltype(std::fma((bool)0, (float)0, (float)0)), double>::value), "");1037    static_assert((std::is_same<decltype(std::fma((char)0, (float)0, (float)0)), double>::value), "");1038    static_assert((std::is_same<decltype(std::fma((unsigned)0, (float)0, (float)0)), double>::value), "");1039    static_assert((std::is_same<decltype(std::fma((float)0, (int)0, (float)0)), double>::value), "");1040    static_assert((std::is_same<decltype(std::fma((float)0, (long)0, (float)0)), double>::value), "");1041    static_assert((std::is_same<decltype(std::fma((float)0, (float)0, (unsigned long long)0)), double>::value), "");1042    static_assert((std::is_same<decltype(std::fma((float)0, (float)0, (double)0)), double>::value), "");1043    static_assert((std::is_same<decltype(std::fma((float)0, (float)0, (long double)0)), long double>::value), "");1044    static_assert((std::is_same<decltype(std::fma((float)0, (float)0, (float)0)), float>::value), "");1045 1046    static_assert((std::is_same<decltype(std::fma((bool)0, (double)0, (double)0)), double>::value), "");1047    static_assert((std::is_same<decltype(std::fma((char)0, (double)0, (double)0)), double>::value), "");1048    static_assert((std::is_same<decltype(std::fma((unsigned)0, (double)0, (double)0)), double>::value), "");1049    static_assert((std::is_same<decltype(std::fma((double)0, (int)0, (double)0)), double>::value), "");1050    static_assert((std::is_same<decltype(std::fma((double)0, (long)0, (double)0)), double>::value), "");1051    static_assert((std::is_same<decltype(std::fma((double)0, (double)0, (unsigned long long)0)), double>::value), "");1052    static_assert((std::is_same<decltype(std::fma((double)0, (double)0, (float)0)), double>::value), "");1053    static_assert((std::is_same<decltype(std::fma((double)0, (double)0, (long double)0)), long double>::value), "");1054    static_assert((std::is_same<decltype(std::fma((double)0, (double)0,  (double)0)), double>::value), "");1055 1056    static_assert((std::is_same<decltype(std::fma((bool)0, (long double)0, (long double)0)), long double>::value), "");1057    static_assert((std::is_same<decltype(std::fma((char)0, (long double)0, (long double)0)), long double>::value), "");1058    static_assert((std::is_same<decltype(std::fma((unsigned)0, (long double)0, (long double)0)), long double>::value), "");1059    static_assert((std::is_same<decltype(std::fma((long double)0, (int)0, (long double)0)), long double>::value), "");1060    static_assert((std::is_same<decltype(std::fma((long double)0, (long)0, (long double)0)), long double>::value), "");1061    static_assert((std::is_same<decltype(std::fma((long double)0, (long double)0, (unsigned long long)0)), long double>::value), "");1062    static_assert((std::is_same<decltype(std::fma((long double)0, (long double)0, (float)0)), long double>::value), "");1063    static_assert((std::is_same<decltype(std::fma((double)0, (long double)0, (long double)0)), long double>::value), "");1064    static_assert((std::is_same<decltype(std::fma((long double)0, (long double)0, (long double)0)), long double>::value), "");1065 1066    static_assert((std::is_same<decltype(std::fmaf(0,0,0)), float>::value), "");1067    static_assert((std::is_same<decltype(std::fmal(0,0,0)), long double>::value), "");1068    static_assert((std::is_same<decltype(fma(Ambiguous(), Ambiguous(), Ambiguous())), Ambiguous>::value), "");1069    assert(std::fma(1,1,1) == 2);1070}1071 1072void test_fmax()1073{1074    static_assert((std::is_same<decltype(std::fmax((float)0, (float)0)), float>::value), "");1075    static_assert((std::is_same<decltype(std::fmax((bool)0, (float)0)), double>::value), "");1076    static_assert((std::is_same<decltype(std::fmax((unsigned short)0, (double)0)), double>::value), "");1077    static_assert((std::is_same<decltype(std::fmax((int)0, (long double)0)), long double>::value), "");1078    static_assert((std::is_same<decltype(std::fmax((float)0, (unsigned int)0)), double>::value), "");1079    static_assert((std::is_same<decltype(std::fmax((double)0, (long)0)), double>::value), "");1080    static_assert((std::is_same<decltype(std::fmax((long double)0, (unsigned long)0)), long double>::value), "");1081    static_assert((std::is_same<decltype(std::fmax((int)0, (long long)0)), double>::value), "");1082    static_assert((std::is_same<decltype(std::fmax((int)0, (unsigned long long)0)), double>::value), "");1083    static_assert((std::is_same<decltype(std::fmax((double)0, (double)0)), double>::value), "");1084    static_assert((std::is_same<decltype(std::fmax((long double)0, (long double)0)), long double>::value), "");1085    static_assert((std::is_same<decltype(std::fmax((float)0, (double)0)), double>::value), "");1086    static_assert((std::is_same<decltype(std::fmax((float)0, (long double)0)), long double>::value), "");1087    static_assert((std::is_same<decltype(std::fmax((double)0, (long double)0)), long double>::value), "");1088    static_assert((std::is_same<decltype(std::fmaxf(0,0)), float>::value), "");1089    static_assert((std::is_same<decltype(std::fmaxl(0,0)), long double>::value), "");1090    static_assert((std::is_same<decltype(std::fmax((int)0, (int)0)), double>::value), "");1091    static_assert((std::is_same<decltype(fmax(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1092    assert(std::fmax(1,0) == 1);1093}1094 1095void test_fmin()1096{1097    static_assert((std::is_same<decltype(std::fmin((float)0, (float)0)), float>::value), "");1098    static_assert((std::is_same<decltype(std::fmin((bool)0, (float)0)), double>::value), "");1099    static_assert((std::is_same<decltype(std::fmin((unsigned short)0, (double)0)), double>::value), "");1100    static_assert((std::is_same<decltype(std::fmin((int)0, (long double)0)), long double>::value), "");1101    static_assert((std::is_same<decltype(std::fmin((float)0, (unsigned int)0)), double>::value), "");1102    static_assert((std::is_same<decltype(std::fmin((double)0, (long)0)), double>::value), "");1103    static_assert((std::is_same<decltype(std::fmin((long double)0, (unsigned long)0)), long double>::value), "");1104    static_assert((std::is_same<decltype(std::fmin((int)0, (long long)0)), double>::value), "");1105    static_assert((std::is_same<decltype(std::fmin((int)0, (unsigned long long)0)), double>::value), "");1106    static_assert((std::is_same<decltype(std::fmin((double)0, (double)0)), double>::value), "");1107    static_assert((std::is_same<decltype(std::fmin((long double)0, (long double)0)), long double>::value), "");1108    static_assert((std::is_same<decltype(std::fmin((float)0, (double)0)), double>::value), "");1109    static_assert((std::is_same<decltype(std::fmin((float)0, (long double)0)), long double>::value), "");1110    static_assert((std::is_same<decltype(std::fmin((double)0, (long double)0)), long double>::value), "");1111    static_assert((std::is_same<decltype(std::fminf(0,0)), float>::value), "");1112    static_assert((std::is_same<decltype(std::fminl(0,0)), long double>::value), "");1113    static_assert((std::is_same<decltype(std::fmin((int)0, (int)0)), double>::value), "");1114    static_assert((std::is_same<decltype(fmin(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1115    assert(std::fmin(1,0) == 0);1116}1117 1118#if TEST_STD_VER >= 171119struct TestHypot3 {1120  template <class Real>1121  void operator()() const {1122    const auto check = [](Real elem, Real abs_tol) {1123      assert(std::isfinite(std::hypot(elem, Real(0), Real(0))));1124      assert(fptest_close(std::hypot(elem, Real(0), Real(0)), elem, abs_tol));1125      assert(std::isfinite(std::hypot(elem, elem, Real(0))));1126      assert(fptest_close(std::hypot(elem, elem, Real(0)), std::sqrt(Real(2)) * elem, abs_tol));1127      assert(std::isfinite(std::hypot(elem, elem, elem)));1128      assert(fptest_close(std::hypot(elem, elem, elem), std::sqrt(Real(3)) * elem, abs_tol));1129    };1130 1131    { // check for overflow1132      const auto [elem, abs_tol] = []() -> std::array<Real, 2> {1133        if constexpr (std::is_same_v<Real, float>)1134          return {1e20f, 1e16f};1135        else if constexpr (std::is_same_v<Real, double>)1136          return {1e300, 1e287};1137        else { // long double1138#  if __DBL_MAX_EXP__ == __LDBL_MAX_EXP__1139          return {1e300l, 1e287l}; // 64-bit1140#  else1141          return {1e4000l, 1e3985l}; // 80- or 128-bit1142#  endif1143        }1144      }();1145      check(elem, abs_tol);1146    }1147 1148    { // check for underflow1149      const auto [elem, abs_tol] = []() -> std::array<Real, 2> {1150        if constexpr (std::is_same_v<Real, float>)1151          return {1e-20f, 1e-24f};1152        else if constexpr (std::is_same_v<Real, double>)1153          return {1e-287, 1e-300};1154        else { // long double1155#  if __DBL_MAX_EXP__ == __LDBL_MAX_EXP__1156          return {1e-287l, 1e-300l}; // 64-bit1157#  else1158          return {1e-3985l, 1e-4000l}; // 80- or 128-bit1159#  endif1160        }1161      }();1162      check(elem, abs_tol);1163    }1164  }1165};1166#endif1167 1168void test_hypot()1169{1170    static_assert((std::is_same<decltype(std::hypot((float)0, (float)0)), float>::value), "");1171    static_assert((std::is_same<decltype(std::hypot((bool)0, (float)0)), double>::value), "");1172    static_assert((std::is_same<decltype(std::hypot((unsigned short)0, (double)0)), double>::value), "");1173    static_assert((std::is_same<decltype(std::hypot((int)0, (long double)0)), long double>::value), "");1174    static_assert((std::is_same<decltype(std::hypot((float)0, (unsigned int)0)), double>::value), "");1175    static_assert((std::is_same<decltype(std::hypot((double)0, (long)0)), double>::value), "");1176    static_assert((std::is_same<decltype(std::hypot((long double)0, (unsigned long)0)), long double>::value), "");1177    static_assert((std::is_same<decltype(std::hypot((int)0, (long long)0)), double>::value), "");1178    static_assert((std::is_same<decltype(std::hypot((int)0, (unsigned long long)0)), double>::value), "");1179    static_assert((std::is_same<decltype(std::hypot((double)0, (double)0)), double>::value), "");1180    static_assert((std::is_same<decltype(std::hypot((long double)0, (long double)0)), long double>::value), "");1181    static_assert((std::is_same<decltype(std::hypot((float)0, (double)0)), double>::value), "");1182    static_assert((std::is_same<decltype(std::hypot((float)0, (long double)0)), long double>::value), "");1183    static_assert((std::is_same<decltype(std::hypot((double)0, (long double)0)), long double>::value), "");1184    static_assert((std::is_same<decltype(std::hypotf(0,0)), float>::value), "");1185    static_assert((std::is_same<decltype(std::hypotl(0,0)), long double>::value), "");1186    static_assert((std::is_same<decltype(std::hypot((int)0, (int)0)), double>::value), "");1187    static_assert((std::is_same<decltype(hypot(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1188    assert(std::hypot(3,4) == 5);1189 1190#if TEST_STD_VER >= 171191    // clang-format off1192    static_assert((std::is_same_v<decltype(std::hypot((float)0, (float)0,          (float)0)),              float>));1193    static_assert((std::is_same_v<decltype(std::hypot((float)0, (bool)0,           (float)0)),              double>));1194    static_assert((std::is_same_v<decltype(std::hypot((float)0, (unsigned short)0, (double)0)),             double>));1195    static_assert((std::is_same_v<decltype(std::hypot((float)0, (int)0,            (long double)0)),        long double>));1196    static_assert((std::is_same_v<decltype(std::hypot((float)0, (double)0,         (long)0)),               double>));1197    static_assert((std::is_same_v<decltype(std::hypot((float)0, (long double)0,    (unsigned long)0)),      long double>));1198    static_assert((std::is_same_v<decltype(std::hypot((float)0, (int)0,            (long long)0)),          double>));1199    static_assert((std::is_same_v<decltype(std::hypot((float)0, (int)0,            (unsigned long long)0)), double>));1200    static_assert((std::is_same_v<decltype(std::hypot((float)0, (double)0,         (double)0)),             double>));1201    static_assert((std::is_same_v<decltype(std::hypot((float)0, (long double)0,    (long double)0)),        long double>));1202    static_assert((std::is_same_v<decltype(std::hypot((float)0, (float)0,          (double)0)),             double>));1203    static_assert((std::is_same_v<decltype(std::hypot((float)0, (float)0,          (long double)0)),        long double>));1204    static_assert((std::is_same_v<decltype(std::hypot((float)0, (double)0,         (long double)0)),        long double>));1205    static_assert((std::is_same_v<decltype(std::hypot((int)0,   (int)0,            (int)0)),                double>));1206    static_assert((std::is_same_v<decltype(hypot(Ambiguous(), Ambiguous(), Ambiguous())), Ambiguous>));1207    // clang-format on1208 1209    assert(std::hypot(2,3,6) == 7);1210    assert(std::hypot(1,4,8) == 9);1211 1212    // Check for undue over-/underflows of intermediate results.1213    // See discussion at https://llvm.org/PR92782.1214    types::for_each(types::floating_point_types(), TestHypot3());1215#endif1216}1217 1218void test_ilogb()1219{1220    static_assert((std::is_same<decltype(std::ilogb((float)0)), int>::value), "");1221    static_assert((std::is_same<decltype(std::ilogb((bool)0)), int>::value), "");1222    static_assert((std::is_same<decltype(std::ilogb((unsigned short)0)), int>::value), "");1223    static_assert((std::is_same<decltype(std::ilogb((int)0)), int>::value), "");1224    static_assert((std::is_same<decltype(std::ilogb((unsigned int)0)), int>::value), "");1225    static_assert((std::is_same<decltype(std::ilogb((long)0)), int>::value), "");1226    static_assert((std::is_same<decltype(std::ilogb((unsigned long)0)), int>::value), "");1227    static_assert((std::is_same<decltype(std::ilogb((long long)0)), int>::value), "");1228    static_assert((std::is_same<decltype(std::ilogb((unsigned long long)0)), int>::value), "");1229    static_assert((std::is_same<decltype(std::ilogb((double)0)), int>::value), "");1230    static_assert((std::is_same<decltype(std::ilogb((long double)0)), int>::value), "");1231    static_assert((std::is_same<decltype(std::ilogbf(0)), int>::value), "");1232    static_assert((std::is_same<decltype(std::ilogbl(0)), int>::value), "");1233    static_assert((std::is_same<decltype(ilogb(Ambiguous())), Ambiguous>::value), "");1234    assert(std::ilogb(1) == 0);1235}1236 1237void test_lerp()1238{1239    // See also "lerp.pass.cpp"1240 1241#if TEST_STD_VER > 171242    static_assert((std::is_same<decltype(std::lerp((float)0, (float)0, (float)0)), float>::value), "");1243    static_assert((std::is_same<decltype(std::lerp((float)0, (bool)0, (float)0)), double>::value), "");1244    static_assert((std::is_same<decltype(std::lerp((float)0, (unsigned short)0, (double)0)), double>::value), "");1245    static_assert((std::is_same<decltype(std::lerp((float)0, (int)0, (long double)0)), long double>::value), "");1246    static_assert((std::is_same<decltype(std::lerp((float)0, (double)0, (long)0)), double>::value), "");1247    static_assert((std::is_same<decltype(std::lerp((float)0, (long double)0, (unsigned long)0)), long double>::value), "");1248    static_assert((std::is_same<decltype(std::lerp((float)0, (int)0, (long long)0)), double>::value), "");1249    static_assert((std::is_same<decltype(std::lerp((float)0, (int)0, (unsigned long long)0)), double>::value), "");1250    static_assert((std::is_same<decltype(std::lerp((float)0, (double)0, (double)0)), double>::value), "");1251    static_assert((std::is_same<decltype(std::lerp((float)0, (long double)0, (long double)0)), long double>::value), "");1252    static_assert((std::is_same<decltype(std::lerp((float)0, (float)0, (double)0)), double>::value), "");1253    static_assert((std::is_same<decltype(std::lerp((float)0, (float)0, (long double)0)), long double>::value), "");1254    static_assert((std::is_same<decltype(std::lerp((float)0, (double)0, (long double)0)), long double>::value), "");1255    static_assert((std::is_same<decltype(std::lerp((int)0, (int)0, (int)0)), double>::value), "");1256    static_assert((std::is_same<decltype(lerp(Ambiguous(), Ambiguous(), Ambiguous())), Ambiguous>::value), "");1257 1258    assert(std::lerp(2, 3, 1) == 3);1259    assert(std::lerp(1, 3, 0.5) == 2);1260    assert(std::lerp(0, 4.0, 0) == 0);1261    static_assert(std::lerp(2, 3, 1) == 3);1262    static_assert(std::lerp(1, 3, 0.5) == 2);1263    static_assert(std::lerp(0, 4.0, 0) == 0);1264#endif1265}1266 1267void test_lgamma()1268{1269    static_assert((std::is_same<decltype(std::lgamma((float)0)), float>::value), "");1270    static_assert((std::is_same<decltype(std::lgamma((bool)0)), double>::value), "");1271    static_assert((std::is_same<decltype(std::lgamma((unsigned short)0)), double>::value), "");1272    static_assert((std::is_same<decltype(std::lgamma((int)0)), double>::value), "");1273    static_assert((std::is_same<decltype(std::lgamma((unsigned int)0)), double>::value), "");1274    static_assert((std::is_same<decltype(std::lgamma((long)0)), double>::value), "");1275    static_assert((std::is_same<decltype(std::lgamma((unsigned long)0)), double>::value), "");1276    static_assert((std::is_same<decltype(std::lgamma((long long)0)), double>::value), "");1277    static_assert((std::is_same<decltype(std::lgamma((unsigned long long)0)), double>::value), "");1278    static_assert((std::is_same<decltype(std::lgamma((double)0)), double>::value), "");1279    static_assert((std::is_same<decltype(std::lgamma((long double)0)), long double>::value), "");1280    static_assert((std::is_same<decltype(std::lgammaf(0)), float>::value), "");1281    static_assert((std::is_same<decltype(std::lgammal(0)), long double>::value), "");1282    static_assert((std::is_same<decltype(lgamma(Ambiguous())), Ambiguous>::value), "");1283    assert(std::lgamma(1) == 0);1284}1285 1286void test_llrint()1287{1288    static_assert((std::is_same<decltype(std::llrint((float)0)), long long>::value), "");1289    static_assert((std::is_same<decltype(std::llrint((bool)0)), long long>::value), "");1290    static_assert((std::is_same<decltype(std::llrint((unsigned short)0)), long long>::value), "");1291    static_assert((std::is_same<decltype(std::llrint((int)0)), long long>::value), "");1292    static_assert((std::is_same<decltype(std::llrint((unsigned int)0)), long long>::value), "");1293    static_assert((std::is_same<decltype(std::llrint((long)0)), long long>::value), "");1294    static_assert((std::is_same<decltype(std::llrint((unsigned long)0)), long long>::value), "");1295    static_assert((std::is_same<decltype(std::llrint((long long)0)), long long>::value), "");1296    static_assert((std::is_same<decltype(std::llrint((unsigned long long)0)), long long>::value), "");1297    static_assert((std::is_same<decltype(std::llrint((double)0)), long long>::value), "");1298    static_assert((std::is_same<decltype(std::llrint((long double)0)), long long>::value), "");1299    static_assert((std::is_same<decltype(std::llrintf(0)), long long>::value), "");1300    static_assert((std::is_same<decltype(std::llrintl(0)), long long>::value), "");1301    static_assert((std::is_same<decltype(llrint(Ambiguous())), Ambiguous>::value), "");1302    assert(std::llrint(1) == 1LL);1303}1304 1305void test_llround()1306{1307    static_assert((std::is_same<decltype(std::llround((float)0)), long long>::value), "");1308    static_assert((std::is_same<decltype(std::llround((bool)0)), long long>::value), "");1309    static_assert((std::is_same<decltype(std::llround((unsigned short)0)), long long>::value), "");1310    static_assert((std::is_same<decltype(std::llround((int)0)), long long>::value), "");1311    static_assert((std::is_same<decltype(std::llround((unsigned int)0)), long long>::value), "");1312    static_assert((std::is_same<decltype(std::llround((long)0)), long long>::value), "");1313    static_assert((std::is_same<decltype(std::llround((unsigned long)0)), long long>::value), "");1314    static_assert((std::is_same<decltype(std::llround((long long)0)), long long>::value), "");1315    static_assert((std::is_same<decltype(std::llround((unsigned long long)0)), long long>::value), "");1316    static_assert((std::is_same<decltype(std::llround((double)0)), long long>::value), "");1317    static_assert((std::is_same<decltype(std::llround((long double)0)), long long>::value), "");1318    static_assert((std::is_same<decltype(std::llroundf(0)), long long>::value), "");1319    static_assert((std::is_same<decltype(std::llroundl(0)), long long>::value), "");1320    static_assert((std::is_same<decltype(llround(Ambiguous())), Ambiguous>::value), "");1321    assert(std::llround(1) == 1LL);1322}1323 1324void test_log1p()1325{1326    static_assert((std::is_same<decltype(std::log1p((float)0)), float>::value), "");1327    static_assert((std::is_same<decltype(std::log1p((bool)0)), double>::value), "");1328    static_assert((std::is_same<decltype(std::log1p((unsigned short)0)), double>::value), "");1329    static_assert((std::is_same<decltype(std::log1p((int)0)), double>::value), "");1330    static_assert((std::is_same<decltype(std::log1p((unsigned int)0)), double>::value), "");1331    static_assert((std::is_same<decltype(std::log1p((long)0)), double>::value), "");1332    static_assert((std::is_same<decltype(std::log1p((unsigned long)0)), double>::value), "");1333    static_assert((std::is_same<decltype(std::log1p((long long)0)), double>::value), "");1334    static_assert((std::is_same<decltype(std::log1p((unsigned long long)0)), double>::value), "");1335    static_assert((std::is_same<decltype(std::log1p((double)0)), double>::value), "");1336    static_assert((std::is_same<decltype(std::log1p((long double)0)), long double>::value), "");1337    static_assert((std::is_same<decltype(std::log1pf(0)), float>::value), "");1338    static_assert((std::is_same<decltype(std::log1pl(0)), long double>::value), "");1339    static_assert((std::is_same<decltype(log1p(Ambiguous())), Ambiguous>::value), "");1340    assert(std::log1p(0) == 0);1341}1342 1343void test_log2()1344{1345    static_assert((std::is_same<decltype(std::log2((float)0)), float>::value), "");1346    static_assert((std::is_same<decltype(std::log2((bool)0)), double>::value), "");1347    static_assert((std::is_same<decltype(std::log2((unsigned short)0)), double>::value), "");1348    static_assert((std::is_same<decltype(std::log2((int)0)), double>::value), "");1349    static_assert((std::is_same<decltype(std::log2((unsigned int)0)), double>::value), "");1350    static_assert((std::is_same<decltype(std::log2((long)0)), double>::value), "");1351    static_assert((std::is_same<decltype(std::log2((unsigned long)0)), double>::value), "");1352    static_assert((std::is_same<decltype(std::log2((long long)0)), double>::value), "");1353    static_assert((std::is_same<decltype(std::log2((unsigned long long)0)), double>::value), "");1354    static_assert((std::is_same<decltype(std::log2((double)0)), double>::value), "");1355    static_assert((std::is_same<decltype(std::log2((long double)0)), long double>::value), "");1356    static_assert((std::is_same<decltype(std::log2f(0)), float>::value), "");1357    static_assert((std::is_same<decltype(std::log2l(0)), long double>::value), "");1358    static_assert((std::is_same<decltype(log2(Ambiguous())), Ambiguous>::value), "");1359    assert(std::log2(1) == 0);1360}1361 1362void test_logb()1363{1364    static_assert((std::is_same<decltype(std::logb((float)0)), float>::value), "");1365    static_assert((std::is_same<decltype(std::logb((bool)0)), double>::value), "");1366    static_assert((std::is_same<decltype(std::logb((unsigned short)0)), double>::value), "");1367    static_assert((std::is_same<decltype(std::logb((int)0)), double>::value), "");1368    static_assert((std::is_same<decltype(std::logb((unsigned int)0)), double>::value), "");1369    static_assert((std::is_same<decltype(std::logb((long)0)), double>::value), "");1370    static_assert((std::is_same<decltype(std::logb((unsigned long)0)), double>::value), "");1371    static_assert((std::is_same<decltype(std::logb((long long)0)), double>::value), "");1372    static_assert((std::is_same<decltype(std::logb((unsigned long long)0)), double>::value), "");1373    static_assert((std::is_same<decltype(std::logb((double)0)), double>::value), "");1374    static_assert((std::is_same<decltype(std::logb((long double)0)), long double>::value), "");1375    static_assert((std::is_same<decltype(std::logbf(0)), float>::value), "");1376    static_assert((std::is_same<decltype(std::logbl(0)), long double>::value), "");1377    static_assert((std::is_same<decltype(logb(Ambiguous())), Ambiguous>::value), "");1378    assert(std::logb(1) == 0);1379}1380 1381void test_lrint()1382{1383    static_assert((std::is_same<decltype(std::lrint((float)0)), long>::value), "");1384    static_assert((std::is_same<decltype(std::lrint((bool)0)), long>::value), "");1385    static_assert((std::is_same<decltype(std::lrint((unsigned short)0)), long>::value), "");1386    static_assert((std::is_same<decltype(std::lrint((int)0)), long>::value), "");1387    static_assert((std::is_same<decltype(std::lrint((unsigned int)0)), long>::value), "");1388    static_assert((std::is_same<decltype(std::lrint((long)0)), long>::value), "");1389    static_assert((std::is_same<decltype(std::lrint((unsigned long)0)), long>::value), "");1390    static_assert((std::is_same<decltype(std::lrint((long long)0)), long>::value), "");1391    static_assert((std::is_same<decltype(std::lrint((unsigned long long)0)), long>::value), "");1392    static_assert((std::is_same<decltype(std::lrint((double)0)), long>::value), "");1393    static_assert((std::is_same<decltype(std::lrint((long double)0)), long>::value), "");1394    static_assert((std::is_same<decltype(std::lrintf(0)), long>::value), "");1395    static_assert((std::is_same<decltype(std::lrintl(0)), long>::value), "");1396    static_assert((std::is_same<decltype(lrint(Ambiguous())), Ambiguous>::value), "");1397    assert(std::lrint(1) == 1L);1398}1399 1400void test_lround()1401{1402    static_assert((std::is_same<decltype(std::lround((float)0)), long>::value), "");1403    static_assert((std::is_same<decltype(std::lround((bool)0)), long>::value), "");1404    static_assert((std::is_same<decltype(std::lround((unsigned short)0)), long>::value), "");1405    static_assert((std::is_same<decltype(std::lround((int)0)), long>::value), "");1406    static_assert((std::is_same<decltype(std::lround((unsigned int)0)), long>::value), "");1407    static_assert((std::is_same<decltype(std::lround((long)0)), long>::value), "");1408    static_assert((std::is_same<decltype(std::lround((unsigned long)0)), long>::value), "");1409    static_assert((std::is_same<decltype(std::lround((long long)0)), long>::value), "");1410    static_assert((std::is_same<decltype(std::lround((unsigned long long)0)), long>::value), "");1411    static_assert((std::is_same<decltype(std::lround((double)0)), long>::value), "");1412    static_assert((std::is_same<decltype(std::lround((long double)0)), long>::value), "");1413    static_assert((std::is_same<decltype(std::lroundf(0)), long>::value), "");1414    static_assert((std::is_same<decltype(std::lroundl(0)), long>::value), "");1415    static_assert((std::is_same<decltype(lround(Ambiguous())), Ambiguous>::value), "");1416    assert(std::lround(1) == 1L);1417}1418 1419void test_nan()1420{1421    static_assert((std::is_same<decltype(std::nan("")), double>::value), "");1422    static_assert((std::is_same<decltype(std::nanf("")), float>::value), "");1423    static_assert((std::is_same<decltype(std::nanl("")), long double>::value), "");1424}1425 1426void test_nearbyint()1427{1428    static_assert((std::is_same<decltype(std::nearbyint((float)0)), float>::value), "");1429    static_assert((std::is_same<decltype(std::nearbyint((bool)0)), double>::value), "");1430    static_assert((std::is_same<decltype(std::nearbyint((unsigned short)0)), double>::value), "");1431    static_assert((std::is_same<decltype(std::nearbyint((int)0)), double>::value), "");1432    static_assert((std::is_same<decltype(std::nearbyint((unsigned int)0)), double>::value), "");1433    static_assert((std::is_same<decltype(std::nearbyint((long)0)), double>::value), "");1434    static_assert((std::is_same<decltype(std::nearbyint((unsigned long)0)), double>::value), "");1435    static_assert((std::is_same<decltype(std::nearbyint((long long)0)), double>::value), "");1436    static_assert((std::is_same<decltype(std::nearbyint((unsigned long long)0)), double>::value), "");1437    static_assert((std::is_same<decltype(std::nearbyint((double)0)), double>::value), "");1438    static_assert((std::is_same<decltype(std::nearbyint((long double)0)), long double>::value), "");1439    static_assert((std::is_same<decltype(std::nearbyintf(0)), float>::value), "");1440    static_assert((std::is_same<decltype(std::nearbyintl(0)), long double>::value), "");1441    static_assert((std::is_same<decltype(nearbyint(Ambiguous())), Ambiguous>::value), "");1442    assert(std::nearbyint(1) == 1);1443}1444 1445void test_nextafter()1446{1447    static_assert((std::is_same<decltype(std::nextafter((float)0, (float)0)), float>::value), "");1448    static_assert((std::is_same<decltype(std::nextafter((bool)0, (float)0)), double>::value), "");1449    static_assert((std::is_same<decltype(std::nextafter((unsigned short)0, (double)0)), double>::value), "");1450    static_assert((std::is_same<decltype(std::nextafter((int)0, (long double)0)), long double>::value), "");1451    static_assert((std::is_same<decltype(std::nextafter((float)0, (unsigned int)0)), double>::value), "");1452    static_assert((std::is_same<decltype(std::nextafter((double)0, (long)0)), double>::value), "");1453    static_assert((std::is_same<decltype(std::nextafter((long double)0, (unsigned long)0)), long double>::value), "");1454    static_assert((std::is_same<decltype(std::nextafter((int)0, (long long)0)), double>::value), "");1455    static_assert((std::is_same<decltype(std::nextafter((int)0, (unsigned long long)0)), double>::value), "");1456    static_assert((std::is_same<decltype(std::nextafter((double)0, (double)0)), double>::value), "");1457    static_assert((std::is_same<decltype(std::nextafter((long double)0, (long double)0)), long double>::value), "");1458    static_assert((std::is_same<decltype(std::nextafter((float)0, (double)0)), double>::value), "");1459    static_assert((std::is_same<decltype(std::nextafter((float)0, (long double)0)), long double>::value), "");1460    static_assert((std::is_same<decltype(std::nextafter((double)0, (long double)0)), long double>::value), "");1461    static_assert((std::is_same<decltype(std::nextafterf(0,0)), float>::value), "");1462    static_assert((std::is_same<decltype(std::nextafterl(0,0)), long double>::value), "");1463    static_assert((std::is_same<decltype(std::nextafter((int)0, (int)0)), double>::value), "");1464    static_assert((std::is_same<decltype(nextafter(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1465    assert(std::nextafter(0,1) == hexfloat<double>(0x1, 0, -1074));1466}1467 1468void test_nexttoward()1469{1470    static_assert((std::is_same<decltype(std::nexttoward((float)0, (long double)0)), float>::value), "");1471    static_assert((std::is_same<decltype(std::nexttoward((bool)0, (long double)0)), double>::value), "");1472    static_assert((std::is_same<decltype(std::nexttoward((unsigned short)0, (long double)0)), double>::value), "");1473    static_assert((std::is_same<decltype(std::nexttoward((int)0, (long double)0)), double>::value), "");1474    static_assert((std::is_same<decltype(std::nexttoward((unsigned int)0, (long double)0)), double>::value), "");1475    static_assert((std::is_same<decltype(std::nexttoward((long)0, (long double)0)), double>::value), "");1476    static_assert((std::is_same<decltype(std::nexttoward((unsigned long)0, (long double)0)), double>::value), "");1477    static_assert((std::is_same<decltype(std::nexttoward((long long)0, (long double)0)), double>::value), "");1478    static_assert((std::is_same<decltype(std::nexttoward((unsigned long long)0, (long double)0)), double>::value), "");1479    static_assert((std::is_same<decltype(std::nexttoward((double)0, (long double)0)), double>::value), "");1480    static_assert((std::is_same<decltype(std::nexttoward((long double)0, (long double)0)), long double>::value), "");1481    static_assert((std::is_same<decltype(std::nexttowardf(0, (long double)0)), float>::value), "");1482    static_assert((std::is_same<decltype(std::nexttowardl(0, (long double)0)), long double>::value), "");1483    static_assert((std::is_same<decltype(nexttoward(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1484    assert(std::nexttoward(0, 1) == hexfloat<double>(0x1, 0, -1074));1485}1486 1487void test_remainder()1488{1489    static_assert((std::is_same<decltype(std::remainder((float)0, (float)0)), float>::value), "");1490    static_assert((std::is_same<decltype(std::remainder((bool)0, (float)0)), double>::value), "");1491    static_assert((std::is_same<decltype(std::remainder((unsigned short)0, (double)0)), double>::value), "");1492    static_assert((std::is_same<decltype(std::remainder((int)0, (long double)0)), long double>::value), "");1493    static_assert((std::is_same<decltype(std::remainder((float)0, (unsigned int)0)), double>::value), "");1494    static_assert((std::is_same<decltype(std::remainder((double)0, (long)0)), double>::value), "");1495    static_assert((std::is_same<decltype(std::remainder((long double)0, (unsigned long)0)), long double>::value), "");1496    static_assert((std::is_same<decltype(std::remainder((int)0, (long long)0)), double>::value), "");1497    static_assert((std::is_same<decltype(std::remainder((int)0, (unsigned long long)0)), double>::value), "");1498    static_assert((std::is_same<decltype(std::remainder((double)0, (double)0)), double>::value), "");1499    static_assert((std::is_same<decltype(std::remainder((long double)0, (long double)0)), long double>::value), "");1500    static_assert((std::is_same<decltype(std::remainder((float)0, (double)0)), double>::value), "");1501    static_assert((std::is_same<decltype(std::remainder((float)0, (long double)0)), long double>::value), "");1502    static_assert((std::is_same<decltype(std::remainder((double)0, (long double)0)), long double>::value), "");1503    static_assert((std::is_same<decltype(std::remainderf(0,0)), float>::value), "");1504    static_assert((std::is_same<decltype(std::remainderl(0,0)), long double>::value), "");1505    static_assert((std::is_same<decltype(std::remainder((int)0, (int)0)), double>::value), "");1506    static_assert((std::is_same<decltype(remainder(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1507    assert(std::remainder(0.5,1) == 0.5);1508}1509 1510void test_remquo()1511{1512    int ip;1513    static_assert((std::is_same<decltype(std::remquo((float)0, (float)0, &ip)), float>::value), "");1514    static_assert((std::is_same<decltype(std::remquo((bool)0, (float)0, &ip)), double>::value), "");1515    static_assert((std::is_same<decltype(std::remquo((unsigned short)0, (double)0, &ip)), double>::value), "");1516    static_assert((std::is_same<decltype(std::remquo((int)0, (long double)0, &ip)), long double>::value), "");1517    static_assert((std::is_same<decltype(std::remquo((float)0, (unsigned int)0, &ip)), double>::value), "");1518    static_assert((std::is_same<decltype(std::remquo((double)0, (long)0, &ip)), double>::value), "");1519    static_assert((std::is_same<decltype(std::remquo((long double)0, (unsigned long)0, &ip)), long double>::value), "");1520    static_assert((std::is_same<decltype(std::remquo((int)0, (long long)0, &ip)), double>::value), "");1521    static_assert((std::is_same<decltype(std::remquo((int)0, (unsigned long long)0, &ip)), double>::value), "");1522    static_assert((std::is_same<decltype(std::remquo((double)0, (double)0, &ip)), double>::value), "");1523    static_assert((std::is_same<decltype(std::remquo((long double)0, (long double)0, &ip)), long double>::value), "");1524    static_assert((std::is_same<decltype(std::remquo((float)0, (double)0, &ip)), double>::value), "");1525    static_assert((std::is_same<decltype(std::remquo((float)0, (long double)0, &ip)), long double>::value), "");1526    static_assert((std::is_same<decltype(std::remquo((double)0, (long double)0, &ip)), long double>::value), "");1527    static_assert((std::is_same<decltype(std::remquof(0,0, &ip)), float>::value), "");1528    static_assert((std::is_same<decltype(std::remquol(0,0, &ip)), long double>::value), "");1529    static_assert((std::is_same<decltype(std::remquo((int)0, (int)0, &ip)), double>::value), "");1530    static_assert((std::is_same<decltype(remquo(Ambiguous(), Ambiguous(), &ip)), Ambiguous>::value), "");1531    assert(std::remquo(0.5,1, &ip) == 0.5);1532}1533 1534void test_rint()1535{1536    static_assert((std::is_same<decltype(std::rint((float)0)), float>::value), "");1537    static_assert((std::is_same<decltype(std::rint((bool)0)), double>::value), "");1538    static_assert((std::is_same<decltype(std::rint((unsigned short)0)), double>::value), "");1539    static_assert((std::is_same<decltype(std::rint((int)0)), double>::value), "");1540    static_assert((std::is_same<decltype(std::rint((unsigned int)0)), double>::value), "");1541    static_assert((std::is_same<decltype(std::rint((long)0)), double>::value), "");1542    static_assert((std::is_same<decltype(std::rint((unsigned long)0)), double>::value), "");1543    static_assert((std::is_same<decltype(std::rint((long long)0)), double>::value), "");1544    static_assert((std::is_same<decltype(std::rint((unsigned long long)0)), double>::value), "");1545    static_assert((std::is_same<decltype(std::rint((double)0)), double>::value), "");1546    static_assert((std::is_same<decltype(std::rint((long double)0)), long double>::value), "");1547    static_assert((std::is_same<decltype(std::rintf(0)), float>::value), "");1548    static_assert((std::is_same<decltype(std::rintl(0)), long double>::value), "");1549    static_assert((std::is_same<decltype(rint(Ambiguous())), Ambiguous>::value), "");1550    assert(std::rint(1) == 1);1551}1552 1553void test_round()1554{1555    static_assert((std::is_same<decltype(std::round((float)0)), float>::value), "");1556    static_assert((std::is_same<decltype(std::round((bool)0)), double>::value), "");1557    static_assert((std::is_same<decltype(std::round((unsigned short)0)), double>::value), "");1558    static_assert((std::is_same<decltype(std::round((int)0)), double>::value), "");1559    static_assert((std::is_same<decltype(std::round((unsigned int)0)), double>::value), "");1560    static_assert((std::is_same<decltype(std::round((long)0)), double>::value), "");1561    static_assert((std::is_same<decltype(std::round((unsigned long)0)), double>::value), "");1562    static_assert((std::is_same<decltype(std::round((long long)0)), double>::value), "");1563    static_assert((std::is_same<decltype(std::round((unsigned long long)0)), double>::value), "");1564    static_assert((std::is_same<decltype(std::round((double)0)), double>::value), "");1565    static_assert((std::is_same<decltype(std::round((long double)0)), long double>::value), "");1566    static_assert((std::is_same<decltype(std::roundf(0)), float>::value), "");1567    static_assert((std::is_same<decltype(std::roundl(0)), long double>::value), "");1568    static_assert((std::is_same<decltype(round(Ambiguous())), Ambiguous>::value), "");1569    assert(std::round(1) == 1);1570}1571 1572void test_scalbln()1573{1574    static_assert((std::is_same<decltype(std::scalbln((float)0, (long)0)), float>::value), "");1575    static_assert((std::is_same<decltype(std::scalbln((bool)0, (long)0)), double>::value), "");1576    static_assert((std::is_same<decltype(std::scalbln((unsigned short)0, (long)0)), double>::value), "");1577    static_assert((std::is_same<decltype(std::scalbln((int)0, (long)0)), double>::value), "");1578    static_assert((std::is_same<decltype(std::scalbln((unsigned int)0, (long)0)), double>::value), "");1579    static_assert((std::is_same<decltype(std::scalbln((long)0, (long)0)), double>::value), "");1580    static_assert((std::is_same<decltype(std::scalbln((unsigned long)0, (long)0)), double>::value), "");1581    static_assert((std::is_same<decltype(std::scalbln((long long)0, (long)0)), double>::value), "");1582    static_assert((std::is_same<decltype(std::scalbln((unsigned long long)0, (long)0)), double>::value), "");1583    static_assert((std::is_same<decltype(std::scalbln((double)0, (long)0)), double>::value), "");1584    static_assert((std::is_same<decltype(std::scalbln((long double)0, (long)0)), long double>::value), "");1585    static_assert((std::is_same<decltype(std::scalblnf(0, (long)0)), float>::value), "");1586    static_assert((std::is_same<decltype(std::scalblnl(0, (long)0)), long double>::value), "");1587    static_assert((std::is_same<decltype(scalbln(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1588    assert(std::scalbln(1, 1) == 2);1589}1590 1591void test_scalbn()1592{1593    static_assert((std::is_same<decltype(std::scalbn((float)0, (int)0)), float>::value), "");1594    static_assert((std::is_same<decltype(std::scalbn((bool)0, (int)0)), double>::value), "");1595    static_assert((std::is_same<decltype(std::scalbn((unsigned short)0, (int)0)), double>::value), "");1596    static_assert((std::is_same<decltype(std::scalbn((int)0, (int)0)), double>::value), "");1597    static_assert((std::is_same<decltype(std::scalbn((unsigned int)0, (int)0)), double>::value), "");1598    static_assert((std::is_same<decltype(std::scalbn((long)0, (int)0)), double>::value), "");1599    static_assert((std::is_same<decltype(std::scalbn((unsigned long)0, (int)0)), double>::value), "");1600    static_assert((std::is_same<decltype(std::scalbn((long long)0, (int)0)), double>::value), "");1601    static_assert((std::is_same<decltype(std::scalbn((unsigned long long)0, (int)0)), double>::value), "");1602    static_assert((std::is_same<decltype(std::scalbn((double)0, (int)0)), double>::value), "");1603    static_assert((std::is_same<decltype(std::scalbn((long double)0, (int)0)), long double>::value), "");1604    static_assert((std::is_same<decltype(std::scalbnf(0, (int)0)), float>::value), "");1605    static_assert((std::is_same<decltype(std::scalbnl(0, (int)0)), long double>::value), "");1606    static_assert((std::is_same<decltype(scalbn(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1607    assert(std::scalbn(1, 1) == 2);1608}1609 1610void test_tgamma()1611{1612    static_assert((std::is_same<decltype(std::tgamma((float)0)), float>::value), "");1613    static_assert((std::is_same<decltype(std::tgamma((bool)0)), double>::value), "");1614    static_assert((std::is_same<decltype(std::tgamma((unsigned short)0)), double>::value), "");1615    static_assert((std::is_same<decltype(std::tgamma((int)0)), double>::value), "");1616    static_assert((std::is_same<decltype(std::tgamma((unsigned int)0)), double>::value), "");1617    static_assert((std::is_same<decltype(std::tgamma((long)0)), double>::value), "");1618    static_assert((std::is_same<decltype(std::tgamma((unsigned long)0)), double>::value), "");1619    static_assert((std::is_same<decltype(std::tgamma((long long)0)), double>::value), "");1620    static_assert((std::is_same<decltype(std::tgamma((unsigned long long)0)), double>::value), "");1621    static_assert((std::is_same<decltype(std::tgamma((double)0)), double>::value), "");1622    static_assert((std::is_same<decltype(std::tgamma((long double)0)), long double>::value), "");1623    static_assert((std::is_same<decltype(std::tgammaf(0)), float>::value), "");1624    static_assert((std::is_same<decltype(std::tgammal(0)), long double>::value), "");1625    static_assert((std::is_same<decltype(tgamma(Ambiguous())), Ambiguous>::value), "");1626    assert(std::tgamma(1) == 1);1627}1628 1629void test_trunc()1630{1631    static_assert((std::is_same<decltype(std::trunc((float)0)), float>::value), "");1632    static_assert((std::is_same<decltype(std::trunc((bool)0)), double>::value), "");1633    static_assert((std::is_same<decltype(std::trunc((unsigned short)0)), double>::value), "");1634    static_assert((std::is_same<decltype(std::trunc((int)0)), double>::value), "");1635    static_assert((std::is_same<decltype(std::trunc((unsigned int)0)), double>::value), "");1636    static_assert((std::is_same<decltype(std::trunc((long)0)), double>::value), "");1637    static_assert((std::is_same<decltype(std::trunc((unsigned long)0)), double>::value), "");1638    static_assert((std::is_same<decltype(std::trunc((long long)0)), double>::value), "");1639    static_assert((std::is_same<decltype(std::trunc((unsigned long long)0)), double>::value), "");1640    static_assert((std::is_same<decltype(std::trunc((double)0)), double>::value), "");1641    static_assert((std::is_same<decltype(std::trunc((long double)0)), long double>::value), "");1642    static_assert((std::is_same<decltype(std::truncf(0)), float>::value), "");1643    static_assert((std::is_same<decltype(std::truncl(0)), long double>::value), "");1644    static_assert((std::is_same<decltype(trunc(Ambiguous())), Ambiguous>::value), "");1645    assert(std::trunc(1) == 1);1646}1647 1648int main(int, char**)1649{1650    test_abs();1651    test_acos();1652    test_asin();1653    test_atan();1654    test_atan2();1655    test_ceil();1656    test_cos();1657    test_cosh();1658    test_exp();1659    test_fabs();1660    test_floor();1661    test_fmod();1662    test_frexp();1663    test_ldexp();1664    test_log();1665    test_log10();1666    test_modf();1667    test_pow();1668    test_sin();1669    test_sinh();1670    test_sqrt();1671    test_tan();1672    test_tanh();1673    test_signbit();1674    test_fpclassify();1675    test_isfinite();1676    test_isnormal();1677    test_isgreater();1678    test_isgreaterequal();1679    test_isinf();1680    test_isless();1681    test_islessequal();1682    test_islessgreater();1683    test_isnan();1684    test_isunordered();1685    test_acosh();1686    test_asinh();1687    test_atanh();1688    test_cbrt();1689    test_copysign();1690    test_erf();1691    test_erfc();1692    test_exp2();1693    test_expm1();1694    test_fdim();1695    test_fma();1696    test_fmax();1697    test_fmin();1698    test_hypot();1699    test_ilogb();1700    test_lerp();1701    test_lgamma();1702    test_llrint();1703    test_llround();1704    test_log1p();1705    test_log2();1706    test_logb();1707    test_lrint();1708    test_lround();1709    test_nan();1710    test_nearbyint();1711    test_nextafter();1712    test_nexttoward();1713    test_remainder();1714    test_remquo();1715    test_rint();1716    test_round();1717    test_scalbln();1718    test_scalbn();1719    test_tgamma();1720    test_trunc();1721 1722  return 0;1723}1724