diff --git a/flang/include/flang/Runtime/iostat.h b/flang/include/flang/Runtime/iostat.h index 562efb73f96c9..c8154c1a32510 100644 --- a/flang/include/flang/Runtime/iostat.h +++ b/flang/include/flang/Runtime/iostat.h @@ -74,6 +74,7 @@ enum Iostat { IostatBadWaitUnit, IostatBOZInputOverflow, IostatIntegerInputOverflow, + IostatRealInputOverflow, }; const char *IostatErrorString(int); diff --git a/flang/runtime/edit-input.cpp b/flang/runtime/edit-input.cpp index 7e53b54f59949..3c8630cebc596 100644 --- a/flang/runtime/edit-input.cpp +++ b/flang/runtime/edit-input.cpp @@ -428,6 +428,9 @@ 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; @@ -505,6 +508,10 @@ bool EditCommonRealInput(IoStatementState &io, const DataEdit &edit, void *n) { converted.binary; // Set FP exception flags if (converted.flags != decimal::ConversionResultFlags::Exact) { + if (converted.flags & decimal::ConversionResultFlags::Overflow) { + io.GetIoErrorHandler().SignalError(IostatRealInputOverflow); + return false; + } RaiseFPExceptions(converted.flags); } return true; diff --git a/flang/runtime/iostat.cpp b/flang/runtime/iostat.cpp index 5ab1ee435ef22..017be1c9164e0 100644 --- a/flang/runtime/iostat.cpp +++ b/flang/runtime/iostat.cpp @@ -92,6 +92,8 @@ const char *IostatErrorString(int iostat) { return "B/O/Z input value overflows variable"; case IostatIntegerInputOverflow: return "Integer input value overflows variable"; + case IostatRealInputOverflow: + return "Real or complex input value overflows type"; default: return nullptr; }