Fix undefined behavior in matrix_cwise test for signed integers

libeigen/eigen!2310

Closes #2933
This commit is contained in:
Pavel Guzenfeld
2026-03-18 18:51:01 +00:00
committed by Rasmus Munk Larsen
parent 0fd8002b11
commit 05295a818b

View File

@@ -69,7 +69,14 @@ void test_cwise_real(const MatrixType& m) {
VERIFY_IS_CWISE_APPROX(m2.cwiseInverse(), cwise_ref(m2, [](const Scalar& x) { return Scalar(Scalar(1) / x); }));
VERIFY_IS_CWISE_APPROX(m1.cwiseArg(), cwise_ref(m1, [](const Scalar& x) { return Eigen::numext::arg(x); }));
// Only take sqrt of positive values.
m2 = m1.cwiseAbs();
// For signed integers, abs(min_value) overflows, so clamp it first.
m2 = m1;
if (Eigen::NumTraits<Scalar>::IsInteger && std::is_signed<Scalar>::value) {
m2 = m1.unaryExpr([](const Scalar& x) {
return x == (std::numeric_limits<Scalar>::min)() ? (std::numeric_limits<Scalar>::max)() : x;
});
}
m2 = m2.cwiseAbs();
VERIFY_IS_CWISE_APPROX(m2.cwiseSqrt(), cwise_ref(m2, [](const Scalar& x) { return Eigen::numext::sqrt(x); }));
// Only find Square/Abs2 of +/- sqrt values so we don't overflow.
m2 = m2.cwiseSqrt().array() * m1.cwiseSign().array();