From 78d59a6500df1811e99b9413d09c3163b08c693e Mon Sep 17 00:00:00 2001 From: Peter Klausler Date: Tue, 11 Oct 2022 15:00:08 -0700 Subject: [PATCH] [flang] Warn about overflow from folding complex ABS() Emit a warning when the result of folding a call to ABS() with a complex argument results in an overflow. Differential Revision: https://reviews.llvm.org/D136904 --- flang/lib/Evaluate/fold-real.cpp | 10 ++++++++-- flang/test/Evaluate/errors01.f90 | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/flang/lib/Evaluate/fold-real.cpp b/flang/lib/Evaluate/fold-real.cpp index 5e10deb..38ece3f 100644 --- a/flang/lib/Evaluate/fold-real.cpp +++ b/flang/lib/Evaluate/fold-real.cpp @@ -105,8 +105,14 @@ Expr> FoldIntrinsicFunction( context, std::move(funcRef), &Scalar::ABS); } else if (auto *z{UnwrapExpr>(args[0])}) { return FoldElementalIntrinsic(context, std::move(funcRef), - ScalarFunc([](const Scalar &z) -> Scalar { - return z.ABS().value; + ScalarFunc([&name, &context]( + const Scalar &z) -> Scalar { + ValueWithRealFlags> y{z.ABS()}; + if (y.flags.test(RealFlag::Overflow)) { + context.messages().Say( + "complex ABS intrinsic folding overflow"_warn_en_US, name); + } + return y.value; })); } else { common::die(" unexpected argument type inside abs"); diff --git a/flang/test/Evaluate/errors01.f90 b/flang/test/Evaluate/errors01.f90 index 50705be..45f4cbe 100644 --- a/flang/test/Evaluate/errors01.f90 +++ b/flang/test/Evaluate/errors01.f90 @@ -105,5 +105,7 @@ module m real, parameter :: ok2 = scale(1.0, -99999) ! 0.0 !CHECK: SCALE intrinsic folding overflow real, parameter :: bad1 = scale(1.0, 99999) + !CHECK: complex ABS intrinsic folding overflow + real, parameter :: bad2 = abs(cmplx(huge(0.),huge(0.))) end subroutine end module -- 2.7.4