summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Klausler <35819229+klausler@users.noreply.github.com>2024-03-01 14:15:48 -0800
committerGitHub <noreply@github.com>2024-03-01 14:15:48 -0800
commit4762c6557d15ba45594793749fea8df6c911f0a8 (patch)
tree3ba330858af636389ce354c38f462a0865ec1c7c
parent7a2d9347d333afad4c78f61949b51b1363525ed9 (diff)
[flang][runtime] Underflow real input to -0. when negative (#82443)
When the result of real input editing underflows to zero, return -0. when the input field had a minus sign.
-rw-r--r--flang/lib/Decimal/decimal-to-binary.cpp8
-rw-r--r--flang/unittests/Runtime/NumericalFormatTest.cpp2
2 files changed, 8 insertions, 2 deletions
diff --git a/flang/lib/Decimal/decimal-to-binary.cpp b/flang/lib/Decimal/decimal-to-binary.cpp
index d38af0f9b800..c5cdb72e355f 100644
--- a/flang/lib/Decimal/decimal-to-binary.cpp
+++ b/flang/lib/Decimal/decimal-to-binary.cpp
@@ -14,6 +14,7 @@
#include <cinttypes>
#include <cstring>
#include <ctype.h>
+#include <utility>
namespace Fortran::decimal {
@@ -275,7 +276,12 @@ ConversionToBinaryResult<PREC> IntermediateFloat<PREC>::ToBinary(
if (guard != 0) {
flags |= Underflow;
}
- return {Binary{}, static_cast<enum ConversionResultFlags>(flags)};
+ Binary zero;
+ if (isNegative) {
+ zero.Negate();
+ }
+ return {
+ std::move(zero), static_cast<enum ConversionResultFlags>(flags)};
}
}
} else {
diff --git a/flang/unittests/Runtime/NumericalFormatTest.cpp b/flang/unittests/Runtime/NumericalFormatTest.cpp
index 03a2be3ca56d..37eecd7708a1 100644
--- a/flang/unittests/Runtime/NumericalFormatTest.cpp
+++ b/flang/unittests/Runtime/NumericalFormatTest.cpp
@@ -916,7 +916,7 @@ TEST(IOApiTests, EditDoubleInputValues) {
{"(RU,F7.0)", "-1.e999", 0xffefffffffffffff, 0}, // -HUGE()
{"(E9.1)", " 1.0E-325", 0x0, 0},
{"(RU,E9.1)", " 1.0E-325", 0x1, 0},
- {"(E9.1)", "-1.0E-325", 0x0, 0},
+ {"(E9.1)", "-1.0E-325", 0x8000000000000000, 0},
{"(RD,E9.1)", "-1.0E-325", 0x8000000000000001, 0},
};
for (auto const &[format, data, want, iostat] : testCases) {