From bb6acc561e5b65ac2bb09370ed98d2594f49f8a2 Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Wed, 17 Jun 2015 16:11:58 +0200 Subject: Workaround broken complex*real product on old clang versions --- test/stable_norm.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'test/stable_norm.cpp') diff --git a/test/stable_norm.cpp b/test/stable_norm.cpp index 21fae494b..99cb0d5a6 100644 --- a/test/stable_norm.cpp +++ b/test/stable_norm.cpp @@ -24,6 +24,8 @@ template void stable_norm(const MatrixType& m) typedef typename MatrixType::Index Index; typedef typename MatrixType::Scalar Scalar; typedef typename NumTraits::Real RealScalar; + + bool complex_real_product_ok = true; // Check the basic machine-dependent constants. { @@ -36,6 +38,16 @@ template void stable_norm(const MatrixType& m) VERIFY( (!(iemin > 1 - 2*it || 1+it>iemax || (it==2 && ibeta<5) || (it<=4 && ibeta <= 3 ) || it<2)) && "the stable norm algorithm cannot be guaranteed on this computer"); + + Scalar inf = std::numeric_limits::infinity(); + if(NumTraits::IsComplex && numext::isnan(inf*RealScalar(1)) ) + { + complex_real_product_ok = false; + static bool first = true; + if(first) + std::cerr << "WARNING: compiler mess up complex*real product, " << inf << " * " << 1.0 << " = " << inf*RealScalar(1) << std::endl; + first = false; + } } @@ -116,7 +128,10 @@ template void stable_norm(const MatrixType& m) v(i,j) = std::numeric_limits::infinity(); VERIFY(!numext::isfinite(v.squaredNorm())); VERIFY(isPlusInf(v.squaredNorm())); VERIFY(!numext::isfinite(v.norm())); VERIFY(isPlusInf(v.norm())); - VERIFY(!numext::isfinite(v.stableNorm())); VERIFY(isPlusInf(v.stableNorm())); + VERIFY(!numext::isfinite(v.stableNorm())); + if(complex_real_product_ok){ + VERIFY(isPlusInf(v.stableNorm())); + } VERIFY(!numext::isfinite(v.blueNorm())); VERIFY(isPlusInf(v.blueNorm())); VERIFY(!numext::isfinite(v.hypotNorm())); VERIFY(isPlusInf(v.hypotNorm())); } @@ -127,7 +142,10 @@ template void stable_norm(const MatrixType& m) v(i,j) = -std::numeric_limits::infinity(); VERIFY(!numext::isfinite(v.squaredNorm())); VERIFY(isPlusInf(v.squaredNorm())); VERIFY(!numext::isfinite(v.norm())); VERIFY(isPlusInf(v.norm())); - VERIFY(!numext::isfinite(v.stableNorm())); VERIFY(isPlusInf(v.stableNorm())); + VERIFY(!numext::isfinite(v.stableNorm())); + if(complex_real_product_ok) { + VERIFY(isPlusInf(v.stableNorm())); + } VERIFY(!numext::isfinite(v.blueNorm())); VERIFY(isPlusInf(v.blueNorm())); VERIFY(!numext::isfinite(v.hypotNorm())); VERIFY(isPlusInf(v.hypotNorm())); } -- cgit v1.2.3