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 /test | |
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 'test')
-rw-r--r-- | test/basicstuff.cpp | 33 | ||||
-rw-r--r-- | test/bfloat16_float.cpp | 16 |
2 files changed, 10 insertions, 39 deletions
diff --git a/test/basicstuff.cpp b/test/basicstuff.cpp index f9044a27a..4ca607c82 100644 --- a/test/basicstuff.cpp +++ b/test/basicstuff.cpp @@ -195,11 +195,8 @@ template<typename MatrixType> void basicStuffComplex(const MatrixType& m) VERIFY(!static_cast<const MatrixType&>(cm).imag().isZero()); } -template<typename SrcScalar, typename TgtScalar, bool SrcIsHalfOrBF16 = (internal::is_same<SrcScalar, half>::value || internal::is_same<SrcScalar, bfloat16>::value)> struct casting_test; - - template<typename SrcScalar, typename TgtScalar> -struct casting_test<SrcScalar, TgtScalar, false> { +struct casting_test { static void run() { Matrix<SrcScalar,4,4> m; for (int i=0; i<m.rows(); ++i) { @@ -210,33 +207,7 @@ struct casting_test<SrcScalar, TgtScalar, false> { Matrix<TgtScalar,4,4> n = m.template cast<TgtScalar>(); for (int i=0; i<m.rows(); ++i) { for (int j=0; j<m.cols(); ++j) { - VERIFY_IS_APPROX(n(i, j), static_cast<TgtScalar>(m(i, j))); - } - } - } -}; - -template<typename SrcScalar, typename TgtScalar> -struct casting_test<SrcScalar, TgtScalar, true> { - static void run() { - casting_test<SrcScalar, TgtScalar, false>::run(); - } -}; - -template<typename SrcScalar, typename RealScalar> -struct casting_test<SrcScalar, std::complex<RealScalar>, true> { - static void run() { - typedef std::complex<RealScalar> TgtScalar; - Matrix<SrcScalar,4,4> m; - for (int i=0; i<m.rows(); ++i) { - for (int j=0; j<m.cols(); ++j) { - m(i, j) = internal::random_without_cast_overflow<SrcScalar, TgtScalar>::value(); - } - } - Matrix<TgtScalar,4,4> n = m.template cast<TgtScalar>(); - for (int i=0; i<m.rows(); ++i) { - for (int j=0; j<m.cols(); ++j) { - VERIFY_IS_APPROX(n(i, j), static_cast<TgtScalar>(static_cast<RealScalar>(m(i, j)))); + VERIFY_IS_APPROX(n(i, j), (internal::cast<SrcScalar,TgtScalar>(m(i, j)))); } } } diff --git a/test/bfloat16_float.cpp b/test/bfloat16_float.cpp index 79c868e84..09df2b2f2 100644 --- a/test/bfloat16_float.cpp +++ b/test/bfloat16_float.cpp @@ -44,14 +44,14 @@ void test_truncate(float input, float expected_truncation, float expected_roundi template<typename T> void test_roundtrip() { // Representable T round trip via bfloat16 - VERIFY_IS_EQUAL(static_cast<T>(static_cast<bfloat16>(-std::numeric_limits<T>::infinity())), -std::numeric_limits<T>::infinity()); - VERIFY_IS_EQUAL(static_cast<T>(static_cast<bfloat16>(std::numeric_limits<T>::infinity())), std::numeric_limits<T>::infinity()); - VERIFY_IS_EQUAL(static_cast<T>(static_cast<bfloat16>(T(-1.0))), T(-1.0)); - VERIFY_IS_EQUAL(static_cast<T>(static_cast<bfloat16>(T(-0.5))), T(-0.5)); - VERIFY_IS_EQUAL(static_cast<T>(static_cast<bfloat16>(T(-0.0))), T(-0.0)); - VERIFY_IS_EQUAL(static_cast<T>(static_cast<bfloat16>(T(1.0))), T(1.0)); - VERIFY_IS_EQUAL(static_cast<T>(static_cast<bfloat16>(T(0.5))), T(0.5)); - VERIFY_IS_EQUAL(static_cast<T>(static_cast<bfloat16>(T(0.0))), T(0.0)); + VERIFY_IS_EQUAL((internal::cast<bfloat16,T>(internal::cast<T,bfloat16>(-std::numeric_limits<T>::infinity()))), -std::numeric_limits<T>::infinity()); + VERIFY_IS_EQUAL((internal::cast<bfloat16,T>(internal::cast<T,bfloat16>(std::numeric_limits<T>::infinity()))), std::numeric_limits<T>::infinity()); + VERIFY_IS_EQUAL((internal::cast<bfloat16,T>(internal::cast<T,bfloat16>(T(-1.0)))), T(-1.0)); + VERIFY_IS_EQUAL((internal::cast<bfloat16,T>(internal::cast<T,bfloat16>(T(-0.5)))), T(-0.5)); + VERIFY_IS_EQUAL((internal::cast<bfloat16,T>(internal::cast<T,bfloat16>(T(-0.0)))), T(-0.0)); + VERIFY_IS_EQUAL((internal::cast<bfloat16,T>(internal::cast<T,bfloat16>(T(1.0)))), T(1.0)); + VERIFY_IS_EQUAL((internal::cast<bfloat16,T>(internal::cast<T,bfloat16>(T(0.5)))), T(0.5)); + VERIFY_IS_EQUAL((internal::cast<bfloat16,T>(internal::cast<T,bfloat16>(T(0.0)))), T(0.0)); } void test_conversion() |