diff options
author | Antonio Sanchez <cantonios@google.com> | 2020-11-12 13:12:00 -0800 |
---|---|---|
committer | Antonio Sánchez <cantonios@google.com> | 2020-11-14 05:50:42 +0000 |
commit | bb69a8db5da21f3c6b289d010eaa64e757387dca (patch) | |
tree | 960d5e2b32d1bd0bbe016c897c6b3de941f2b7b3 /Eigen/src/Core/MathFunctions.h | |
parent | 90f6d9d23e49143a868a03fea552117c3fceec5a (diff) |
Explicit casts of S -> std::complex<T>
When calling `internal::cast<S, std::complex<T>>(x)`, clang often
generates an implicit conversion warning due to an implicit cast
from type `S` to `T`. This currently affects the following tests:
- `basicstuff`
- `bfloat16_float`
- `cxx11_tensor_casts`
The implicit cast leads to widening/narrowing float conversions.
Widening warnings only seem to be generated by clang (`-Wdouble-promotion`).
To eliminate the warning, we explicitly cast the real-component first
from `S` to `T`. We also adjust tests to use `internal::cast` instead
of `static_cast` when a complex type may be involved.
Diffstat (limited to 'Eigen/src/Core/MathFunctions.h')
-rw-r--r-- | Eigen/src/Core/MathFunctions.h | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/Eigen/src/Core/MathFunctions.h b/Eigen/src/Core/MathFunctions.h index 07f4b9493..e9da35995 100644 --- a/Eigen/src/Core/MathFunctions.h +++ b/Eigen/src/Core/MathFunctions.h @@ -376,7 +376,7 @@ struct hypot_retval * Implementation of cast * ****************************************************************************/ -template<typename OldType, typename NewType> +template<typename OldType, typename NewType, typename EnableIf = void> struct cast_impl { EIGEN_DEVICE_FUNC @@ -386,6 +386,22 @@ struct cast_impl } }; +// Casting from S -> Complex<T> leads to an implicit conversion from S to T, +// generating warnings on clang. Here we explicitly cast the real component. +template<typename OldType, typename NewType> +struct cast_impl<OldType, NewType, + typename internal::enable_if< + !NumTraits<OldType>::IsComplex && NumTraits<NewType>::IsComplex + >::type> +{ + EIGEN_DEVICE_FUNC + static inline NewType run(const OldType& x) + { + typedef typename NumTraits<NewType>::Real NewReal; + return static_cast<NewType>(static_cast<NewReal>(x)); + } +}; + // here, for once, we're plainly returning NewType: we don't want cast to do weird things. template<typename OldType, typename NewType> @@ -486,7 +502,7 @@ struct rint_retval #if defined(EIGEN_HIP_DEVICE_COMPILE) // HIP does not seem to have a native device side implementation for the math routine "arg" using std::arg; - #else + #else EIGEN_USING_STD(arg); #endif return arg(x); @@ -967,7 +983,7 @@ template<typename T> T generic_fast_tanh_float(const T& a_x); namespace numext { -#if (!defined(EIGEN_GPUCC) || defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC)) +#if (!defined(EIGEN_GPUCC) || defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC)) template<typename T> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y) |