[flang] NINT(-.4999) is 0, not overflow
authorPeter Klausler <pklausler@nvidia.com>
Fri, 10 Jun 2022 00:06:35 +0000 (17:06 -0700)
committerPeter Klausler <pklausler@nvidia.com>
Thu, 16 Jun 2022 17:47:52 +0000 (10:47 -0700)
Overflow detection in the folding of int/nint/ceiling is
incorrectly signalling overflow when a negative argument yields
a zero result.

Differential Revision: https://reviews.llvm.org/D127785

flang/include/flang/Evaluate/real.h

index 2b5562a7eee9f5ebc63457841e3fae107299fc3a..7665c64ef1ebcbe859d3766fea544b8ade2da384 100644 (file)
@@ -280,8 +280,10 @@ public:
     if (IsSignBitSet()) {
       result.value = result.value.Negate().value;
     }
-    if (IsSignBitSet() != result.value.IsNegative()) {
-      result.flags.set(RealFlag::Overflow);
+    if (!result.value.IsZero()) {
+      if (IsSignBitSet() != result.value.IsNegative()) {
+        result.flags.set(RealFlag::Overflow);
+      }
     }
     if (result.flags.test(RealFlag::Overflow)) {
       result.value =