math_h.pass.cpp 94 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572
  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-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. // <math.h>
  9. #include <math.h>
  10. #include <type_traits>
  11. #include <cassert>
  12. #include "hexfloat.h"
  13. #include "truncate_fp.h"
  14. // convertible to int/float/double/etc
  15. template <class T, int N=0>
  16. struct Value {
  17. operator T () { return T(N); }
  18. };
  19. // See PR21083
  20. // Ambiguous is a user-defined type that defines its own overloads of cmath
  21. // functions. When the std overloads are candidates too (by using or adl),
  22. // they should not interfere.
  23. struct Ambiguous : std::true_type { // ADL
  24. operator float () { return 0.f; }
  25. operator double () { return 0.; }
  26. };
  27. Ambiguous abs(Ambiguous){ return Ambiguous(); }
  28. Ambiguous acos(Ambiguous){ return Ambiguous(); }
  29. Ambiguous asin(Ambiguous){ return Ambiguous(); }
  30. Ambiguous atan(Ambiguous){ return Ambiguous(); }
  31. Ambiguous atan2(Ambiguous, Ambiguous){ return Ambiguous(); }
  32. Ambiguous ceil(Ambiguous){ return Ambiguous(); }
  33. Ambiguous cos(Ambiguous){ return Ambiguous(); }
  34. Ambiguous cosh(Ambiguous){ return Ambiguous(); }
  35. Ambiguous exp(Ambiguous){ return Ambiguous(); }
  36. Ambiguous fabs(Ambiguous){ return Ambiguous(); }
  37. Ambiguous floor(Ambiguous){ return Ambiguous(); }
  38. Ambiguous fmod(Ambiguous, Ambiguous){ return Ambiguous(); }
  39. Ambiguous frexp(Ambiguous, int*){ return Ambiguous(); }
  40. Ambiguous ldexp(Ambiguous, int){ return Ambiguous(); }
  41. Ambiguous log(Ambiguous){ return Ambiguous(); }
  42. Ambiguous log10(Ambiguous){ return Ambiguous(); }
  43. Ambiguous modf(Ambiguous, Ambiguous*){ return Ambiguous(); }
  44. Ambiguous pow(Ambiguous, Ambiguous){ return Ambiguous(); }
  45. Ambiguous sin(Ambiguous){ return Ambiguous(); }
  46. Ambiguous sinh(Ambiguous){ return Ambiguous(); }
  47. Ambiguous sqrt(Ambiguous){ return Ambiguous(); }
  48. Ambiguous tan(Ambiguous){ return Ambiguous(); }
  49. Ambiguous tanh(Ambiguous){ return Ambiguous(); }
  50. Ambiguous signbit(Ambiguous){ return Ambiguous(); }
  51. Ambiguous fpclassify(Ambiguous){ return Ambiguous(); }
  52. Ambiguous isfinite(Ambiguous){ return Ambiguous(); }
  53. Ambiguous isnormal(Ambiguous){ return Ambiguous(); }
  54. Ambiguous isgreater(Ambiguous, Ambiguous){ return Ambiguous(); }
  55. Ambiguous isgreaterequal(Ambiguous, Ambiguous){ return Ambiguous(); }
  56. Ambiguous isless(Ambiguous, Ambiguous){ return Ambiguous(); }
  57. Ambiguous islessequal(Ambiguous, Ambiguous){ return Ambiguous(); }
  58. Ambiguous islessgreater(Ambiguous, Ambiguous){ return Ambiguous(); }
  59. Ambiguous isunordered(Ambiguous, Ambiguous){ return Ambiguous(); }
  60. Ambiguous acosh(Ambiguous){ return Ambiguous(); }
  61. Ambiguous asinh(Ambiguous){ return Ambiguous(); }
  62. Ambiguous atanh(Ambiguous){ return Ambiguous(); }
  63. Ambiguous cbrt(Ambiguous){ return Ambiguous(); }
  64. Ambiguous copysign(Ambiguous, Ambiguous){ return Ambiguous(); }
  65. Ambiguous erf(Ambiguous){ return Ambiguous(); }
  66. Ambiguous erfc(Ambiguous){ return Ambiguous(); }
  67. Ambiguous exp2(Ambiguous){ return Ambiguous(); }
  68. Ambiguous expm1(Ambiguous){ return Ambiguous(); }
  69. Ambiguous fdim(Ambiguous, Ambiguous){ return Ambiguous(); }
  70. Ambiguous fma(Ambiguous, Ambiguous, Ambiguous){ return Ambiguous(); }
  71. Ambiguous fmax(Ambiguous, Ambiguous){ return Ambiguous(); }
  72. Ambiguous fmin(Ambiguous, Ambiguous){ return Ambiguous(); }
  73. Ambiguous hypot(Ambiguous, Ambiguous){ return Ambiguous(); }
  74. Ambiguous ilogb(Ambiguous){ return Ambiguous(); }
  75. Ambiguous lgamma(Ambiguous){ return Ambiguous(); }
  76. Ambiguous llrint(Ambiguous){ return Ambiguous(); }
  77. Ambiguous llround(Ambiguous){ return Ambiguous(); }
  78. Ambiguous log1p(Ambiguous){ return Ambiguous(); }
  79. Ambiguous log2(Ambiguous){ return Ambiguous(); }
  80. Ambiguous logb(Ambiguous){ return Ambiguous(); }
  81. Ambiguous lrint(Ambiguous){ return Ambiguous(); }
  82. Ambiguous lround(Ambiguous){ return Ambiguous(); }
  83. Ambiguous nearbyint(Ambiguous){ return Ambiguous(); }
  84. Ambiguous nextafter(Ambiguous, Ambiguous){ return Ambiguous(); }
  85. Ambiguous nexttoward(Ambiguous, Ambiguous){ return Ambiguous(); }
  86. Ambiguous remainder(Ambiguous, Ambiguous){ return Ambiguous(); }
  87. Ambiguous remquo(Ambiguous, Ambiguous, int*){ return Ambiguous(); }
  88. Ambiguous rint(Ambiguous){ return Ambiguous(); }
  89. Ambiguous round(Ambiguous){ return Ambiguous(); }
  90. Ambiguous scalbln(Ambiguous, Ambiguous){ return Ambiguous(); }
  91. Ambiguous scalbn(Ambiguous, Ambiguous){ return Ambiguous(); }
  92. Ambiguous tgamma(Ambiguous){ return Ambiguous(); }
  93. Ambiguous trunc(Ambiguous){ return Ambiguous(); }
  94. template <class T, class = decltype(::abs(std::declval<T>()))>
  95. std::true_type has_abs_imp(int);
  96. template <class T>
  97. std::false_type has_abs_imp(...);
  98. template <class T>
  99. struct has_abs : decltype(has_abs_imp<T>(0)) {};
  100. void test_abs()
  101. {
  102. #ifdef __clang__
  103. #pragma clang diagnostic push
  104. #pragma clang diagnostic ignored "-Wabsolute-value"
  105. #endif
  106. static_assert((std::is_same<decltype(abs((float)0)), float>::value), "");
  107. static_assert((std::is_same<decltype(abs((double)0)), double>::value), "");
  108. static_assert(
  109. (std::is_same<decltype(abs((long double)0)), long double>::value), "");
  110. static_assert((std::is_same<decltype(abs((int)0)), int>::value), "");
  111. static_assert((std::is_same<decltype(abs((long)0)), long>::value), "");
  112. static_assert((std::is_same<decltype(abs((long long)0)), long long>::value),
  113. "");
  114. static_assert((std::is_same<decltype(abs((unsigned char)0)), int>::value),
  115. "");
  116. static_assert((std::is_same<decltype(abs((unsigned short)0)), int>::value),
  117. "");
  118. static_assert((std::is_same<decltype(abs(Ambiguous())), Ambiguous>::value),
  119. "");
  120. static_assert(!has_abs<unsigned>::value, "");
  121. static_assert(!has_abs<unsigned long>::value, "");
  122. static_assert(!has_abs<unsigned long long>::value, "");
  123. #ifdef __clang__
  124. #pragma clang diagnostic pop
  125. #endif
  126. assert(abs(-1.) == 1);
  127. }
  128. void test_acos()
  129. {
  130. static_assert((std::is_same<decltype(acos((float)0)), float>::value), "");
  131. static_assert((std::is_same<decltype(acos((bool)0)), double>::value), "");
  132. static_assert((std::is_same<decltype(acos((unsigned short)0)), double>::value), "");
  133. static_assert((std::is_same<decltype(acos((int)0)), double>::value), "");
  134. static_assert((std::is_same<decltype(acos((unsigned int)0)), double>::value), "");
  135. static_assert((std::is_same<decltype(acos((long)0)), double>::value), "");
  136. static_assert((std::is_same<decltype(acos((unsigned long)0)), double>::value), "");
  137. static_assert((std::is_same<decltype(acos((long long)0)), double>::value), "");
  138. static_assert((std::is_same<decltype(acos((unsigned long long)0)), double>::value), "");
  139. static_assert((std::is_same<decltype(acos((double)0)), double>::value), "");
  140. static_assert((std::is_same<decltype(acos((long double)0)), long double>::value), "");
  141. static_assert((std::is_same<decltype(acosf(0)), float>::value), "");
  142. static_assert((std::is_same<decltype(acosl(0)), long double>::value), "");
  143. static_assert((std::is_same<decltype(acos(Ambiguous())), Ambiguous>::value), "");
  144. assert(acos(1) == 0);
  145. }
  146. void test_asin()
  147. {
  148. static_assert((std::is_same<decltype(asin((float)0)), float>::value), "");
  149. static_assert((std::is_same<decltype(asin((bool)0)), double>::value), "");
  150. static_assert((std::is_same<decltype(asin((unsigned short)0)), double>::value), "");
  151. static_assert((std::is_same<decltype(asin((int)0)), double>::value), "");
  152. static_assert((std::is_same<decltype(asin((unsigned int)0)), double>::value), "");
  153. static_assert((std::is_same<decltype(asin((long)0)), double>::value), "");
  154. static_assert((std::is_same<decltype(asin((unsigned long)0)), double>::value), "");
  155. static_assert((std::is_same<decltype(asin((long long)0)), double>::value), "");
  156. static_assert((std::is_same<decltype(asin((unsigned long long)0)), double>::value), "");
  157. static_assert((std::is_same<decltype(asin((double)0)), double>::value), "");
  158. static_assert((std::is_same<decltype(asin((long double)0)), long double>::value), "");
  159. static_assert((std::is_same<decltype(asinf(0)), float>::value), "");
  160. static_assert((std::is_same<decltype(asinl(0)), long double>::value), "");
  161. static_assert((std::is_same<decltype(asin(Ambiguous())), Ambiguous>::value), "");
  162. assert(asin(0) == 0);
  163. }
  164. void test_atan()
  165. {
  166. static_assert((std::is_same<decltype(atan((float)0)), float>::value), "");
  167. static_assert((std::is_same<decltype(atan((bool)0)), double>::value), "");
  168. static_assert((std::is_same<decltype(atan((unsigned short)0)), double>::value), "");
  169. static_assert((std::is_same<decltype(atan((int)0)), double>::value), "");
  170. static_assert((std::is_same<decltype(atan((unsigned int)0)), double>::value), "");
  171. static_assert((std::is_same<decltype(atan((long)0)), double>::value), "");
  172. static_assert((std::is_same<decltype(atan((unsigned long)0)), double>::value), "");
  173. static_assert((std::is_same<decltype(atan((long long)0)), double>::value), "");
  174. static_assert((std::is_same<decltype(atan((unsigned long long)0)), double>::value), "");
  175. static_assert((std::is_same<decltype(atan((double)0)), double>::value), "");
  176. static_assert((std::is_same<decltype(atan((long double)0)), long double>::value), "");
  177. static_assert((std::is_same<decltype(atanf(0)), float>::value), "");
  178. static_assert((std::is_same<decltype(atanl(0)), long double>::value), "");
  179. static_assert((std::is_same<decltype(atan(Ambiguous())), Ambiguous>::value), "");
  180. assert(atan(0) == 0);
  181. }
  182. void test_atan2()
  183. {
  184. static_assert((std::is_same<decltype(atan2((float)0, (float)0)), float>::value), "");
  185. static_assert((std::is_same<decltype(atan2((bool)0, (float)0)), double>::value), "");
  186. static_assert((std::is_same<decltype(atan2((unsigned short)0, (double)0)), double>::value), "");
  187. static_assert((std::is_same<decltype(atan2((int)0, (long double)0)), long double>::value), "");
  188. static_assert((std::is_same<decltype(atan2((float)0, (unsigned int)0)), double>::value), "");
  189. static_assert((std::is_same<decltype(atan2((double)0, (long)0)), double>::value), "");
  190. static_assert((std::is_same<decltype(atan2((long double)0, (unsigned long)0)), long double>::value), "");
  191. static_assert((std::is_same<decltype(atan2((int)0, (long long)0)), double>::value), "");
  192. static_assert((std::is_same<decltype(atan2((int)0, (unsigned long long)0)), double>::value), "");
  193. static_assert((std::is_same<decltype(atan2((double)0, (double)0)), double>::value), "");
  194. static_assert((std::is_same<decltype(atan2((long double)0, (long double)0)), long double>::value), "");
  195. static_assert((std::is_same<decltype(atan2((float)0, (double)0)), double>::value), "");
  196. static_assert((std::is_same<decltype(atan2((float)0, (long double)0)), long double>::value), "");
  197. static_assert((std::is_same<decltype(atan2((double)0, (long double)0)), long double>::value), "");
  198. static_assert((std::is_same<decltype(atan2f(0,0)), float>::value), "");
  199. static_assert((std::is_same<decltype(atan2l(0,0)), long double>::value), "");
  200. static_assert((std::is_same<decltype(atan2((int)0, (int)0)), double>::value), "");
  201. static_assert((std::is_same<decltype(atan2(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  202. assert(atan2(0,1) == 0);
  203. }
  204. void test_ceil()
  205. {
  206. static_assert((std::is_same<decltype(ceil((float)0)), float>::value), "");
  207. static_assert((std::is_same<decltype(ceil((bool)0)), double>::value), "");
  208. static_assert((std::is_same<decltype(ceil((unsigned short)0)), double>::value), "");
  209. static_assert((std::is_same<decltype(ceil((int)0)), double>::value), "");
  210. static_assert((std::is_same<decltype(ceil((unsigned int)0)), double>::value), "");
  211. static_assert((std::is_same<decltype(ceil((long)0)), double>::value), "");
  212. static_assert((std::is_same<decltype(ceil((unsigned long)0)), double>::value), "");
  213. static_assert((std::is_same<decltype(ceil((long long)0)), double>::value), "");
  214. static_assert((std::is_same<decltype(ceil((unsigned long long)0)), double>::value), "");
  215. static_assert((std::is_same<decltype(ceil((double)0)), double>::value), "");
  216. static_assert((std::is_same<decltype(ceil((long double)0)), long double>::value), "");
  217. static_assert((std::is_same<decltype(ceilf(0)), float>::value), "");
  218. static_assert((std::is_same<decltype(ceill(0)), long double>::value), "");
  219. static_assert((std::is_same<decltype(ceil(Ambiguous())), Ambiguous>::value), "");
  220. assert(ceil(0) == 0);
  221. }
  222. void test_cos()
  223. {
  224. static_assert((std::is_same<decltype(cos((float)0)), float>::value), "");
  225. static_assert((std::is_same<decltype(cos((bool)0)), double>::value), "");
  226. static_assert((std::is_same<decltype(cos((unsigned short)0)), double>::value), "");
  227. static_assert((std::is_same<decltype(cos((int)0)), double>::value), "");
  228. static_assert((std::is_same<decltype(cos((unsigned int)0)), double>::value), "");
  229. static_assert((std::is_same<decltype(cos((long)0)), double>::value), "");
  230. static_assert((std::is_same<decltype(cos((unsigned long)0)), double>::value), "");
  231. static_assert((std::is_same<decltype(cos((long long)0)), double>::value), "");
  232. static_assert((std::is_same<decltype(cos((unsigned long long)0)), double>::value), "");
  233. static_assert((std::is_same<decltype(cos((double)0)), double>::value), "");
  234. static_assert((std::is_same<decltype(cos((long double)0)), long double>::value), "");
  235. static_assert((std::is_same<decltype(cosf(0)), float>::value), "");
  236. static_assert((std::is_same<decltype(cosl(0)), long double>::value), "");
  237. static_assert((std::is_same<decltype(cos(Ambiguous())), Ambiguous>::value), "");
  238. assert(cos(0) == 1);
  239. }
  240. void test_cosh()
  241. {
  242. static_assert((std::is_same<decltype(cosh((float)0)), float>::value), "");
  243. static_assert((std::is_same<decltype(cosh((bool)0)), double>::value), "");
  244. static_assert((std::is_same<decltype(cosh((unsigned short)0)), double>::value), "");
  245. static_assert((std::is_same<decltype(cosh((int)0)), double>::value), "");
  246. static_assert((std::is_same<decltype(cosh((unsigned int)0)), double>::value), "");
  247. static_assert((std::is_same<decltype(cosh((long)0)), double>::value), "");
  248. static_assert((std::is_same<decltype(cosh((unsigned long)0)), double>::value), "");
  249. static_assert((std::is_same<decltype(cosh((long long)0)), double>::value), "");
  250. static_assert((std::is_same<decltype(cosh((unsigned long long)0)), double>::value), "");
  251. static_assert((std::is_same<decltype(cosh((double)0)), double>::value), "");
  252. static_assert((std::is_same<decltype(cosh((long double)0)), long double>::value), "");
  253. static_assert((std::is_same<decltype(coshf(0)), float>::value), "");
  254. static_assert((std::is_same<decltype(coshl(0)), long double>::value), "");
  255. static_assert((std::is_same<decltype(cosh(Ambiguous())), Ambiguous>::value), "");
  256. assert(cosh(0) == 1);
  257. }
  258. void test_exp()
  259. {
  260. static_assert((std::is_same<decltype(exp((float)0)), float>::value), "");
  261. static_assert((std::is_same<decltype(exp((bool)0)), double>::value), "");
  262. static_assert((std::is_same<decltype(exp((unsigned short)0)), double>::value), "");
  263. static_assert((std::is_same<decltype(exp((int)0)), double>::value), "");
  264. static_assert((std::is_same<decltype(exp((unsigned int)0)), double>::value), "");
  265. static_assert((std::is_same<decltype(exp((long)0)), double>::value), "");
  266. static_assert((std::is_same<decltype(exp((unsigned long)0)), double>::value), "");
  267. static_assert((std::is_same<decltype(exp((long long)0)), double>::value), "");
  268. static_assert((std::is_same<decltype(exp((unsigned long long)0)), double>::value), "");
  269. static_assert((std::is_same<decltype(exp((double)0)), double>::value), "");
  270. static_assert((std::is_same<decltype(exp((long double)0)), long double>::value), "");
  271. static_assert((std::is_same<decltype(expf(0)), float>::value), "");
  272. static_assert((std::is_same<decltype(expl(0)), long double>::value), "");
  273. static_assert((std::is_same<decltype(exp(Ambiguous())), Ambiguous>::value), "");
  274. assert(exp(0) == 1);
  275. }
  276. void test_fabs()
  277. {
  278. static_assert((std::is_same<decltype(fabs((float)0)), float>::value), "");
  279. static_assert((std::is_same<decltype(fabs((bool)0)), double>::value), "");
  280. static_assert((std::is_same<decltype(fabs((unsigned short)0)), double>::value), "");
  281. static_assert((std::is_same<decltype(fabs((int)0)), double>::value), "");
  282. static_assert((std::is_same<decltype(fabs((unsigned int)0)), double>::value), "");
  283. static_assert((std::is_same<decltype(fabs((long)0)), double>::value), "");
  284. static_assert((std::is_same<decltype(fabs((unsigned long)0)), double>::value), "");
  285. static_assert((std::is_same<decltype(fabs((long long)0)), double>::value), "");
  286. static_assert((std::is_same<decltype(fabs((unsigned long long)0)), double>::value), "");
  287. static_assert((std::is_same<decltype(fabs((double)0)), double>::value), "");
  288. static_assert((std::is_same<decltype(fabs((long double)0)), long double>::value), "");
  289. static_assert((std::is_same<decltype(fabsf(0.0f)), float>::value), "");
  290. static_assert((std::is_same<decltype(fabsl(0.0L)), long double>::value), "");
  291. static_assert((std::is_same<decltype(fabs(Ambiguous())), Ambiguous>::value), "");
  292. assert(fabs(-1) == 1);
  293. }
  294. void test_floor()
  295. {
  296. static_assert((std::is_same<decltype(floor((float)0)), float>::value), "");
  297. static_assert((std::is_same<decltype(floor((bool)0)), double>::value), "");
  298. static_assert((std::is_same<decltype(floor((unsigned short)0)), double>::value), "");
  299. static_assert((std::is_same<decltype(floor((int)0)), double>::value), "");
  300. static_assert((std::is_same<decltype(floor((unsigned int)0)), double>::value), "");
  301. static_assert((std::is_same<decltype(floor((long)0)), double>::value), "");
  302. static_assert((std::is_same<decltype(floor((unsigned long)0)), double>::value), "");
  303. static_assert((std::is_same<decltype(floor((long long)0)), double>::value), "");
  304. static_assert((std::is_same<decltype(floor((unsigned long long)0)), double>::value), "");
  305. static_assert((std::is_same<decltype(floor((double)0)), double>::value), "");
  306. static_assert((std::is_same<decltype(floor((long double)0)), long double>::value), "");
  307. static_assert((std::is_same<decltype(floorf(0)), float>::value), "");
  308. static_assert((std::is_same<decltype(floorl(0)), long double>::value), "");
  309. static_assert((std::is_same<decltype(floor(Ambiguous())), Ambiguous>::value), "");
  310. assert(floor(1) == 1);
  311. }
  312. void test_fmod()
  313. {
  314. static_assert((std::is_same<decltype(fmod((float)0, (float)0)), float>::value), "");
  315. static_assert((std::is_same<decltype(fmod((bool)0, (float)0)), double>::value), "");
  316. static_assert((std::is_same<decltype(fmod((unsigned short)0, (double)0)), double>::value), "");
  317. static_assert((std::is_same<decltype(fmod((int)0, (long double)0)), long double>::value), "");
  318. static_assert((std::is_same<decltype(fmod((float)0, (unsigned int)0)), double>::value), "");
  319. static_assert((std::is_same<decltype(fmod((double)0, (long)0)), double>::value), "");
  320. static_assert((std::is_same<decltype(fmod((long double)0, (unsigned long)0)), long double>::value), "");
  321. static_assert((std::is_same<decltype(fmod((int)0, (long long)0)), double>::value), "");
  322. static_assert((std::is_same<decltype(fmod((int)0, (unsigned long long)0)), double>::value), "");
  323. static_assert((std::is_same<decltype(fmod((double)0, (double)0)), double>::value), "");
  324. static_assert((std::is_same<decltype(fmod((long double)0, (long double)0)), long double>::value), "");
  325. static_assert((std::is_same<decltype(fmod((float)0, (double)0)), double>::value), "");
  326. static_assert((std::is_same<decltype(fmod((float)0, (long double)0)), long double>::value), "");
  327. static_assert((std::is_same<decltype(fmod((double)0, (long double)0)), long double>::value), "");
  328. static_assert((std::is_same<decltype(fmodf(0,0)), float>::value), "");
  329. static_assert((std::is_same<decltype(fmodl(0,0)), long double>::value), "");
  330. static_assert((std::is_same<decltype(fmod((int)0, (int)0)), double>::value), "");
  331. static_assert((std::is_same<decltype(fmod(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  332. assert(fmod(1.5,1) == .5);
  333. }
  334. void test_frexp()
  335. {
  336. int ip;
  337. static_assert((std::is_same<decltype(frexp((float)0, &ip)), float>::value), "");
  338. static_assert((std::is_same<decltype(frexp((bool)0, &ip)), double>::value), "");
  339. static_assert((std::is_same<decltype(frexp((unsigned short)0, &ip)), double>::value), "");
  340. static_assert((std::is_same<decltype(frexp((int)0, &ip)), double>::value), "");
  341. static_assert((std::is_same<decltype(frexp((unsigned int)0, &ip)), double>::value), "");
  342. static_assert((std::is_same<decltype(frexp((long)0, &ip)), double>::value), "");
  343. static_assert((std::is_same<decltype(frexp((unsigned long)0, &ip)), double>::value), "");
  344. static_assert((std::is_same<decltype(frexp((long long)0, &ip)), double>::value), "");
  345. static_assert((std::is_same<decltype(frexp((unsigned long long)0, &ip)), double>::value), "");
  346. static_assert((std::is_same<decltype(frexp((double)0, &ip)), double>::value), "");
  347. static_assert((std::is_same<decltype(frexp((long double)0, &ip)), long double>::value), "");
  348. static_assert((std::is_same<decltype(frexpf(0, &ip)), float>::value), "");
  349. static_assert((std::is_same<decltype(frexpl(0, &ip)), long double>::value), "");
  350. static_assert((std::is_same<decltype(frexp(Ambiguous(), &ip)), Ambiguous>::value), "");
  351. assert(frexp(0, &ip) == 0);
  352. }
  353. void test_ldexp()
  354. {
  355. int ip = 1;
  356. static_assert((std::is_same<decltype(ldexp((float)0, ip)), float>::value), "");
  357. static_assert((std::is_same<decltype(ldexp((bool)0, ip)), double>::value), "");
  358. static_assert((std::is_same<decltype(ldexp((unsigned short)0, ip)), double>::value), "");
  359. static_assert((std::is_same<decltype(ldexp((int)0, ip)), double>::value), "");
  360. static_assert((std::is_same<decltype(ldexp((unsigned int)0, ip)), double>::value), "");
  361. static_assert((std::is_same<decltype(ldexp((long)0, ip)), double>::value), "");
  362. static_assert((std::is_same<decltype(ldexp((unsigned long)0, ip)), double>::value), "");
  363. static_assert((std::is_same<decltype(ldexp((long long)0, ip)), double>::value), "");
  364. static_assert((std::is_same<decltype(ldexp((unsigned long long)0, ip)), double>::value), "");
  365. static_assert((std::is_same<decltype(ldexp((double)0, ip)), double>::value), "");
  366. static_assert((std::is_same<decltype(ldexp((long double)0, ip)), long double>::value), "");
  367. static_assert((std::is_same<decltype(ldexpf(0, ip)), float>::value), "");
  368. static_assert((std::is_same<decltype(ldexpl(0, ip)), long double>::value), "");
  369. static_assert((std::is_same<decltype(ldexp(Ambiguous(), ip)), Ambiguous>::value), "");
  370. assert(ldexp(1, ip) == 2);
  371. }
  372. void test_log()
  373. {
  374. static_assert((std::is_same<decltype(log((float)0)), float>::value), "");
  375. static_assert((std::is_same<decltype(log((bool)0)), double>::value), "");
  376. static_assert((std::is_same<decltype(log((unsigned short)0)), double>::value), "");
  377. static_assert((std::is_same<decltype(log((int)0)), double>::value), "");
  378. static_assert((std::is_same<decltype(log((unsigned int)0)), double>::value), "");
  379. static_assert((std::is_same<decltype(log((long)0)), double>::value), "");
  380. static_assert((std::is_same<decltype(log((unsigned long)0)), double>::value), "");
  381. static_assert((std::is_same<decltype(log((long long)0)), double>::value), "");
  382. static_assert((std::is_same<decltype(log((unsigned long long)0)), double>::value), "");
  383. static_assert((std::is_same<decltype(log((double)0)), double>::value), "");
  384. static_assert((std::is_same<decltype(log((long double)0)), long double>::value), "");
  385. static_assert((std::is_same<decltype(logf(0)), float>::value), "");
  386. static_assert((std::is_same<decltype(logl(0)), long double>::value), "");
  387. static_assert((std::is_same<decltype(log(Ambiguous())), Ambiguous>::value), "");
  388. assert(log(1) == 0);
  389. }
  390. void test_log10()
  391. {
  392. static_assert((std::is_same<decltype(log10((float)0)), float>::value), "");
  393. static_assert((std::is_same<decltype(log10((bool)0)), double>::value), "");
  394. static_assert((std::is_same<decltype(log10((unsigned short)0)), double>::value), "");
  395. static_assert((std::is_same<decltype(log10((int)0)), double>::value), "");
  396. static_assert((std::is_same<decltype(log10((unsigned int)0)), double>::value), "");
  397. static_assert((std::is_same<decltype(log10((long)0)), double>::value), "");
  398. static_assert((std::is_same<decltype(log10((unsigned long)0)), double>::value), "");
  399. static_assert((std::is_same<decltype(log10((long long)0)), double>::value), "");
  400. static_assert((std::is_same<decltype(log10((unsigned long long)0)), double>::value), "");
  401. static_assert((std::is_same<decltype(log10((double)0)), double>::value), "");
  402. static_assert((std::is_same<decltype(log10((long double)0)), long double>::value), "");
  403. static_assert((std::is_same<decltype(log10f(0)), float>::value), "");
  404. static_assert((std::is_same<decltype(log10l(0)), long double>::value), "");
  405. static_assert((std::is_same<decltype(log10(Ambiguous())), Ambiguous>::value), "");
  406. assert(log10(1) == 0);
  407. }
  408. void test_modf()
  409. {
  410. static_assert((std::is_same<decltype(modf((float)0, (float*)0)), float>::value), "");
  411. static_assert((std::is_same<decltype(modf((double)0, (double*)0)), double>::value), "");
  412. static_assert((std::is_same<decltype(modf((long double)0, (long double*)0)), long double>::value), "");
  413. static_assert((std::is_same<decltype(modff(0, (float*)0)), float>::value), "");
  414. static_assert((std::is_same<decltype(modfl(0, (long double*)0)), long double>::value), "");
  415. static_assert((std::is_same<decltype(modf(Ambiguous(), (Ambiguous*)0)), Ambiguous>::value), "");
  416. double i;
  417. assert(modf(1., &i) == 0);
  418. }
  419. void test_pow()
  420. {
  421. static_assert((std::is_same<decltype(pow((float)0, (float)0)), float>::value), "");
  422. static_assert((std::is_same<decltype(pow((bool)0, (float)0)), double>::value), "");
  423. static_assert((std::is_same<decltype(pow((unsigned short)0, (double)0)), double>::value), "");
  424. static_assert((std::is_same<decltype(pow((int)0, (long double)0)), long double>::value), "");
  425. static_assert((std::is_same<decltype(pow((float)0, (unsigned int)0)), double>::value), "");
  426. static_assert((std::is_same<decltype(pow((double)0, (long)0)), double>::value), "");
  427. static_assert((std::is_same<decltype(pow((long double)0, (unsigned long)0)), long double>::value), "");
  428. static_assert((std::is_same<decltype(pow((int)0, (long long)0)), double>::value), "");
  429. static_assert((std::is_same<decltype(pow((int)0, (unsigned long long)0)), double>::value), "");
  430. static_assert((std::is_same<decltype(pow((double)0, (double)0)), double>::value), "");
  431. static_assert((std::is_same<decltype(pow((long double)0, (long double)0)), long double>::value), "");
  432. static_assert((std::is_same<decltype(pow((float)0, (double)0)), double>::value), "");
  433. static_assert((std::is_same<decltype(pow((float)0, (long double)0)), long double>::value), "");
  434. static_assert((std::is_same<decltype(pow((double)0, (long double)0)), long double>::value), "");
  435. static_assert((std::is_same<decltype(powf(0,0)), float>::value), "");
  436. static_assert((std::is_same<decltype(powl(0,0)), long double>::value), "");
  437. static_assert((std::is_same<decltype(pow((int)0, (int)0)), double>::value), "");
  438. // static_assert((std::is_same<decltype(pow(Value<int>(), (int)0)), double>::value), "");
  439. // static_assert((std::is_same<decltype(pow(Value<long double>(), (float)0)), long double>::value), "");
  440. // static_assert((std::is_same<decltype(pow((float) 0, Value<float>())), float>::value), "");
  441. static_assert((std::is_same<decltype(pow(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  442. assert(pow(1,1) == 1);
  443. // assert(pow(Value<int,1>(), Value<float,1>()) == 1);
  444. // assert(pow(1.0f, Value<double,1>()) == 1);
  445. // assert(pow(1.0, Value<int,1>()) == 1);
  446. // assert(pow(Value<long double,1>(), 1LL) == 1);
  447. }
  448. void test_sin()
  449. {
  450. static_assert((std::is_same<decltype(sin((float)0)), float>::value), "");
  451. static_assert((std::is_same<decltype(sin((bool)0)), double>::value), "");
  452. static_assert((std::is_same<decltype(sin((unsigned short)0)), double>::value), "");
  453. static_assert((std::is_same<decltype(sin((int)0)), double>::value), "");
  454. static_assert((std::is_same<decltype(sin((unsigned int)0)), double>::value), "");
  455. static_assert((std::is_same<decltype(sin((long)0)), double>::value), "");
  456. static_assert((std::is_same<decltype(sin((unsigned long)0)), double>::value), "");
  457. static_assert((std::is_same<decltype(sin((long long)0)), double>::value), "");
  458. static_assert((std::is_same<decltype(sin((unsigned long long)0)), double>::value), "");
  459. static_assert((std::is_same<decltype(sin((double)0)), double>::value), "");
  460. static_assert((std::is_same<decltype(sin((long double)0)), long double>::value), "");
  461. static_assert((std::is_same<decltype(sinf(0)), float>::value), "");
  462. static_assert((std::is_same<decltype(sinl(0)), long double>::value), "");
  463. static_assert((std::is_same<decltype(sin(Ambiguous())), Ambiguous>::value), "");
  464. assert(sin(0) == 0);
  465. }
  466. void test_sinh()
  467. {
  468. static_assert((std::is_same<decltype(sinh((float)0)), float>::value), "");
  469. static_assert((std::is_same<decltype(sinh((bool)0)), double>::value), "");
  470. static_assert((std::is_same<decltype(sinh((unsigned short)0)), double>::value), "");
  471. static_assert((std::is_same<decltype(sinh((int)0)), double>::value), "");
  472. static_assert((std::is_same<decltype(sinh((unsigned int)0)), double>::value), "");
  473. static_assert((std::is_same<decltype(sinh((long)0)), double>::value), "");
  474. static_assert((std::is_same<decltype(sinh((unsigned long)0)), double>::value), "");
  475. static_assert((std::is_same<decltype(sinh((long long)0)), double>::value), "");
  476. static_assert((std::is_same<decltype(sinh((unsigned long long)0)), double>::value), "");
  477. static_assert((std::is_same<decltype(sinh((double)0)), double>::value), "");
  478. static_assert((std::is_same<decltype(sinh((long double)0)), long double>::value), "");
  479. static_assert((std::is_same<decltype(sinhf(0)), float>::value), "");
  480. static_assert((std::is_same<decltype(sinhl(0)), long double>::value), "");
  481. static_assert((std::is_same<decltype(sinh(Ambiguous())), Ambiguous>::value), "");
  482. assert(sinh(0) == 0);
  483. }
  484. void test_sqrt()
  485. {
  486. static_assert((std::is_same<decltype(sqrt((float)0)), float>::value), "");
  487. static_assert((std::is_same<decltype(sqrt((bool)0)), double>::value), "");
  488. static_assert((std::is_same<decltype(sqrt((unsigned short)0)), double>::value), "");
  489. static_assert((std::is_same<decltype(sqrt((int)0)), double>::value), "");
  490. static_assert((std::is_same<decltype(sqrt((unsigned int)0)), double>::value), "");
  491. static_assert((std::is_same<decltype(sqrt((long)0)), double>::value), "");
  492. static_assert((std::is_same<decltype(sqrt((unsigned long)0)), double>::value), "");
  493. static_assert((std::is_same<decltype(sqrt((long long)0)), double>::value), "");
  494. static_assert((std::is_same<decltype(sqrt((unsigned long long)0)), double>::value), "");
  495. static_assert((std::is_same<decltype(sqrt((double)0)), double>::value), "");
  496. static_assert((std::is_same<decltype(sqrt((long double)0)), long double>::value), "");
  497. static_assert((std::is_same<decltype(sqrtf(0)), float>::value), "");
  498. static_assert((std::is_same<decltype(sqrtl(0)), long double>::value), "");
  499. static_assert((std::is_same<decltype(sqrt(Ambiguous())), Ambiguous>::value), "");
  500. assert(sqrt(4) == 2);
  501. }
  502. void test_tan()
  503. {
  504. static_assert((std::is_same<decltype(tan((float)0)), float>::value), "");
  505. static_assert((std::is_same<decltype(tan((bool)0)), double>::value), "");
  506. static_assert((std::is_same<decltype(tan((unsigned short)0)), double>::value), "");
  507. static_assert((std::is_same<decltype(tan((int)0)), double>::value), "");
  508. static_assert((std::is_same<decltype(tan((unsigned int)0)), double>::value), "");
  509. static_assert((std::is_same<decltype(tan((long)0)), double>::value), "");
  510. static_assert((std::is_same<decltype(tan((unsigned long)0)), double>::value), "");
  511. static_assert((std::is_same<decltype(tan((long long)0)), double>::value), "");
  512. static_assert((std::is_same<decltype(tan((unsigned long long)0)), double>::value), "");
  513. static_assert((std::is_same<decltype(tan((double)0)), double>::value), "");
  514. static_assert((std::is_same<decltype(tan((long double)0)), long double>::value), "");
  515. static_assert((std::is_same<decltype(tanf(0)), float>::value), "");
  516. static_assert((std::is_same<decltype(tanl(0)), long double>::value), "");
  517. static_assert((std::is_same<decltype(tan(Ambiguous())), Ambiguous>::value), "");
  518. assert(tan(0) == 0);
  519. }
  520. void test_tanh()
  521. {
  522. static_assert((std::is_same<decltype(tanh((float)0)), float>::value), "");
  523. static_assert((std::is_same<decltype(tanh((bool)0)), double>::value), "");
  524. static_assert((std::is_same<decltype(tanh((unsigned short)0)), double>::value), "");
  525. static_assert((std::is_same<decltype(tanh((int)0)), double>::value), "");
  526. static_assert((std::is_same<decltype(tanh((unsigned int)0)), double>::value), "");
  527. static_assert((std::is_same<decltype(tanh((long)0)), double>::value), "");
  528. static_assert((std::is_same<decltype(tanh((unsigned long)0)), double>::value), "");
  529. static_assert((std::is_same<decltype(tanh((long long)0)), double>::value), "");
  530. static_assert((std::is_same<decltype(tanh((unsigned long long)0)), double>::value), "");
  531. static_assert((std::is_same<decltype(tanh((double)0)), double>::value), "");
  532. static_assert((std::is_same<decltype(tanh((long double)0)), long double>::value), "");
  533. static_assert((std::is_same<decltype(tanhf(0)), float>::value), "");
  534. static_assert((std::is_same<decltype(tanhl(0)), long double>::value), "");
  535. static_assert((std::is_same<decltype(tanh(Ambiguous())), Ambiguous>::value), "");
  536. assert(tanh(0) == 0);
  537. }
  538. void test_signbit()
  539. {
  540. #ifdef signbit
  541. #error signbit defined
  542. #endif
  543. static_assert((std::is_same<decltype(signbit((float)0)), bool>::value), "");
  544. static_assert((std::is_same<decltype(signbit((double)0)), bool>::value), "");
  545. static_assert((std::is_same<decltype(signbit(0)), bool>::value), "");
  546. static_assert((std::is_same<decltype(signbit((long double)0)), bool>::value), "");
  547. static_assert((std::is_same<decltype(signbit(Ambiguous())), Ambiguous>::value), "");
  548. assert(signbit(-1.0) == true);
  549. }
  550. void test_fpclassify()
  551. {
  552. #ifdef fpclassify
  553. #error fpclassify defined
  554. #endif
  555. static_assert((std::is_same<decltype(fpclassify((float)0)), int>::value), "");
  556. static_assert((std::is_same<decltype(fpclassify((double)0)), int>::value), "");
  557. static_assert((std::is_same<decltype(fpclassify(0)), int>::value), "");
  558. static_assert((std::is_same<decltype(fpclassify((long double)0)), int>::value), "");
  559. static_assert((std::is_same<decltype(fpclassify(Ambiguous())), Ambiguous>::value), "");
  560. assert(fpclassify(-1.0) == FP_NORMAL);
  561. }
  562. void test_isfinite()
  563. {
  564. #ifdef isfinite
  565. #error isfinite defined
  566. #endif
  567. static_assert((std::is_same<decltype(isfinite((float)0)), bool>::value), "");
  568. static_assert((std::is_same<decltype(isfinite((double)0)), bool>::value), "");
  569. static_assert((std::is_same<decltype(isfinite(0)), bool>::value), "");
  570. static_assert((std::is_same<decltype(isfinite((long double)0)), bool>::value), "");
  571. static_assert((std::is_same<decltype(isfinite(Ambiguous())), Ambiguous>::value), "");
  572. assert(isfinite(-1.0) == true);
  573. }
  574. void test_isnormal()
  575. {
  576. #ifdef isnormal
  577. #error isnormal defined
  578. #endif
  579. static_assert((std::is_same<decltype(isnormal((float)0)), bool>::value), "");
  580. static_assert((std::is_same<decltype(isnormal((double)0)), bool>::value), "");
  581. static_assert((std::is_same<decltype(isnormal(0)), bool>::value), "");
  582. static_assert((std::is_same<decltype(isnormal((long double)0)), bool>::value), "");
  583. static_assert((std::is_same<decltype(isnormal(Ambiguous())), Ambiguous>::value), "");
  584. assert(isnormal(-1.0) == true);
  585. }
  586. void test_isgreater()
  587. {
  588. #ifdef isgreater
  589. #error isgreater defined
  590. #endif
  591. static_assert((std::is_same<decltype(isgreater((float)0, (float)0)), bool>::value), "");
  592. static_assert((std::is_same<decltype(isgreater((float)0, (double)0)), bool>::value), "");
  593. static_assert((std::is_same<decltype(isgreater((float)0, (long double)0)), bool>::value), "");
  594. static_assert((std::is_same<decltype(isgreater((double)0, (float)0)), bool>::value), "");
  595. static_assert((std::is_same<decltype(isgreater((double)0, (double)0)), bool>::value), "");
  596. static_assert((std::is_same<decltype(isgreater(0, (double)0)), bool>::value), "");
  597. static_assert((std::is_same<decltype(isgreater((double)0, (long double)0)), bool>::value), "");
  598. static_assert((std::is_same<decltype(isgreater((long double)0, (float)0)), bool>::value), "");
  599. static_assert((std::is_same<decltype(isgreater((long double)0, (double)0)), bool>::value), "");
  600. static_assert((std::is_same<decltype(isgreater((long double)0, (long double)0)), bool>::value), "");
  601. static_assert((std::is_same<decltype(isgreater(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  602. assert(isgreater(-1.0, 0.F) == false);
  603. }
  604. void test_isgreaterequal()
  605. {
  606. #ifdef isgreaterequal
  607. #error isgreaterequal defined
  608. #endif
  609. static_assert((std::is_same<decltype(isgreaterequal((float)0, (float)0)), bool>::value), "");
  610. static_assert((std::is_same<decltype(isgreaterequal((float)0, (double)0)), bool>::value), "");
  611. static_assert((std::is_same<decltype(isgreaterequal((float)0, (long double)0)), bool>::value), "");
  612. static_assert((std::is_same<decltype(isgreaterequal((double)0, (float)0)), bool>::value), "");
  613. static_assert((std::is_same<decltype(isgreaterequal((double)0, (double)0)), bool>::value), "");
  614. static_assert((std::is_same<decltype(isgreaterequal(0, (double)0)), bool>::value), "");
  615. static_assert((std::is_same<decltype(isgreaterequal((double)0, (long double)0)), bool>::value), "");
  616. static_assert((std::is_same<decltype(isgreaterequal((long double)0, (float)0)), bool>::value), "");
  617. static_assert((std::is_same<decltype(isgreaterequal((long double)0, (double)0)), bool>::value), "");
  618. static_assert((std::is_same<decltype(isgreaterequal((long double)0, (long double)0)), bool>::value), "");
  619. static_assert((std::is_same<decltype(isgreaterequal(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  620. assert(isgreaterequal(-1.0, 0.F) == false);
  621. }
  622. void test_isinf()
  623. {
  624. #ifdef isinf
  625. #error isinf defined
  626. #endif
  627. static_assert((std::is_same<decltype(isinf((float)0)), bool>::value), "");
  628. typedef decltype(isinf((double)0)) DoubleRetType;
  629. #ifndef __linux__
  630. static_assert((std::is_same<DoubleRetType, bool>::value), "");
  631. #else
  632. // GLIBC < 2.26 defines 'isinf(double)' with a return type of 'int' in
  633. // all C++ dialects. The test should tolerate this.
  634. // See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439
  635. static_assert((std::is_same<DoubleRetType, bool>::value
  636. || std::is_same<DoubleRetType, int>::value), "");
  637. #endif
  638. static_assert((std::is_same<decltype(isinf(0)), bool>::value), "");
  639. static_assert((std::is_same<decltype(isinf((long double)0)), bool>::value), "");
  640. assert(isinf(-1.0) == false);
  641. }
  642. void test_isless()
  643. {
  644. #ifdef isless
  645. #error isless defined
  646. #endif
  647. static_assert((std::is_same<decltype(isless((float)0, (float)0)), bool>::value), "");
  648. static_assert((std::is_same<decltype(isless((float)0, (double)0)), bool>::value), "");
  649. static_assert((std::is_same<decltype(isless((float)0, (long double)0)), bool>::value), "");
  650. static_assert((std::is_same<decltype(isless((double)0, (float)0)), bool>::value), "");
  651. static_assert((std::is_same<decltype(isless((double)0, (double)0)), bool>::value), "");
  652. static_assert((std::is_same<decltype(isless(0, (double)0)), bool>::value), "");
  653. static_assert((std::is_same<decltype(isless((double)0, (long double)0)), bool>::value), "");
  654. static_assert((std::is_same<decltype(isless((long double)0, (float)0)), bool>::value), "");
  655. static_assert((std::is_same<decltype(isless((long double)0, (double)0)), bool>::value), "");
  656. static_assert((std::is_same<decltype(isless((long double)0, (long double)0)), bool>::value), "");
  657. static_assert((std::is_same<decltype(isless(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  658. assert(isless(-1.0, 0.F) == true);
  659. }
  660. void test_islessequal()
  661. {
  662. #ifdef islessequal
  663. #error islessequal defined
  664. #endif
  665. static_assert((std::is_same<decltype(islessequal((float)0, (float)0)), bool>::value), "");
  666. static_assert((std::is_same<decltype(islessequal((float)0, (double)0)), bool>::value), "");
  667. static_assert((std::is_same<decltype(islessequal((float)0, (long double)0)), bool>::value), "");
  668. static_assert((std::is_same<decltype(islessequal((double)0, (float)0)), bool>::value), "");
  669. static_assert((std::is_same<decltype(islessequal((double)0, (double)0)), bool>::value), "");
  670. static_assert((std::is_same<decltype(islessequal(0, (double)0)), bool>::value), "");
  671. static_assert((std::is_same<decltype(islessequal((double)0, (long double)0)), bool>::value), "");
  672. static_assert((std::is_same<decltype(islessequal((long double)0, (float)0)), bool>::value), "");
  673. static_assert((std::is_same<decltype(islessequal((long double)0, (double)0)), bool>::value), "");
  674. static_assert((std::is_same<decltype(islessequal((long double)0, (long double)0)), bool>::value), "");
  675. static_assert((std::is_same<decltype(islessequal(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  676. assert(islessequal(-1.0, 0.F) == true);
  677. }
  678. void test_islessgreater()
  679. {
  680. #ifdef islessgreater
  681. #error islessgreater defined
  682. #endif
  683. static_assert((std::is_same<decltype(islessgreater((float)0, (float)0)), bool>::value), "");
  684. static_assert((std::is_same<decltype(islessgreater((float)0, (double)0)), bool>::value), "");
  685. static_assert((std::is_same<decltype(islessgreater((float)0, (long double)0)), bool>::value), "");
  686. static_assert((std::is_same<decltype(islessgreater((double)0, (float)0)), bool>::value), "");
  687. static_assert((std::is_same<decltype(islessgreater((double)0, (double)0)), bool>::value), "");
  688. static_assert((std::is_same<decltype(islessgreater(0, (double)0)), bool>::value), "");
  689. static_assert((std::is_same<decltype(islessgreater((double)0, (long double)0)), bool>::value), "");
  690. static_assert((std::is_same<decltype(islessgreater((long double)0, (float)0)), bool>::value), "");
  691. static_assert((std::is_same<decltype(islessgreater((long double)0, (double)0)), bool>::value), "");
  692. static_assert((std::is_same<decltype(islessgreater((long double)0, (long double)0)), bool>::value), "");
  693. static_assert((std::is_same<decltype(islessgreater(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  694. assert(islessgreater(-1.0, 0.F) == true);
  695. }
  696. void test_isnan()
  697. {
  698. #ifdef isnan
  699. #error isnan defined
  700. #endif
  701. static_assert((std::is_same<decltype(isnan((float)0)), bool>::value), "");
  702. typedef decltype(isnan((double)0)) DoubleRetType;
  703. #ifndef __linux__
  704. static_assert((std::is_same<DoubleRetType, bool>::value), "");
  705. #else
  706. // GLIBC < 2.26 defines 'isnan(double)' with a return type of 'int' in
  707. // all C++ dialects. The test should tolerate this.
  708. // See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439
  709. static_assert((std::is_same<DoubleRetType, bool>::value
  710. || std::is_same<DoubleRetType, int>::value), "");
  711. #endif
  712. static_assert((std::is_same<decltype(isnan(0)), bool>::value), "");
  713. static_assert((std::is_same<decltype(isnan((long double)0)), bool>::value), "");
  714. assert(isnan(-1.0) == false);
  715. }
  716. void test_isunordered()
  717. {
  718. #ifdef isunordered
  719. #error isunordered defined
  720. #endif
  721. static_assert((std::is_same<decltype(isunordered((float)0, (float)0)), bool>::value), "");
  722. static_assert((std::is_same<decltype(isunordered((float)0, (double)0)), bool>::value), "");
  723. static_assert((std::is_same<decltype(isunordered((float)0, (long double)0)), bool>::value), "");
  724. static_assert((std::is_same<decltype(isunordered((double)0, (float)0)), bool>::value), "");
  725. static_assert((std::is_same<decltype(isunordered((double)0, (double)0)), bool>::value), "");
  726. static_assert((std::is_same<decltype(isunordered(0, (double)0)), bool>::value), "");
  727. static_assert((std::is_same<decltype(isunordered((double)0, (long double)0)), bool>::value), "");
  728. static_assert((std::is_same<decltype(isunordered((long double)0, (float)0)), bool>::value), "");
  729. static_assert((std::is_same<decltype(isunordered((long double)0, (double)0)), bool>::value), "");
  730. static_assert((std::is_same<decltype(isunordered((long double)0, (long double)0)), bool>::value), "");
  731. static_assert((std::is_same<decltype(isunordered(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  732. assert(isunordered(-1.0, 0.F) == false);
  733. }
  734. void test_acosh()
  735. {
  736. static_assert((std::is_same<decltype(acosh((float)0)), float>::value), "");
  737. static_assert((std::is_same<decltype(acosh((bool)0)), double>::value), "");
  738. static_assert((std::is_same<decltype(acosh((unsigned short)0)), double>::value), "");
  739. static_assert((std::is_same<decltype(acosh((int)0)), double>::value), "");
  740. static_assert((std::is_same<decltype(acosh((unsigned int)0)), double>::value), "");
  741. static_assert((std::is_same<decltype(acosh((long)0)), double>::value), "");
  742. static_assert((std::is_same<decltype(acosh((unsigned long)0)), double>::value), "");
  743. static_assert((std::is_same<decltype(acosh((long long)0)), double>::value), "");
  744. static_assert((std::is_same<decltype(acosh((unsigned long long)0)), double>::value), "");
  745. static_assert((std::is_same<decltype(acosh((double)0)), double>::value), "");
  746. static_assert((std::is_same<decltype(acosh((long double)0)), long double>::value), "");
  747. static_assert((std::is_same<decltype(acoshf(0)), float>::value), "");
  748. static_assert((std::is_same<decltype(acoshl(0)), long double>::value), "");
  749. static_assert((std::is_same<decltype(acosh(Ambiguous())), Ambiguous>::value), "");
  750. assert(acosh(1) == 0);
  751. }
  752. void test_asinh()
  753. {
  754. static_assert((std::is_same<decltype(asinh((float)0)), float>::value), "");
  755. static_assert((std::is_same<decltype(asinh((bool)0)), double>::value), "");
  756. static_assert((std::is_same<decltype(asinh((unsigned short)0)), double>::value), "");
  757. static_assert((std::is_same<decltype(asinh((int)0)), double>::value), "");
  758. static_assert((std::is_same<decltype(asinh((unsigned int)0)), double>::value), "");
  759. static_assert((std::is_same<decltype(asinh((long)0)), double>::value), "");
  760. static_assert((std::is_same<decltype(asinh((unsigned long)0)), double>::value), "");
  761. static_assert((std::is_same<decltype(asinh((long long)0)), double>::value), "");
  762. static_assert((std::is_same<decltype(asinh((unsigned long long)0)), double>::value), "");
  763. static_assert((std::is_same<decltype(asinh((double)0)), double>::value), "");
  764. static_assert((std::is_same<decltype(asinh((long double)0)), long double>::value), "");
  765. static_assert((std::is_same<decltype(asinhf(0)), float>::value), "");
  766. static_assert((std::is_same<decltype(asinhl(0)), long double>::value), "");
  767. static_assert((std::is_same<decltype(asinh(Ambiguous())), Ambiguous>::value), "");
  768. assert(asinh(0) == 0);
  769. }
  770. void test_atanh()
  771. {
  772. static_assert((std::is_same<decltype(atanh((float)0)), float>::value), "");
  773. static_assert((std::is_same<decltype(atanh((bool)0)), double>::value), "");
  774. static_assert((std::is_same<decltype(atanh((unsigned short)0)), double>::value), "");
  775. static_assert((std::is_same<decltype(atanh((int)0)), double>::value), "");
  776. static_assert((std::is_same<decltype(atanh((unsigned int)0)), double>::value), "");
  777. static_assert((std::is_same<decltype(atanh((long)0)), double>::value), "");
  778. static_assert((std::is_same<decltype(atanh((unsigned long)0)), double>::value), "");
  779. static_assert((std::is_same<decltype(atanh((long long)0)), double>::value), "");
  780. static_assert((std::is_same<decltype(atanh((unsigned long long)0)), double>::value), "");
  781. static_assert((std::is_same<decltype(atanh((double)0)), double>::value), "");
  782. static_assert((std::is_same<decltype(atanh((long double)0)), long double>::value), "");
  783. static_assert((std::is_same<decltype(atanhf(0)), float>::value), "");
  784. static_assert((std::is_same<decltype(atanhl(0)), long double>::value), "");
  785. static_assert((std::is_same<decltype(atanh(Ambiguous())), Ambiguous>::value), "");
  786. assert(atanh(0) == 0);
  787. }
  788. void test_cbrt() {
  789. static_assert((std::is_same<decltype(cbrt((float) 0)), float>::value), "");
  790. static_assert((std::is_same<decltype(cbrt((bool) 0)), double>::value), "");
  791. static_assert((std::is_same<decltype(cbrt((unsigned short) 0)),
  792. double>::value), "");
  793. static_assert((std::is_same<decltype(cbrt((int) 0)), double>::value), "");
  794. static_assert((std::is_same<decltype(cbrt((unsigned int) 0)),
  795. double>::value), "");
  796. static_assert((std::is_same<decltype(cbrt((long) 0)), double>::value), "");
  797. static_assert((std::is_same<decltype(cbrt((unsigned long) 0)),
  798. double>::value), "");
  799. static_assert((std::is_same<decltype(cbrt((long long) 0)), double>::value),
  800. "");
  801. static_assert((std::is_same<decltype(cbrt((unsigned long long) 0)),
  802. double>::value), "");
  803. static_assert((std::is_same<decltype(cbrt((double) 0)), double>::value),
  804. "");
  805. static_assert((std::is_same<decltype(cbrt((long double) 0)),
  806. long double>::value), "");
  807. static_assert((std::is_same<decltype(cbrtf(0)), float>::value), "");
  808. static_assert((std::is_same<decltype(cbrtl(0)), long double>::value), "");
  809. static_assert((std::is_same<decltype(cbrt(Ambiguous())), Ambiguous>::value),
  810. "");
  811. assert(truncate_fp(cbrt(1)) == 1);
  812. }
  813. void test_copysign()
  814. {
  815. static_assert((std::is_same<decltype(copysign((float)0, (float)0)), float>::value), "");
  816. static_assert((std::is_same<decltype(copysign((bool)0, (float)0)), double>::value), "");
  817. static_assert((std::is_same<decltype(copysign((unsigned short)0, (double)0)), double>::value), "");
  818. static_assert((std::is_same<decltype(copysign((int)0, (long double)0)), long double>::value), "");
  819. static_assert((std::is_same<decltype(copysign((float)0, (unsigned int)0)), double>::value), "");
  820. static_assert((std::is_same<decltype(copysign((double)0, (long)0)), double>::value), "");
  821. static_assert((std::is_same<decltype(copysign((long double)0, (unsigned long)0)), long double>::value), "");
  822. static_assert((std::is_same<decltype(copysign((int)0, (long long)0)), double>::value), "");
  823. static_assert((std::is_same<decltype(copysign((int)0, (unsigned long long)0)), double>::value), "");
  824. static_assert((std::is_same<decltype(copysign((double)0, (double)0)), double>::value), "");
  825. static_assert((std::is_same<decltype(copysign((long double)0, (long double)0)), long double>::value), "");
  826. static_assert((std::is_same<decltype(copysign((float)0, (double)0)), double>::value), "");
  827. static_assert((std::is_same<decltype(copysign((float)0, (long double)0)), long double>::value), "");
  828. static_assert((std::is_same<decltype(copysign((double)0, (long double)0)), long double>::value), "");
  829. static_assert((std::is_same<decltype(copysignf(0,0)), float>::value), "");
  830. static_assert((std::is_same<decltype(copysignl(0,0)), long double>::value), "");
  831. static_assert((std::is_same<decltype(copysign((int)0, (int)0)), double>::value), "");
  832. static_assert((std::is_same<decltype(copysign(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  833. assert(copysign(1,1) == 1);
  834. }
  835. void test_erf()
  836. {
  837. static_assert((std::is_same<decltype(erf((float)0)), float>::value), "");
  838. static_assert((std::is_same<decltype(erf((bool)0)), double>::value), "");
  839. static_assert((std::is_same<decltype(erf((unsigned short)0)), double>::value), "");
  840. static_assert((std::is_same<decltype(erf((int)0)), double>::value), "");
  841. static_assert((std::is_same<decltype(erf((unsigned int)0)), double>::value), "");
  842. static_assert((std::is_same<decltype(erf((long)0)), double>::value), "");
  843. static_assert((std::is_same<decltype(erf((unsigned long)0)), double>::value), "");
  844. static_assert((std::is_same<decltype(erf((long long)0)), double>::value), "");
  845. static_assert((std::is_same<decltype(erf((unsigned long long)0)), double>::value), "");
  846. static_assert((std::is_same<decltype(erf((double)0)), double>::value), "");
  847. static_assert((std::is_same<decltype(erf((long double)0)), long double>::value), "");
  848. static_assert((std::is_same<decltype(erff(0)), float>::value), "");
  849. static_assert((std::is_same<decltype(erfl(0)), long double>::value), "");
  850. static_assert((std::is_same<decltype(erf(Ambiguous())), Ambiguous>::value), "");
  851. assert(erf(0) == 0);
  852. }
  853. void test_erfc()
  854. {
  855. static_assert((std::is_same<decltype(erfc((float)0)), float>::value), "");
  856. static_assert((std::is_same<decltype(erfc((bool)0)), double>::value), "");
  857. static_assert((std::is_same<decltype(erfc((unsigned short)0)), double>::value), "");
  858. static_assert((std::is_same<decltype(erfc((int)0)), double>::value), "");
  859. static_assert((std::is_same<decltype(erfc((unsigned int)0)), double>::value), "");
  860. static_assert((std::is_same<decltype(erfc((long)0)), double>::value), "");
  861. static_assert((std::is_same<decltype(erfc((unsigned long)0)), double>::value), "");
  862. static_assert((std::is_same<decltype(erfc((long long)0)), double>::value), "");
  863. static_assert((std::is_same<decltype(erfc((unsigned long long)0)), double>::value), "");
  864. static_assert((std::is_same<decltype(erfc((double)0)), double>::value), "");
  865. static_assert((std::is_same<decltype(erfc((long double)0)), long double>::value), "");
  866. static_assert((std::is_same<decltype(erfcf(0)), float>::value), "");
  867. static_assert((std::is_same<decltype(erfcl(0)), long double>::value), "");
  868. static_assert((std::is_same<decltype(erfc(Ambiguous())), Ambiguous>::value), "");
  869. assert(erfc(0) == 1);
  870. }
  871. void test_exp2()
  872. {
  873. static_assert((std::is_same<decltype(exp2((float)0)), float>::value), "");
  874. static_assert((std::is_same<decltype(exp2((bool)0)), double>::value), "");
  875. static_assert((std::is_same<decltype(exp2((unsigned short)0)), double>::value), "");
  876. static_assert((std::is_same<decltype(exp2((int)0)), double>::value), "");
  877. static_assert((std::is_same<decltype(exp2((unsigned int)0)), double>::value), "");
  878. static_assert((std::is_same<decltype(exp2((long)0)), double>::value), "");
  879. static_assert((std::is_same<decltype(exp2((unsigned long)0)), double>::value), "");
  880. static_assert((std::is_same<decltype(exp2((long long)0)), double>::value), "");
  881. static_assert((std::is_same<decltype(exp2((unsigned long long)0)), double>::value), "");
  882. static_assert((std::is_same<decltype(exp2((double)0)), double>::value), "");
  883. static_assert((std::is_same<decltype(exp2((long double)0)), long double>::value), "");
  884. static_assert((std::is_same<decltype(exp2f(0)), float>::value), "");
  885. static_assert((std::is_same<decltype(exp2l(0)), long double>::value), "");
  886. static_assert((std::is_same<decltype(exp2(Ambiguous())), Ambiguous>::value), "");
  887. assert(exp2(1) == 2);
  888. }
  889. void test_expm1()
  890. {
  891. static_assert((std::is_same<decltype(expm1((float)0)), float>::value), "");
  892. static_assert((std::is_same<decltype(expm1((bool)0)), double>::value), "");
  893. static_assert((std::is_same<decltype(expm1((unsigned short)0)), double>::value), "");
  894. static_assert((std::is_same<decltype(expm1((int)0)), double>::value), "");
  895. static_assert((std::is_same<decltype(expm1((unsigned int)0)), double>::value), "");
  896. static_assert((std::is_same<decltype(expm1((long)0)), double>::value), "");
  897. static_assert((std::is_same<decltype(expm1((unsigned long)0)), double>::value), "");
  898. static_assert((std::is_same<decltype(expm1((long long)0)), double>::value), "");
  899. static_assert((std::is_same<decltype(expm1((unsigned long long)0)), double>::value), "");
  900. static_assert((std::is_same<decltype(expm1((double)0)), double>::value), "");
  901. static_assert((std::is_same<decltype(expm1((long double)0)), long double>::value), "");
  902. static_assert((std::is_same<decltype(expm1f(0)), float>::value), "");
  903. static_assert((std::is_same<decltype(expm1l(0)), long double>::value), "");
  904. static_assert((std::is_same<decltype(expm1(Ambiguous())), Ambiguous>::value), "");
  905. assert(expm1(0) == 0);
  906. }
  907. void test_fdim()
  908. {
  909. static_assert((std::is_same<decltype(fdim((float)0, (float)0)), float>::value), "");
  910. static_assert((std::is_same<decltype(fdim((bool)0, (float)0)), double>::value), "");
  911. static_assert((std::is_same<decltype(fdim((unsigned short)0, (double)0)), double>::value), "");
  912. static_assert((std::is_same<decltype(fdim((int)0, (long double)0)), long double>::value), "");
  913. static_assert((std::is_same<decltype(fdim((float)0, (unsigned int)0)), double>::value), "");
  914. static_assert((std::is_same<decltype(fdim((double)0, (long)0)), double>::value), "");
  915. static_assert((std::is_same<decltype(fdim((long double)0, (unsigned long)0)), long double>::value), "");
  916. static_assert((std::is_same<decltype(fdim((int)0, (long long)0)), double>::value), "");
  917. static_assert((std::is_same<decltype(fdim((int)0, (unsigned long long)0)), double>::value), "");
  918. static_assert((std::is_same<decltype(fdim((double)0, (double)0)), double>::value), "");
  919. static_assert((std::is_same<decltype(fdim((long double)0, (long double)0)), long double>::value), "");
  920. static_assert((std::is_same<decltype(fdim((float)0, (double)0)), double>::value), "");
  921. static_assert((std::is_same<decltype(fdim((float)0, (long double)0)), long double>::value), "");
  922. static_assert((std::is_same<decltype(fdim((double)0, (long double)0)), long double>::value), "");
  923. static_assert((std::is_same<decltype(fdimf(0,0)), float>::value), "");
  924. static_assert((std::is_same<decltype(fdiml(0,0)), long double>::value), "");
  925. static_assert((std::is_same<decltype(fdim((int)0, (int)0)), double>::value), "");
  926. static_assert((std::is_same<decltype(fdim(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  927. assert(fdim(1,0) == 1);
  928. }
  929. void test_fma()
  930. {
  931. static_assert((std::is_same<decltype(fma((bool)0, (float)0, (float)0)), double>::value), "");
  932. static_assert((std::is_same<decltype(fma((char)0, (float)0, (float)0)), double>::value), "");
  933. static_assert((std::is_same<decltype(fma((unsigned)0, (float)0, (float)0)), double>::value), "");
  934. static_assert((std::is_same<decltype(fma((float)0, (int)0, (float)0)), double>::value), "");
  935. static_assert((std::is_same<decltype(fma((float)0, (long)0, (float)0)), double>::value), "");
  936. static_assert((std::is_same<decltype(fma((float)0, (float)0, (unsigned long long)0)), double>::value), "");
  937. static_assert((std::is_same<decltype(fma((float)0, (float)0, (double)0)), double>::value), "");
  938. static_assert((std::is_same<decltype(fma((float)0, (float)0, (long double)0)), long double>::value), "");
  939. static_assert((std::is_same<decltype(fma((float)0, (float)0, (float)0)), float>::value), "");
  940. static_assert((std::is_same<decltype(fma((bool)0, (double)0, (double)0)), double>::value), "");
  941. static_assert((std::is_same<decltype(fma((char)0, (double)0, (double)0)), double>::value), "");
  942. static_assert((std::is_same<decltype(fma((unsigned)0, (double)0, (double)0)), double>::value), "");
  943. static_assert((std::is_same<decltype(fma((double)0, (int)0, (double)0)), double>::value), "");
  944. static_assert((std::is_same<decltype(fma((double)0, (long)0, (double)0)), double>::value), "");
  945. static_assert((std::is_same<decltype(fma((double)0, (double)0, (unsigned long long)0)), double>::value), "");
  946. static_assert((std::is_same<decltype(fma((double)0, (double)0, (float)0)), double>::value), "");
  947. static_assert((std::is_same<decltype(fma((double)0, (double)0, (long double)0)), long double>::value), "");
  948. static_assert((std::is_same<decltype(fma((double)0, (double)0, (double)0)), double>::value), "");
  949. static_assert((std::is_same<decltype(fma((bool)0, (long double)0, (long double)0)), long double>::value), "");
  950. static_assert((std::is_same<decltype(fma((char)0, (long double)0, (long double)0)), long double>::value), "");
  951. static_assert((std::is_same<decltype(fma((unsigned)0, (long double)0, (long double)0)), long double>::value), "");
  952. static_assert((std::is_same<decltype(fma((long double)0, (int)0, (long double)0)), long double>::value), "");
  953. static_assert((std::is_same<decltype(fma((long double)0, (long)0, (long double)0)), long double>::value), "");
  954. static_assert((std::is_same<decltype(fma((long double)0, (long double)0, (unsigned long long)0)), long double>::value), "");
  955. static_assert((std::is_same<decltype(fma((long double)0, (long double)0, (float)0)), long double>::value), "");
  956. static_assert((std::is_same<decltype(fma((double)0, (long double)0, (long double)0)), long double>::value), "");
  957. static_assert((std::is_same<decltype(fma((long double)0, (long double)0, (long double)0)), long double>::value), "");
  958. static_assert((std::is_same<decltype(fmaf(0,0,0)), float>::value), "");
  959. static_assert((std::is_same<decltype(fmal(0,0,0)), long double>::value), "");
  960. static_assert((std::is_same<decltype(fma(Ambiguous(), Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  961. assert(fma(1,1,1) == 2);
  962. }
  963. void test_fmax()
  964. {
  965. static_assert((std::is_same<decltype(fmax((float)0, (float)0)), float>::value), "");
  966. static_assert((std::is_same<decltype(fmax((bool)0, (float)0)), double>::value), "");
  967. static_assert((std::is_same<decltype(fmax((unsigned short)0, (double)0)), double>::value), "");
  968. static_assert((std::is_same<decltype(fmax((int)0, (long double)0)), long double>::value), "");
  969. static_assert((std::is_same<decltype(fmax((float)0, (unsigned int)0)), double>::value), "");
  970. static_assert((std::is_same<decltype(fmax((double)0, (long)0)), double>::value), "");
  971. static_assert((std::is_same<decltype(fmax((long double)0, (unsigned long)0)), long double>::value), "");
  972. static_assert((std::is_same<decltype(fmax((int)0, (long long)0)), double>::value), "");
  973. static_assert((std::is_same<decltype(fmax((int)0, (unsigned long long)0)), double>::value), "");
  974. static_assert((std::is_same<decltype(fmax((double)0, (double)0)), double>::value), "");
  975. static_assert((std::is_same<decltype(fmax((long double)0, (long double)0)), long double>::value), "");
  976. static_assert((std::is_same<decltype(fmax((float)0, (double)0)), double>::value), "");
  977. static_assert((std::is_same<decltype(fmax((float)0, (long double)0)), long double>::value), "");
  978. static_assert((std::is_same<decltype(fmax((double)0, (long double)0)), long double>::value), "");
  979. static_assert((std::is_same<decltype(fmaxf(0,0)), float>::value), "");
  980. static_assert((std::is_same<decltype(fmaxl(0,0)), long double>::value), "");
  981. static_assert((std::is_same<decltype(fmax((int)0, (int)0)), double>::value), "");
  982. static_assert((std::is_same<decltype(fmax(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  983. assert(fmax(1,0) == 1);
  984. }
  985. void test_fmin()
  986. {
  987. static_assert((std::is_same<decltype(fmin((float)0, (float)0)), float>::value), "");
  988. static_assert((std::is_same<decltype(fmin((bool)0, (float)0)), double>::value), "");
  989. static_assert((std::is_same<decltype(fmin((unsigned short)0, (double)0)), double>::value), "");
  990. static_assert((std::is_same<decltype(fmin((int)0, (long double)0)), long double>::value), "");
  991. static_assert((std::is_same<decltype(fmin((float)0, (unsigned int)0)), double>::value), "");
  992. static_assert((std::is_same<decltype(fmin((double)0, (long)0)), double>::value), "");
  993. static_assert((std::is_same<decltype(fmin((long double)0, (unsigned long)0)), long double>::value), "");
  994. static_assert((std::is_same<decltype(fmin((int)0, (long long)0)), double>::value), "");
  995. static_assert((std::is_same<decltype(fmin((int)0, (unsigned long long)0)), double>::value), "");
  996. static_assert((std::is_same<decltype(fmin((double)0, (double)0)), double>::value), "");
  997. static_assert((std::is_same<decltype(fmin((long double)0, (long double)0)), long double>::value), "");
  998. static_assert((std::is_same<decltype(fmin((float)0, (double)0)), double>::value), "");
  999. static_assert((std::is_same<decltype(fmin((float)0, (long double)0)), long double>::value), "");
  1000. static_assert((std::is_same<decltype(fmin((double)0, (long double)0)), long double>::value), "");
  1001. static_assert((std::is_same<decltype(fminf(0,0)), float>::value), "");
  1002. static_assert((std::is_same<decltype(fminl(0,0)), long double>::value), "");
  1003. static_assert((std::is_same<decltype(fmin((int)0, (int)0)), double>::value), "");
  1004. static_assert((std::is_same<decltype(fmin(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  1005. assert(fmin(1,0) == 0);
  1006. }
  1007. void test_hypot()
  1008. {
  1009. static_assert((std::is_same<decltype(hypot((float)0, (float)0)), float>::value), "");
  1010. static_assert((std::is_same<decltype(hypot((bool)0, (float)0)), double>::value), "");
  1011. static_assert((std::is_same<decltype(hypot((unsigned short)0, (double)0)), double>::value), "");
  1012. static_assert((std::is_same<decltype(hypot((int)0, (long double)0)), long double>::value), "");
  1013. static_assert((std::is_same<decltype(hypot((float)0, (unsigned int)0)), double>::value), "");
  1014. static_assert((std::is_same<decltype(hypot((double)0, (long)0)), double>::value), "");
  1015. static_assert((std::is_same<decltype(hypot((long double)0, (unsigned long)0)), long double>::value), "");
  1016. static_assert((std::is_same<decltype(hypot((int)0, (long long)0)), double>::value), "");
  1017. static_assert((std::is_same<decltype(hypot((int)0, (unsigned long long)0)), double>::value), "");
  1018. static_assert((std::is_same<decltype(hypot((double)0, (double)0)), double>::value), "");
  1019. static_assert((std::is_same<decltype(hypot((long double)0, (long double)0)), long double>::value), "");
  1020. static_assert((std::is_same<decltype(hypot((float)0, (double)0)), double>::value), "");
  1021. static_assert((std::is_same<decltype(hypot((float)0, (long double)0)), long double>::value), "");
  1022. static_assert((std::is_same<decltype(hypot((double)0, (long double)0)), long double>::value), "");
  1023. static_assert((std::is_same<decltype(hypotf(0,0)), float>::value), "");
  1024. static_assert((std::is_same<decltype(hypotl(0,0)), long double>::value), "");
  1025. static_assert((std::is_same<decltype(hypot((int)0, (int)0)), double>::value), "");
  1026. static_assert((std::is_same<decltype(hypot(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  1027. assert(hypot(3,4) == 5);
  1028. }
  1029. void test_ilogb()
  1030. {
  1031. static_assert((std::is_same<decltype(ilogb((float)0)), int>::value), "");
  1032. static_assert((std::is_same<decltype(ilogb((bool)0)), int>::value), "");
  1033. static_assert((std::is_same<decltype(ilogb((unsigned short)0)), int>::value), "");
  1034. static_assert((std::is_same<decltype(ilogb((int)0)), int>::value), "");
  1035. static_assert((std::is_same<decltype(ilogb((unsigned int)0)), int>::value), "");
  1036. static_assert((std::is_same<decltype(ilogb((long)0)), int>::value), "");
  1037. static_assert((std::is_same<decltype(ilogb((unsigned long)0)), int>::value), "");
  1038. static_assert((std::is_same<decltype(ilogb((long long)0)), int>::value), "");
  1039. static_assert((std::is_same<decltype(ilogb((unsigned long long)0)), int>::value), "");
  1040. static_assert((std::is_same<decltype(ilogb((double)0)), int>::value), "");
  1041. static_assert((std::is_same<decltype(ilogb((long double)0)), int>::value), "");
  1042. static_assert((std::is_same<decltype(ilogbf(0)), int>::value), "");
  1043. static_assert((std::is_same<decltype(ilogbl(0)), int>::value), "");
  1044. static_assert((std::is_same<decltype(ilogb(Ambiguous())), Ambiguous>::value), "");
  1045. assert(ilogb(1) == 0);
  1046. }
  1047. void test_lgamma()
  1048. {
  1049. static_assert((std::is_same<decltype(lgamma((float)0)), float>::value), "");
  1050. static_assert((std::is_same<decltype(lgamma((bool)0)), double>::value), "");
  1051. static_assert((std::is_same<decltype(lgamma((unsigned short)0)), double>::value), "");
  1052. static_assert((std::is_same<decltype(lgamma((int)0)), double>::value), "");
  1053. static_assert((std::is_same<decltype(lgamma((unsigned int)0)), double>::value), "");
  1054. static_assert((std::is_same<decltype(lgamma((long)0)), double>::value), "");
  1055. static_assert((std::is_same<decltype(lgamma((unsigned long)0)), double>::value), "");
  1056. static_assert((std::is_same<decltype(lgamma((long long)0)), double>::value), "");
  1057. static_assert((std::is_same<decltype(lgamma((unsigned long long)0)), double>::value), "");
  1058. static_assert((std::is_same<decltype(lgamma((double)0)), double>::value), "");
  1059. static_assert((std::is_same<decltype(lgamma((long double)0)), long double>::value), "");
  1060. static_assert((std::is_same<decltype(lgammaf(0)), float>::value), "");
  1061. static_assert((std::is_same<decltype(lgammal(0)), long double>::value), "");
  1062. static_assert((std::is_same<decltype(lgamma(Ambiguous())), Ambiguous>::value), "");
  1063. assert(lgamma(1) == 0);
  1064. }
  1065. void test_llrint()
  1066. {
  1067. static_assert((std::is_same<decltype(llrint((float)0)), long long>::value), "");
  1068. static_assert((std::is_same<decltype(llrint((bool)0)), long long>::value), "");
  1069. static_assert((std::is_same<decltype(llrint((unsigned short)0)), long long>::value), "");
  1070. static_assert((std::is_same<decltype(llrint((int)0)), long long>::value), "");
  1071. static_assert((std::is_same<decltype(llrint((unsigned int)0)), long long>::value), "");
  1072. static_assert((std::is_same<decltype(llrint((long)0)), long long>::value), "");
  1073. static_assert((std::is_same<decltype(llrint((unsigned long)0)), long long>::value), "");
  1074. static_assert((std::is_same<decltype(llrint((long long)0)), long long>::value), "");
  1075. static_assert((std::is_same<decltype(llrint((unsigned long long)0)), long long>::value), "");
  1076. static_assert((std::is_same<decltype(llrint((double)0)), long long>::value), "");
  1077. static_assert((std::is_same<decltype(llrint((long double)0)), long long>::value), "");
  1078. static_assert((std::is_same<decltype(llrintf(0)), long long>::value), "");
  1079. static_assert((std::is_same<decltype(llrintl(0)), long long>::value), "");
  1080. static_assert((std::is_same<decltype(llrint(Ambiguous())), Ambiguous>::value), "");
  1081. assert(llrint(1) == 1LL);
  1082. }
  1083. void test_llround()
  1084. {
  1085. static_assert((std::is_same<decltype(llround((float)0)), long long>::value), "");
  1086. static_assert((std::is_same<decltype(llround((bool)0)), long long>::value), "");
  1087. static_assert((std::is_same<decltype(llround((unsigned short)0)), long long>::value), "");
  1088. static_assert((std::is_same<decltype(llround((int)0)), long long>::value), "");
  1089. static_assert((std::is_same<decltype(llround((unsigned int)0)), long long>::value), "");
  1090. static_assert((std::is_same<decltype(llround((long)0)), long long>::value), "");
  1091. static_assert((std::is_same<decltype(llround((unsigned long)0)), long long>::value), "");
  1092. static_assert((std::is_same<decltype(llround((long long)0)), long long>::value), "");
  1093. static_assert((std::is_same<decltype(llround((unsigned long long)0)), long long>::value), "");
  1094. static_assert((std::is_same<decltype(llround((double)0)), long long>::value), "");
  1095. static_assert((std::is_same<decltype(llround((long double)0)), long long>::value), "");
  1096. static_assert((std::is_same<decltype(llroundf(0)), long long>::value), "");
  1097. static_assert((std::is_same<decltype(llroundl(0)), long long>::value), "");
  1098. static_assert((std::is_same<decltype(llround(Ambiguous())), Ambiguous>::value), "");
  1099. assert(llround(1) == 1LL);
  1100. }
  1101. void test_log1p()
  1102. {
  1103. static_assert((std::is_same<decltype(log1p((float)0)), float>::value), "");
  1104. static_assert((std::is_same<decltype(log1p((bool)0)), double>::value), "");
  1105. static_assert((std::is_same<decltype(log1p((unsigned short)0)), double>::value), "");
  1106. static_assert((std::is_same<decltype(log1p((int)0)), double>::value), "");
  1107. static_assert((std::is_same<decltype(log1p((unsigned int)0)), double>::value), "");
  1108. static_assert((std::is_same<decltype(log1p((long)0)), double>::value), "");
  1109. static_assert((std::is_same<decltype(log1p((unsigned long)0)), double>::value), "");
  1110. static_assert((std::is_same<decltype(log1p((long long)0)), double>::value), "");
  1111. static_assert((std::is_same<decltype(log1p((unsigned long long)0)), double>::value), "");
  1112. static_assert((std::is_same<decltype(log1p((double)0)), double>::value), "");
  1113. static_assert((std::is_same<decltype(log1p((long double)0)), long double>::value), "");
  1114. static_assert((std::is_same<decltype(log1pf(0)), float>::value), "");
  1115. static_assert((std::is_same<decltype(log1pl(0)), long double>::value), "");
  1116. static_assert((std::is_same<decltype(log1p(Ambiguous())), Ambiguous>::value), "");
  1117. assert(log1p(0) == 0);
  1118. }
  1119. void test_log2()
  1120. {
  1121. static_assert((std::is_same<decltype(log2((float)0)), float>::value), "");
  1122. static_assert((std::is_same<decltype(log2((bool)0)), double>::value), "");
  1123. static_assert((std::is_same<decltype(log2((unsigned short)0)), double>::value), "");
  1124. static_assert((std::is_same<decltype(log2((int)0)), double>::value), "");
  1125. static_assert((std::is_same<decltype(log2((unsigned int)0)), double>::value), "");
  1126. static_assert((std::is_same<decltype(log2((long)0)), double>::value), "");
  1127. static_assert((std::is_same<decltype(log2((unsigned long)0)), double>::value), "");
  1128. static_assert((std::is_same<decltype(log2((long long)0)), double>::value), "");
  1129. static_assert((std::is_same<decltype(log2((unsigned long long)0)), double>::value), "");
  1130. static_assert((std::is_same<decltype(log2((double)0)), double>::value), "");
  1131. static_assert((std::is_same<decltype(log2((long double)0)), long double>::value), "");
  1132. static_assert((std::is_same<decltype(log2f(0)), float>::value), "");
  1133. static_assert((std::is_same<decltype(log2l(0)), long double>::value), "");
  1134. static_assert((std::is_same<decltype(log2(Ambiguous())), Ambiguous>::value), "");
  1135. assert(log2(1) == 0);
  1136. }
  1137. void test_logb()
  1138. {
  1139. static_assert((std::is_same<decltype(logb((float)0)), float>::value), "");
  1140. static_assert((std::is_same<decltype(logb((bool)0)), double>::value), "");
  1141. static_assert((std::is_same<decltype(logb((unsigned short)0)), double>::value), "");
  1142. static_assert((std::is_same<decltype(logb((int)0)), double>::value), "");
  1143. static_assert((std::is_same<decltype(logb((unsigned int)0)), double>::value), "");
  1144. static_assert((std::is_same<decltype(logb((long)0)), double>::value), "");
  1145. static_assert((std::is_same<decltype(logb((unsigned long)0)), double>::value), "");
  1146. static_assert((std::is_same<decltype(logb((long long)0)), double>::value), "");
  1147. static_assert((std::is_same<decltype(logb((unsigned long long)0)), double>::value), "");
  1148. static_assert((std::is_same<decltype(logb((double)0)), double>::value), "");
  1149. static_assert((std::is_same<decltype(logb((long double)0)), long double>::value), "");
  1150. static_assert((std::is_same<decltype(logbf(0)), float>::value), "");
  1151. static_assert((std::is_same<decltype(logbl(0)), long double>::value), "");
  1152. static_assert((std::is_same<decltype(logb(Ambiguous())), Ambiguous>::value), "");
  1153. assert(logb(1) == 0);
  1154. }
  1155. void test_lrint()
  1156. {
  1157. static_assert((std::is_same<decltype(lrint((float)0)), long>::value), "");
  1158. static_assert((std::is_same<decltype(lrint((bool)0)), long>::value), "");
  1159. static_assert((std::is_same<decltype(lrint((unsigned short)0)), long>::value), "");
  1160. static_assert((std::is_same<decltype(lrint((int)0)), long>::value), "");
  1161. static_assert((std::is_same<decltype(lrint((unsigned int)0)), long>::value), "");
  1162. static_assert((std::is_same<decltype(lrint((long)0)), long>::value), "");
  1163. static_assert((std::is_same<decltype(lrint((unsigned long)0)), long>::value), "");
  1164. static_assert((std::is_same<decltype(lrint((long long)0)), long>::value), "");
  1165. static_assert((std::is_same<decltype(lrint((unsigned long long)0)), long>::value), "");
  1166. static_assert((std::is_same<decltype(lrint((double)0)), long>::value), "");
  1167. static_assert((std::is_same<decltype(lrint((long double)0)), long>::value), "");
  1168. static_assert((std::is_same<decltype(lrintf(0)), long>::value), "");
  1169. static_assert((std::is_same<decltype(lrintl(0)), long>::value), "");
  1170. static_assert((std::is_same<decltype(lrint(Ambiguous())), Ambiguous>::value), "");
  1171. assert(lrint(1) == 1L);
  1172. }
  1173. void test_lround()
  1174. {
  1175. static_assert((std::is_same<decltype(lround((float)0)), long>::value), "");
  1176. static_assert((std::is_same<decltype(lround((bool)0)), long>::value), "");
  1177. static_assert((std::is_same<decltype(lround((unsigned short)0)), long>::value), "");
  1178. static_assert((std::is_same<decltype(lround((int)0)), long>::value), "");
  1179. static_assert((std::is_same<decltype(lround((unsigned int)0)), long>::value), "");
  1180. static_assert((std::is_same<decltype(lround((long)0)), long>::value), "");
  1181. static_assert((std::is_same<decltype(lround((unsigned long)0)), long>::value), "");
  1182. static_assert((std::is_same<decltype(lround((long long)0)), long>::value), "");
  1183. static_assert((std::is_same<decltype(lround((unsigned long long)0)), long>::value), "");
  1184. static_assert((std::is_same<decltype(lround((double)0)), long>::value), "");
  1185. static_assert((std::is_same<decltype(lround((long double)0)), long>::value), "");
  1186. static_assert((std::is_same<decltype(lroundf(0)), long>::value), "");
  1187. static_assert((std::is_same<decltype(lroundl(0)), long>::value), "");
  1188. static_assert((std::is_same<decltype(lround(Ambiguous())), Ambiguous>::value), "");
  1189. assert(lround(1) == 1L);
  1190. }
  1191. void test_nan()
  1192. {
  1193. static_assert((std::is_same<decltype(nan("")), double>::value), "");
  1194. static_assert((std::is_same<decltype(nanf("")), float>::value), "");
  1195. static_assert((std::is_same<decltype(nanl("")), long double>::value), "");
  1196. }
  1197. void test_nearbyint()
  1198. {
  1199. static_assert((std::is_same<decltype(nearbyint((float)0)), float>::value), "");
  1200. static_assert((std::is_same<decltype(nearbyint((bool)0)), double>::value), "");
  1201. static_assert((std::is_same<decltype(nearbyint((unsigned short)0)), double>::value), "");
  1202. static_assert((std::is_same<decltype(nearbyint((int)0)), double>::value), "");
  1203. static_assert((std::is_same<decltype(nearbyint((unsigned int)0)), double>::value), "");
  1204. static_assert((std::is_same<decltype(nearbyint((long)0)), double>::value), "");
  1205. static_assert((std::is_same<decltype(nearbyint((unsigned long)0)), double>::value), "");
  1206. static_assert((std::is_same<decltype(nearbyint((long long)0)), double>::value), "");
  1207. static_assert((std::is_same<decltype(nearbyint((unsigned long long)0)), double>::value), "");
  1208. static_assert((std::is_same<decltype(nearbyint((double)0)), double>::value), "");
  1209. static_assert((std::is_same<decltype(nearbyint((long double)0)), long double>::value), "");
  1210. static_assert((std::is_same<decltype(nearbyintf(0)), float>::value), "");
  1211. static_assert((std::is_same<decltype(nearbyintl(0)), long double>::value), "");
  1212. static_assert((std::is_same<decltype(nearbyint(Ambiguous())), Ambiguous>::value), "");
  1213. assert(nearbyint(1) == 1);
  1214. }
  1215. void test_nextafter()
  1216. {
  1217. static_assert((std::is_same<decltype(nextafter((float)0, (float)0)), float>::value), "");
  1218. static_assert((std::is_same<decltype(nextafter((bool)0, (float)0)), double>::value), "");
  1219. static_assert((std::is_same<decltype(nextafter((unsigned short)0, (double)0)), double>::value), "");
  1220. static_assert((std::is_same<decltype(nextafter((int)0, (long double)0)), long double>::value), "");
  1221. static_assert((std::is_same<decltype(nextafter((float)0, (unsigned int)0)), double>::value), "");
  1222. static_assert((std::is_same<decltype(nextafter((double)0, (long)0)), double>::value), "");
  1223. static_assert((std::is_same<decltype(nextafter((long double)0, (unsigned long)0)), long double>::value), "");
  1224. static_assert((std::is_same<decltype(nextafter((int)0, (long long)0)), double>::value), "");
  1225. static_assert((std::is_same<decltype(nextafter((int)0, (unsigned long long)0)), double>::value), "");
  1226. static_assert((std::is_same<decltype(nextafter((double)0, (double)0)), double>::value), "");
  1227. static_assert((std::is_same<decltype(nextafter((long double)0, (long double)0)), long double>::value), "");
  1228. static_assert((std::is_same<decltype(nextafter((float)0, (double)0)), double>::value), "");
  1229. static_assert((std::is_same<decltype(nextafter((float)0, (long double)0)), long double>::value), "");
  1230. static_assert((std::is_same<decltype(nextafter((double)0, (long double)0)), long double>::value), "");
  1231. static_assert((std::is_same<decltype(nextafterf(0,0)), float>::value), "");
  1232. static_assert((std::is_same<decltype(nextafterl(0,0)), long double>::value), "");
  1233. static_assert((std::is_same<decltype(nextafter((int)0, (int)0)), double>::value), "");
  1234. static_assert((std::is_same<decltype(nextafter(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  1235. assert(nextafter(0,1) == hexfloat<double>(0x1, 0, -1074));
  1236. }
  1237. void test_nexttoward()
  1238. {
  1239. static_assert((std::is_same<decltype(nexttoward((float)0, (long double)0)), float>::value), "");
  1240. static_assert((std::is_same<decltype(nexttoward((bool)0, (long double)0)), double>::value), "");
  1241. static_assert((std::is_same<decltype(nexttoward((unsigned short)0, (long double)0)), double>::value), "");
  1242. static_assert((std::is_same<decltype(nexttoward((int)0, (long double)0)), double>::value), "");
  1243. static_assert((std::is_same<decltype(nexttoward((unsigned int)0, (long double)0)), double>::value), "");
  1244. static_assert((std::is_same<decltype(nexttoward((long)0, (long double)0)), double>::value), "");
  1245. static_assert((std::is_same<decltype(nexttoward((unsigned long)0, (long double)0)), double>::value), "");
  1246. static_assert((std::is_same<decltype(nexttoward((long long)0, (long double)0)), double>::value), "");
  1247. static_assert((std::is_same<decltype(nexttoward((unsigned long long)0, (long double)0)), double>::value), "");
  1248. static_assert((std::is_same<decltype(nexttoward((double)0, (long double)0)), double>::value), "");
  1249. static_assert((std::is_same<decltype(nexttoward((long double)0, (long double)0)), long double>::value), "");
  1250. static_assert((std::is_same<decltype(nexttowardf(0, (long double)0)), float>::value), "");
  1251. static_assert((std::is_same<decltype(nexttowardl(0, (long double)0)), long double>::value), "");
  1252. static_assert((std::is_same<decltype(nexttoward(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  1253. assert(nexttoward(0, 1) == hexfloat<double>(0x1, 0, -1074));
  1254. }
  1255. void test_remainder()
  1256. {
  1257. static_assert((std::is_same<decltype(remainder((float)0, (float)0)), float>::value), "");
  1258. static_assert((std::is_same<decltype(remainder((bool)0, (float)0)), double>::value), "");
  1259. static_assert((std::is_same<decltype(remainder((unsigned short)0, (double)0)), double>::value), "");
  1260. static_assert((std::is_same<decltype(remainder((int)0, (long double)0)), long double>::value), "");
  1261. static_assert((std::is_same<decltype(remainder((float)0, (unsigned int)0)), double>::value), "");
  1262. static_assert((std::is_same<decltype(remainder((double)0, (long)0)), double>::value), "");
  1263. static_assert((std::is_same<decltype(remainder((long double)0, (unsigned long)0)), long double>::value), "");
  1264. static_assert((std::is_same<decltype(remainder((int)0, (long long)0)), double>::value), "");
  1265. static_assert((std::is_same<decltype(remainder((int)0, (unsigned long long)0)), double>::value), "");
  1266. static_assert((std::is_same<decltype(remainder((double)0, (double)0)), double>::value), "");
  1267. static_assert((std::is_same<decltype(remainder((long double)0, (long double)0)), long double>::value), "");
  1268. static_assert((std::is_same<decltype(remainder((float)0, (double)0)), double>::value), "");
  1269. static_assert((std::is_same<decltype(remainder((float)0, (long double)0)), long double>::value), "");
  1270. static_assert((std::is_same<decltype(remainder((double)0, (long double)0)), long double>::value), "");
  1271. static_assert((std::is_same<decltype(remainderf(0,0)), float>::value), "");
  1272. static_assert((std::is_same<decltype(remainderl(0,0)), long double>::value), "");
  1273. static_assert((std::is_same<decltype(remainder((int)0, (int)0)), double>::value), "");
  1274. static_assert((std::is_same<decltype(remainder(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  1275. assert(remainder(0.5,1) == 0.5);
  1276. }
  1277. void test_remquo()
  1278. {
  1279. int ip;
  1280. static_assert((std::is_same<decltype(remquo((float)0, (float)0, &ip)), float>::value), "");
  1281. static_assert((std::is_same<decltype(remquo((bool)0, (float)0, &ip)), double>::value), "");
  1282. static_assert((std::is_same<decltype(remquo((unsigned short)0, (double)0, &ip)), double>::value), "");
  1283. static_assert((std::is_same<decltype(remquo((int)0, (long double)0, &ip)), long double>::value), "");
  1284. static_assert((std::is_same<decltype(remquo((float)0, (unsigned int)0, &ip)), double>::value), "");
  1285. static_assert((std::is_same<decltype(remquo((double)0, (long)0, &ip)), double>::value), "");
  1286. static_assert((std::is_same<decltype(remquo((long double)0, (unsigned long)0, &ip)), long double>::value), "");
  1287. static_assert((std::is_same<decltype(remquo((int)0, (long long)0, &ip)), double>::value), "");
  1288. static_assert((std::is_same<decltype(remquo((int)0, (unsigned long long)0, &ip)), double>::value), "");
  1289. static_assert((std::is_same<decltype(remquo((double)0, (double)0, &ip)), double>::value), "");
  1290. static_assert((std::is_same<decltype(remquo((long double)0, (long double)0, &ip)), long double>::value), "");
  1291. static_assert((std::is_same<decltype(remquo((float)0, (double)0, &ip)), double>::value), "");
  1292. static_assert((std::is_same<decltype(remquo((float)0, (long double)0, &ip)), long double>::value), "");
  1293. static_assert((std::is_same<decltype(remquo((double)0, (long double)0, &ip)), long double>::value), "");
  1294. static_assert((std::is_same<decltype(remquof(0,0, &ip)), float>::value), "");
  1295. static_assert((std::is_same<decltype(remquol(0,0, &ip)), long double>::value), "");
  1296. static_assert((std::is_same<decltype(remquo((int)0, (int)0, &ip)), double>::value), "");
  1297. static_assert((std::is_same<decltype(remquo(Ambiguous(), Ambiguous(), &ip)), Ambiguous>::value), "");
  1298. assert(remquo(0.5,1, &ip) == 0.5);
  1299. }
  1300. void test_rint()
  1301. {
  1302. static_assert((std::is_same<decltype(rint((float)0)), float>::value), "");
  1303. static_assert((std::is_same<decltype(rint((bool)0)), double>::value), "");
  1304. static_assert((std::is_same<decltype(rint((unsigned short)0)), double>::value), "");
  1305. static_assert((std::is_same<decltype(rint((int)0)), double>::value), "");
  1306. static_assert((std::is_same<decltype(rint((unsigned int)0)), double>::value), "");
  1307. static_assert((std::is_same<decltype(rint((long)0)), double>::value), "");
  1308. static_assert((std::is_same<decltype(rint((unsigned long)0)), double>::value), "");
  1309. static_assert((std::is_same<decltype(rint((long long)0)), double>::value), "");
  1310. static_assert((std::is_same<decltype(rint((unsigned long long)0)), double>::value), "");
  1311. static_assert((std::is_same<decltype(rint((double)0)), double>::value), "");
  1312. static_assert((std::is_same<decltype(rint((long double)0)), long double>::value), "");
  1313. static_assert((std::is_same<decltype(rintf(0)), float>::value), "");
  1314. static_assert((std::is_same<decltype(rintl(0)), long double>::value), "");
  1315. static_assert((std::is_same<decltype(rint(Ambiguous())), Ambiguous>::value), "");
  1316. assert(rint(1) == 1);
  1317. }
  1318. void test_round()
  1319. {
  1320. static_assert((std::is_same<decltype(round((float)0)), float>::value), "");
  1321. static_assert((std::is_same<decltype(round((bool)0)), double>::value), "");
  1322. static_assert((std::is_same<decltype(round((unsigned short)0)), double>::value), "");
  1323. static_assert((std::is_same<decltype(round((int)0)), double>::value), "");
  1324. static_assert((std::is_same<decltype(round((unsigned int)0)), double>::value), "");
  1325. static_assert((std::is_same<decltype(round((long)0)), double>::value), "");
  1326. static_assert((std::is_same<decltype(round((unsigned long)0)), double>::value), "");
  1327. static_assert((std::is_same<decltype(round((long long)0)), double>::value), "");
  1328. static_assert((std::is_same<decltype(round((unsigned long long)0)), double>::value), "");
  1329. static_assert((std::is_same<decltype(round((double)0)), double>::value), "");
  1330. static_assert((std::is_same<decltype(round((long double)0)), long double>::value), "");
  1331. static_assert((std::is_same<decltype(roundf(0)), float>::value), "");
  1332. static_assert((std::is_same<decltype(roundl(0)), long double>::value), "");
  1333. static_assert((std::is_same<decltype(round(Ambiguous())), Ambiguous>::value), "");
  1334. assert(round(1) == 1);
  1335. }
  1336. void test_scalbln()
  1337. {
  1338. static_assert((std::is_same<decltype(scalbln((float)0, (long)0)), float>::value), "");
  1339. static_assert((std::is_same<decltype(scalbln((bool)0, (long)0)), double>::value), "");
  1340. static_assert((std::is_same<decltype(scalbln((unsigned short)0, (long)0)), double>::value), "");
  1341. static_assert((std::is_same<decltype(scalbln((int)0, (long)0)), double>::value), "");
  1342. static_assert((std::is_same<decltype(scalbln((unsigned int)0, (long)0)), double>::value), "");
  1343. static_assert((std::is_same<decltype(scalbln((long)0, (long)0)), double>::value), "");
  1344. static_assert((std::is_same<decltype(scalbln((unsigned long)0, (long)0)), double>::value), "");
  1345. static_assert((std::is_same<decltype(scalbln((long long)0, (long)0)), double>::value), "");
  1346. static_assert((std::is_same<decltype(scalbln((unsigned long long)0, (long)0)), double>::value), "");
  1347. static_assert((std::is_same<decltype(scalbln((double)0, (long)0)), double>::value), "");
  1348. static_assert((std::is_same<decltype(scalbln((long double)0, (long)0)), long double>::value), "");
  1349. static_assert((std::is_same<decltype(scalblnf(0, (long)0)), float>::value), "");
  1350. static_assert((std::is_same<decltype(scalblnl(0, (long)0)), long double>::value), "");
  1351. static_assert((std::is_same<decltype(scalbln(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  1352. assert(scalbln(1, 1) == 2);
  1353. }
  1354. void test_scalbn()
  1355. {
  1356. static_assert((std::is_same<decltype(scalbn((float)0, (int)0)), float>::value), "");
  1357. static_assert((std::is_same<decltype(scalbn((bool)0, (int)0)), double>::value), "");
  1358. static_assert((std::is_same<decltype(scalbn((unsigned short)0, (int)0)), double>::value), "");
  1359. static_assert((std::is_same<decltype(scalbn((int)0, (int)0)), double>::value), "");
  1360. static_assert((std::is_same<decltype(scalbn((unsigned int)0, (int)0)), double>::value), "");
  1361. static_assert((std::is_same<decltype(scalbn((long)0, (int)0)), double>::value), "");
  1362. static_assert((std::is_same<decltype(scalbn((unsigned long)0, (int)0)), double>::value), "");
  1363. static_assert((std::is_same<decltype(scalbn((long long)0, (int)0)), double>::value), "");
  1364. static_assert((std::is_same<decltype(scalbn((unsigned long long)0, (int)0)), double>::value), "");
  1365. static_assert((std::is_same<decltype(scalbn((double)0, (int)0)), double>::value), "");
  1366. static_assert((std::is_same<decltype(scalbn((long double)0, (int)0)), long double>::value), "");
  1367. static_assert((std::is_same<decltype(scalbnf(0, (int)0)), float>::value), "");
  1368. static_assert((std::is_same<decltype(scalbnl(0, (int)0)), long double>::value), "");
  1369. static_assert((std::is_same<decltype(scalbn(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  1370. assert(scalbn(1, 1) == 2);
  1371. }
  1372. void test_tgamma()
  1373. {
  1374. static_assert((std::is_same<decltype(tgamma((float)0)), float>::value), "");
  1375. static_assert((std::is_same<decltype(tgamma((bool)0)), double>::value), "");
  1376. static_assert((std::is_same<decltype(tgamma((unsigned short)0)), double>::value), "");
  1377. static_assert((std::is_same<decltype(tgamma((int)0)), double>::value), "");
  1378. static_assert((std::is_same<decltype(tgamma((unsigned int)0)), double>::value), "");
  1379. static_assert((std::is_same<decltype(tgamma((long)0)), double>::value), "");
  1380. static_assert((std::is_same<decltype(tgamma((unsigned long)0)), double>::value), "");
  1381. static_assert((std::is_same<decltype(tgamma((long long)0)), double>::value), "");
  1382. static_assert((std::is_same<decltype(tgamma((unsigned long long)0)), double>::value), "");
  1383. static_assert((std::is_same<decltype(tgamma((double)0)), double>::value), "");
  1384. static_assert((std::is_same<decltype(tgamma((long double)0)), long double>::value), "");
  1385. static_assert((std::is_same<decltype(tgammaf(0)), float>::value), "");
  1386. static_assert((std::is_same<decltype(tgammal(0)), long double>::value), "");
  1387. static_assert((std::is_same<decltype(tgamma(Ambiguous())), Ambiguous>::value), "");
  1388. assert(tgamma(1) == 1);
  1389. }
  1390. void test_trunc()
  1391. {
  1392. static_assert((std::is_same<decltype(trunc((float)0)), float>::value), "");
  1393. static_assert((std::is_same<decltype(trunc((bool)0)), double>::value), "");
  1394. static_assert((std::is_same<decltype(trunc((unsigned short)0)), double>::value), "");
  1395. static_assert((std::is_same<decltype(trunc((int)0)), double>::value), "");
  1396. static_assert((std::is_same<decltype(trunc((unsigned int)0)), double>::value), "");
  1397. static_assert((std::is_same<decltype(trunc((long)0)), double>::value), "");
  1398. static_assert((std::is_same<decltype(trunc((unsigned long)0)), double>::value), "");
  1399. static_assert((std::is_same<decltype(trunc((long long)0)), double>::value), "");
  1400. static_assert((std::is_same<decltype(trunc((unsigned long long)0)), double>::value), "");
  1401. static_assert((std::is_same<decltype(trunc((double)0)), double>::value), "");
  1402. static_assert((std::is_same<decltype(trunc((long double)0)), long double>::value), "");
  1403. static_assert((std::is_same<decltype(truncf(0)), float>::value), "");
  1404. static_assert((std::is_same<decltype(truncl(0)), long double>::value), "");
  1405. static_assert((std::is_same<decltype(trunc(Ambiguous())), Ambiguous>::value), "");
  1406. assert(trunc(1) == 1);
  1407. }
  1408. int main(int, char**)
  1409. {
  1410. test_abs();
  1411. test_acos();
  1412. test_asin();
  1413. test_atan();
  1414. test_atan2();
  1415. test_ceil();
  1416. test_cos();
  1417. test_cosh();
  1418. test_exp();
  1419. test_fabs();
  1420. test_floor();
  1421. test_fmod();
  1422. test_frexp();
  1423. test_ldexp();
  1424. test_log();
  1425. test_log10();
  1426. test_modf();
  1427. test_pow();
  1428. test_sin();
  1429. test_sinh();
  1430. test_sqrt();
  1431. test_tan();
  1432. test_tanh();
  1433. test_signbit();
  1434. test_fpclassify();
  1435. test_isfinite();
  1436. test_isnormal();
  1437. test_isgreater();
  1438. test_isgreaterequal();
  1439. test_isinf();
  1440. test_isless();
  1441. test_islessequal();
  1442. test_islessgreater();
  1443. test_isnan();
  1444. test_isunordered();
  1445. test_acosh();
  1446. test_asinh();
  1447. test_atanh();
  1448. test_cbrt();
  1449. test_copysign();
  1450. test_erf();
  1451. test_erfc();
  1452. test_exp2();
  1453. test_expm1();
  1454. test_fdim();
  1455. test_fma();
  1456. test_fmax();
  1457. test_fmin();
  1458. test_hypot();
  1459. test_ilogb();
  1460. test_lgamma();
  1461. test_llrint();
  1462. test_llround();
  1463. test_log1p();
  1464. test_log2();
  1465. test_logb();
  1466. test_lrint();
  1467. test_lround();
  1468. test_nan();
  1469. test_nearbyint();
  1470. test_nextafter();
  1471. test_nexttoward();
  1472. test_remainder();
  1473. test_remquo();
  1474. test_rint();
  1475. test_round();
  1476. test_scalbln();
  1477. test_scalbn();
  1478. test_tgamma();
  1479. test_trunc();
  1480. return 0;
  1481. }