fix several compile issues with Visual Studio toolchains (#2219)

Fixes several compile issues I am seeing for my version of Visual Studio
related to an ambiguous call to `fpclassify`, which is called by `isnan`
and other similar functions, specifically for the `cl_half` type:

```
19>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt\corecrt_math.h(401,1): error C2668: 'fpclassify': ambiguous call to overloaded function
19>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt\corecrt_math.h(298,31): message : could be 'int fpclassify(long double) throw()'
19>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt\corecrt_math.h(293,31): message : or       'int fpclassify(double) throw()'
19>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt\corecrt_math.h(288,31): message : or       'int fpclassify(float) throw()'
19>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt\corecrt_math.h(401,1): message : while trying to match the argument list '(_Ty)'
```

Some of these issues seem like differences in compiler behavior, but at
least one appears to have identified a legitimate bug.

Specifically, this change:

* Removes the special-case checks for finite half numbers for commonfns,
since this is already handled by `UlpFn`. (test with: `test_commonfns
degrees radians`)
* Assigns to temporary variables to eliminate the ambiguous function
call for relationals. (test with: `test_relationals relational*`)
* Properly converts from half to float when checking for NaNs for
select. This is the one that seems like a legitimate bug. (test with:
`test_select select_half_ushort select_half_short`)
* Uses `std::enable_if` to disambiguate a function call for spirv_new.
(test with: `test_spirv_new decorate_saturated*`)

If it's helpful, my specific Visual Studio version is:

```
Microsoft Visual Studio Professional 2019
Version 16.11.20
VisualStudio.16.Release/16.11.20+32929.386
```

I also have the Windows Software Development Kit 10.0.19041.685
installed.
This commit is contained in:
Ben Ashbaugh
2025-02-18 09:09:17 -08:00
committed by GitHub
parent 9f63decb9c
commit 9b247c06be
5 changed files with 43 additions and 54 deletions

View File

@@ -182,27 +182,6 @@ template <typename T> inline half conv_to_half(const T &val)
return 0;
}
template <typename T> bool isfinite_fp(const T &v)
{
if (std::is_same<T, half>::value)
{
// Extract FP16 exponent and mantissa
uint16_t h_exp = (((half)v) >> (CL_HALF_MANT_DIG - 1)) & 0x1F;
uint16_t h_mant = ((half)v) & 0x3FF;
// !Inf test
return !(h_exp == 0x1F && h_mant == 0);
}
else
{
#if !defined(_WIN32)
return std::isfinite(v);
#else
return isfinite(v);
#endif
}
}
template <typename T> float UlpFn(const T &val, const double &r)
{
if (std::is_same<T, half>::value)

View File

@@ -65,10 +65,6 @@ int verify_degrees(const T *const inptr, const T *const outptr, int n)
{
r = (180.0 / M_PI) * conv_to_dbl(inptr[i]);
if (std::is_same<T, half>::value)
if (!isfinite_fp(conv_to_half(r)) && !isfinite_fp(outptr[i]))
continue;
error = UlpFn(outptr[i], r);
if (fabsf(error) > max_error)
@@ -115,10 +111,6 @@ int verify_radians(const T *const inptr, const T *const outptr, int n)
{
r = (M_PI / 180.0) * conv_to_dbl(inptr[i]);
if (std::is_same<T, half>::value)
if (!isfinite_fp(conv_to_half(r)) && !isfinite_fp(outptr[i]))
continue;
error = UlpFn(outptr[i], r);
if (fabsf(error) > max_error)