Skip to content

Conversation

@klausler
Copy link
Contributor

When folding SQRT(), notice invalid argument exceptions and optionally warn about them.

When folding SQRT(), notice invalid argument exceptions and
optionally warn about them.
@llvmbot llvmbot added flang Flang issues not falling into any other category flang:semantics labels Nov 18, 2025
@llvmbot
Copy link
Member

llvmbot commented Nov 18, 2025

@llvm/pr-subscribers-flang-semantics

Author: Peter Klausler (klausler)

Changes

When folding SQRT(), notice invalid argument exceptions and optionally warn about them.


Full diff: https://github.com/llvm/llvm-project/pull/168607.diff

2 Files Affected:

  • (modified) flang/lib/Evaluate/fold-real.cpp (+8-2)
  • (modified) flang/test/Evaluate/folding03.f90 (+4)
diff --git a/flang/lib/Evaluate/fold-real.cpp b/flang/lib/Evaluate/fold-real.cpp
index 225e3402fd1ad..1ff941053a82e 100644
--- a/flang/lib/Evaluate/fold-real.cpp
+++ b/flang/lib/Evaluate/fold-real.cpp
@@ -425,8 +425,14 @@ Expr<Type<TypeCategory::Real, KIND>> FoldIntrinsicFunction(
             [](const Scalar<T> &x) -> Scalar<T> { return x.SPACING(); }));
   } else if (name == "sqrt") {
     return FoldElementalIntrinsic<T, T>(context, std::move(funcRef),
-        ScalarFunc<T, T>(
-            [](const Scalar<T> &x) -> Scalar<T> { return x.SQRT().value; }));
+        ScalarFunc<T, T>([&context](const Scalar<T> &x) -> Scalar<T> {
+          ValueWithRealFlags<Scalar<T>> result{x.SQRT()};
+          if (result.flags.test(RealFlag::InvalidArgument)) {
+            context.Warn(common::UsageWarning::FoldingValueChecks,
+                "Invalid argument to SQRT()"_warn_en_US);
+          }
+          return result.value;
+        }));
   } else if (name == "sum") {
     return FoldSum<T>(context, std::move(funcRef));
   } else if (name == "tiny") {
diff --git a/flang/test/Evaluate/folding03.f90 b/flang/test/Evaluate/folding03.f90
index 5b7ddd3c6c230..1d79098e085b8 100644
--- a/flang/test/Evaluate/folding03.f90
+++ b/flang/test/Evaluate/folding03.f90
@@ -83,6 +83,8 @@ module real_tests
   real(4), parameter :: r4_pinf = 1._4/0._4
   !WARN: warning: division by zero [-Wfolding-exception]
   real(4), parameter :: r4_ninf = -1._4/0._4
+  !WARN: warning: Invalid argument to SQRT() [-Wfolding-value-checks]
+  real(4), parameter :: r4_sqrtneg = sqrt(-1._4)
 
   logical, parameter :: test_r4_nan_parentheses1 = .NOT.(((r4_nan)).EQ.r4_nan)
   logical, parameter :: test_r4_nan_parentheses2 = .NOT.(((r4_nan)).LT.r4_nan)
@@ -155,6 +157,8 @@ module real_tests
   TEST_ISNAN(r4_nan_add5)
   real(4), parameter :: r4_nan_add6 = r4_nan + r4_nan
   TEST_ISNAN(r4_nan_add6)
+  real(4), parameter :: r4_nan_sqrt = sqrt(r4_nan)
+  TEST_ISNAN(r4_nan_sqrt)
 
   !WARN: warning: overflow on multiplication [-Wfolding-exception]
   logical, parameter :: test_inf_r4_mult1 = (1.5_4*r4_pmax).eq.(r4_pinf)

@github-actions
Copy link

🐧 Linux x64 Test Results

  • 4058 tests passed
  • 202 tests skipped

@github-actions
Copy link

🐧 Linux x64 Test Results

  • 4058 tests passed
  • 202 tests skipped

@klausler klausler merged commit 76c5b6a into llvm:main Dec 1, 2025
16 of 18 checks passed
@klausler klausler deleted the bad-sqrt branch December 1, 2025 22:41
kcloudy0717 pushed a commit to kcloudy0717/llvm-project that referenced this pull request Dec 4, 2025
When folding SQRT(), notice invalid argument exceptions and optionally
warn about them.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

flang:semantics flang Flang issues not falling into any other category

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants