Skip to content

Commit 76c5b6a

Browse files
authored
[flang] Warn on invalid argument to SQRT() (#168607)
When folding SQRT(), notice invalid argument exceptions and optionally warn about them.
1 parent b76300a commit 76c5b6a

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

flang/lib/Evaluate/fold-real.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -425,8 +425,14 @@ Expr<Type<TypeCategory::Real, KIND>> FoldIntrinsicFunction(
425425
[](const Scalar<T> &x) -> Scalar<T> { return x.SPACING(); }));
426426
} else if (name == "sqrt") {
427427
return FoldElementalIntrinsic<T, T>(context, std::move(funcRef),
428-
ScalarFunc<T, T>(
429-
[](const Scalar<T> &x) -> Scalar<T> { return x.SQRT().value; }));
428+
ScalarFunc<T, T>([&context](const Scalar<T> &x) -> Scalar<T> {
429+
ValueWithRealFlags<Scalar<T>> result{x.SQRT()};
430+
if (result.flags.test(RealFlag::InvalidArgument)) {
431+
context.Warn(common::UsageWarning::FoldingValueChecks,
432+
"Invalid argument to SQRT()"_warn_en_US);
433+
}
434+
return result.value;
435+
}));
430436
} else if (name == "sum") {
431437
return FoldSum<T>(context, std::move(funcRef));
432438
} else if (name == "tiny") {

flang/test/Evaluate/folding03.f90

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ module real_tests
8383
real(4), parameter :: r4_pinf = 1._4/0._4
8484
!WARN: warning: division by zero [-Wfolding-exception]
8585
real(4), parameter :: r4_ninf = -1._4/0._4
86+
!WARN: warning: Invalid argument to SQRT() [-Wfolding-value-checks]
87+
real(4), parameter :: r4_sqrtneg = sqrt(-1._4)
8688

8789
logical, parameter :: test_r4_nan_parentheses1 = .NOT.(((r4_nan)).EQ.r4_nan)
8890
logical, parameter :: test_r4_nan_parentheses2 = .NOT.(((r4_nan)).LT.r4_nan)
@@ -155,6 +157,8 @@ module real_tests
155157
TEST_ISNAN(r4_nan_add5)
156158
real(4), parameter :: r4_nan_add6 = r4_nan + r4_nan
157159
TEST_ISNAN(r4_nan_add6)
160+
real(4), parameter :: r4_nan_sqrt = sqrt(r4_nan)
161+
TEST_ISNAN(r4_nan_sqrt)
158162

159163
!WARN: warning: overflow on multiplication [-Wfolding-exception]
160164
logical, parameter :: test_inf_r4_mult1 = (1.5_4*r4_pmax).eq.(r4_pinf)

0 commit comments

Comments
 (0)