diff --git a/flang/lib/Evaluate/fold-real.cpp b/flang/lib/Evaluate/fold-real.cpp --- a/flang/lib/Evaluate/fold-real.cpp +++ b/flang/lib/Evaluate/fold-real.cpp @@ -166,8 +166,13 @@ CHECK(args.size() == 2); return FoldElementalIntrinsic(context, std::move(funcRef), ScalarFunc( - [](const Scalar &x, const Scalar &y) -> Scalar { - return x.HYPOT(y).value; + [&](const Scalar &x, const Scalar &y) -> Scalar { + ValueWithRealFlags> result{x.HYPOT(y)}; + if (result.flags.test(RealFlag::Overflow)) { + context.messages().Say( + "HYPOT intrinsic folding overflow"_warn_en_US); + } + return result.value; })); } else if (name == "max") { return FoldMINorMAX(context, std::move(funcRef), Ordering::Greater); diff --git a/flang/test/Evaluate/errors01.f90 b/flang/test/Evaluate/errors01.f90 --- a/flang/test/Evaluate/errors01.f90 +++ b/flang/test/Evaluate/errors01.f90 @@ -163,6 +163,8 @@ real, parameter :: bad3 = dim(huge(1.),-.5*huge(1.)) !CHECK: warning: DIM intrinsic folding overflow integer, parameter :: bad4 = dim(huge(1),-1) + !CHECK: warning: HYPOT intrinsic folding overflow + real, parameter :: bad5 = hypot(huge(0.), huge(0.)) !CHECK: warning: overflow on REAL(8) to REAL(4) conversion x = 1.D40 end subroutine