diff options
author | Peter Klausler <35819229+klausler@users.noreply.github.com> | 2024-03-01 14:15:48 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-01 14:15:48 -0800 |
commit | 4762c6557d15ba45594793749fea8df6c911f0a8 (patch) | |
tree | 3ba330858af636389ce354c38f462a0865ec1c7c /flang | |
parent | 7a2d9347d333afad4c78f61949b51b1363525ed9 (diff) | |
download | llvm-4762c6557d15ba45594793749fea8df6c911f0a8.zip llvm-4762c6557d15ba45594793749fea8df6c911f0a8.tar.gz llvm-4762c6557d15ba45594793749fea8df6c911f0a8.tar.bz2 |
[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.
Diffstat (limited to 'flang')
-rw-r--r-- | flang/lib/Decimal/decimal-to-binary.cpp | 8 | ||||
-rw-r--r-- | flang/unittests/Runtime/NumericalFormatTest.cpp | 2 |
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 d38af0f..c5cdb72 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 03a2be3..37eecd7 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) { |