math_h.pass.cpp 93 KB

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