Skip to content

Commit 9893f6b

Browse files
authored
[HIP] Fix return type in __clang_hip_cmath.h (llvm#139697)
Before, some functions like `isgreater(float, double)` would return a `double` instead of a `bool`. Stumbled upon this bug while trying to adapt [`External/CUDA/cmath.cu`](https://github.com/llvm/llvm-test-suite/blob/main/External/CUDA/cmath.cu) to HIP. ``` /_llvm-test-suite/External/HIP/../CUDA/math_h.cu:617:20: error: static assertion failed due to requirement 'std::is_same<double, bool>::value': 617 | static_assert((std::is_same<decltype(isgreater((float)0, (double)0)), bool>::value), ""); ```
1 parent 49bced4 commit 9893f6b

File tree

2 files changed

+25
-24
lines changed

2 files changed

+25
-24
lines changed

clang/lib/Headers/__clang_hip_cmath.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -464,12 +464,13 @@ class __promote : public __promote_imp<_A1, _A2, _A3> {};
464464
#if __cplusplus >= 201103L
465465
#define __HIP_OVERLOAD2(__retty, __fn) \
466466
template <typename __T1, typename __T2> \
467-
__DEVICE__ __CONSTEXPR__ typename __hip_enable_if< \
468-
__hip::is_arithmetic<__T1>::value && __hip::is_arithmetic<__T2>::value, \
469-
typename __hip::__promote<__T1, __T2>::type>::type \
470-
__fn(__T1 __x, __T2 __y) { \
471-
typedef typename __hip::__promote<__T1, __T2>::type __result_type; \
472-
return __fn((__result_type)__x, (__result_type)__y); \
467+
__DEVICE__ __CONSTEXPR__ \
468+
typename __hip_enable_if<__hip::is_arithmetic<__T1>::value && \
469+
__hip::is_arithmetic<__T2>::value, \
470+
__retty>::type \
471+
__fn(__T1 __x, __T2 __y) { \
472+
typedef typename __hip::__promote<__T1, __T2>::type __arg_type; \
473+
return __fn((__arg_type)__x, (__arg_type)__y); \
473474
}
474475
#else
475476
#define __HIP_OVERLOAD2(__retty, __fn) \

clang/test/Headers/__clang_hip_cmath-return_types.hip

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -376,19 +376,19 @@ __device__ void test_isnormal()
376376
__device__ void test_isgreater()
377377
{
378378
static_assert(is_same<decltype(isgreater((float)0, (float)0)), bool>::value, "");
379-
static_assert(is_same<decltype(isgreater((float)0, (double)0)), double>::value, "");
380-
static_assert(is_same<decltype(isgreater((double)0, (float)0)), double>::value, "");
379+
static_assert(is_same<decltype(isgreater((float)0, (double)0)), bool>::value, "");
380+
static_assert(is_same<decltype(isgreater((double)0, (float)0)), bool>::value, "");
381381
static_assert(is_same<decltype(isgreater((double)0, (double)0)), bool>::value, "");
382-
static_assert(is_same<decltype(isgreater(0, (double)0)), double>::value, "");
382+
static_assert(is_same<decltype(isgreater(0, (double)0)), bool>::value, "");
383383
}
384384

385385
__device__ void test_isgreaterequal()
386386
{
387387
static_assert(is_same<decltype(isgreaterequal((float)0, (float)0)), bool>::value, "");
388-
static_assert(is_same<decltype(isgreaterequal((float)0, (double)0)), double>::value, "");
389-
static_assert(is_same<decltype(isgreaterequal((double)0, (float)0)), double>::value, "");
388+
static_assert(is_same<decltype(isgreaterequal((float)0, (double)0)), bool>::value, "");
389+
static_assert(is_same<decltype(isgreaterequal((double)0, (float)0)), bool>::value, "");
390390
static_assert(is_same<decltype(isgreaterequal((double)0, (double)0)), bool>::value, "");
391-
static_assert(is_same<decltype(isgreaterequal(0, (double)0)), double>::value, "");
391+
static_assert(is_same<decltype(isgreaterequal(0, (double)0)), bool>::value, "");
392392
}
393393

394394
__device__ void test_isinf()
@@ -400,28 +400,28 @@ __device__ void test_isinf()
400400
__device__ void test_isless()
401401
{
402402
static_assert(is_same<decltype(isless((float)0, (float)0)), bool>::value, "");
403-
static_assert(is_same<decltype(isless((float)0, (double)0)), double>::value, "");
404-
static_assert(is_same<decltype(isless((double)0, (float)0)), double>::value, "");
403+
static_assert(is_same<decltype(isless((float)0, (double)0)), bool>::value, "");
404+
static_assert(is_same<decltype(isless((double)0, (float)0)), bool>::value, "");
405405
static_assert(is_same<decltype(isless((double)0, (double)0)), bool>::value, "");
406-
static_assert(is_same<decltype(isless(0, (double)0)), double>::value, "");
406+
static_assert(is_same<decltype(isless(0, (double)0)), bool>::value, "");
407407
}
408408

409409
__device__ void test_islessequal()
410410
{
411411
static_assert(is_same<decltype(islessequal((float)0, (float)0)), bool>::value, "");
412-
static_assert(is_same<decltype(islessequal((float)0, (double)0)), double>::value, "");
413-
static_assert(is_same<decltype(islessequal((double)0, (float)0)), double>::value, "");
412+
static_assert(is_same<decltype(islessequal((float)0, (double)0)), bool>::value, "");
413+
static_assert(is_same<decltype(islessequal((double)0, (float)0)), bool>::value, "");
414414
static_assert(is_same<decltype(islessequal((double)0, (double)0)), bool>::value, "");
415-
static_assert(is_same<decltype(islessequal(0, (double)0)), double>::value, "");
415+
static_assert(is_same<decltype(islessequal(0, (double)0)), bool>::value, "");
416416
}
417417

418418
__device__ void test_islessgreater()
419419
{
420420
static_assert(is_same<decltype(islessgreater((float)0, (float)0)), bool>::value, "");
421-
static_assert(is_same<decltype(islessgreater((float)0, (double)0)), double>::value, "");
422-
static_assert(is_same<decltype(islessgreater((double)0, (float)0)), double>::value, "");
421+
static_assert(is_same<decltype(islessgreater((float)0, (double)0)), bool>::value, "");
422+
static_assert(is_same<decltype(islessgreater((double)0, (float)0)), bool>::value, "");
423423
static_assert(is_same<decltype(islessgreater((double)0, (double)0)), bool>::value, "");
424-
static_assert(is_same<decltype(islessgreater(0, (double)0)), double>::value, "");
424+
static_assert(is_same<decltype(islessgreater(0, (double)0)), bool>::value, "");
425425
}
426426

427427
__device__ void test_isnan()
@@ -433,10 +433,10 @@ __device__ void test_isnan()
433433
__device__ void test_isunordered()
434434
{
435435
static_assert(is_same<decltype(isunordered((float)0, (float)0)), bool>::value, "");
436-
static_assert(is_same<decltype(isunordered((float)0, (double)0)), double>::value, "");
437-
static_assert(is_same<decltype(isunordered((double)0, (float)0)), double>::value, "");
436+
static_assert(is_same<decltype(isunordered((float)0, (double)0)), bool>::value, "");
437+
static_assert(is_same<decltype(isunordered((double)0, (float)0)), bool>::value, "");
438438
static_assert(is_same<decltype(isunordered((double)0, (double)0)), bool>::value, "");
439-
static_assert(is_same<decltype(isunordered(0, (double)0)), double>::value, "");
439+
static_assert(is_same<decltype(isunordered(0, (double)0)), bool>::value, "");
440440
}
441441

442442
__device__ void test_acosh()

0 commit comments

Comments
 (0)