https://llvm.org/bugs/show_bug.cgi?id=18218

Richard Smith <[email protected]> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |REOPENED
                 CC|                            |[email protected]
         Resolution|INVALID                     |---

--- Comment #8 from Richard Smith <[email protected]> ---
(In reply to comment #7)
>       The only valid types that can be passed to isnan (and others in
> <cmath>) are arithmetic types; i.e, the built-in integral and floating point
> types. No user-defined types.

That may have been the intent, but I don't see any way to read the standard's
wording that way. From the example in comment#0:

      std::isnan(A());

There are no arguments of arithmetic type, so none of the bullets in 26.8/11
apply. The overload set contains 'isnan(float)', 'isnan(double)', and
'isnan(long double)', and 'isnan(float)' should be selected.


To my reading, what paragraph 11 requires is overload sets like this:

template<typename T, typename U>
typename conditional<is_arithmetic<U>::value, T, U>::type
cast_if_arithmetic(U u) { return u; }

template<typename T>
struct is_double_or_integral :
    integral_constant<bool, is_arithmetic<T>::value &&
                            !is_same<T, float>::value &&
                            !is_same<T, long double>::value> {};

bool isgreater(float, float);
bool isgreater(double, double);
bool isgreater(long double, long double);

// bullet 1
template<typename T, typename U>
typename enable_if<is_same<T, long double>::value ||
                   is_same<U, long double>::value, bool>::type
isgreater(T t, U u) {
  return isgreater(cast_if_arithmetic<long double>(t),
                   cast_if_arithmetic<long double>(u));
}
// bullet 2
template<typename T, typename U>
typename enable_if<is_double_or_integral<T>::value ||
                   is_double_or_integral<U>::value, bool>::type
isgreater(T t, U u) {
  return isgreater(cast_if_arithmetic<double>(t),
                   cast_if_arithmetic<double>(u));
}
// bullet 3 requires no overloads: bullets 1 and 2 would have applied
// if there were an arithmetic argument of a type other than float

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to