[flang][runtime] Fix overflow detection for REAL input

The test for an overflow during decimal->binary conversion was taking
place too late, causing the data not to be rescanned from the beginning.

Differential Revision: https://reviews.llvm.org/D127427
This commit is contained in:
Peter Klausler 2022-06-09 11:39:18 -07:00
parent 3f3edbe5fc
commit 4c42e67bf7
2 changed files with 5 additions and 6 deletions

View File

@ -297,7 +297,9 @@ static int ScanRealInput(char *buffer, int bufferSize, IoStatementState &io,
}
for (exponent = 0; next; next = io.NextInField(remaining, edit)) {
if (*next >= '0' && *next <= '9') {
exponent = 10 * exponent + *next - '0';
if (exponent < 10000) {
exponent = 10 * exponent + *next - '0';
}
} else if (*next == ' ' || *next == '\t') {
if (bzMode) {
exponent = 10 * exponent;
@ -392,7 +394,7 @@ static bool TryFastPathRealInput(
const char *limit{str + maxConsume};
decimal::ConversionToBinaryResult<PRECISION> converted{
decimal::ConvertToBinary<PRECISION>(p, edit.modes.round, limit)};
if (converted.flags & decimal::Invalid) {
if (converted.flags & (decimal::Invalid | decimal::Overflow)) {
return false;
}
if (edit.digits.value_or(0) != 0) {
@ -428,9 +430,6 @@ static bool TryFastPathRealInput(
io.HandleRelativePosition(p - str);
// Set FP exception flags
if (converted.flags != decimal::ConversionResultFlags::Exact) {
if (converted.flags & decimal::ConversionResultFlags::Overflow) {
return false; // let slow path deal with it
}
RaiseFPExceptions(converted.flags);
}
return true;

View File

@ -136,7 +136,7 @@ public:
std::optional<char32_t> PrepareInput(
const DataEdit &edit, std::optional<int> &remaining) {
remaining.reset();
if (edit.descriptor == DataEdit::ListDirected) {
if (edit.IsListDirected()) {
std::size_t byteCount{0};
GetNextNonBlank(byteCount);
} else {