From: Peter Klausler Date: Thu, 9 Jun 2022 18:39:18 +0000 (-0700) Subject: [flang][runtime] Fix overflow detection for REAL input X-Git-Tag: upstream/15.0.7~4882 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4c42e67bf7f597a5b9b9aa51f2ea994a17c0aa54;p=platform%2Fupstream%2Fllvm.git [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 --- diff --git a/flang/runtime/edit-input.cpp b/flang/runtime/edit-input.cpp index 3c8630cebc59..cfcb98b68144 100644 --- a/flang/runtime/edit-input.cpp +++ b/flang/runtime/edit-input.cpp @@ -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 converted{ decimal::ConvertToBinary(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; diff --git a/flang/runtime/io-stmt.h b/flang/runtime/io-stmt.h index aa9f018dafbc..5e3209b7acab 100644 --- a/flang/runtime/io-stmt.h +++ b/flang/runtime/io-stmt.h @@ -136,7 +136,7 @@ public: std::optional PrepareInput( const DataEdit &edit, std::optional &remaining) { remaining.reset(); - if (edit.descriptor == DataEdit::ListDirected) { + if (edit.IsListDirected()) { std::size_t byteCount{0}; GetNextNonBlank(byteCount); } else {