diff options
Diffstat (limited to 'flang-rt/lib/runtime/io-stmt.cpp')
-rw-r--r-- | flang-rt/lib/runtime/io-stmt.cpp | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/flang-rt/lib/runtime/io-stmt.cpp b/flang-rt/lib/runtime/io-stmt.cpp index 8056c8d..5667d67 100644 --- a/flang-rt/lib/runtime/io-stmt.cpp +++ b/flang-rt/lib/runtime/io-stmt.cpp @@ -526,6 +526,17 @@ Fortran::common::optional<DataEdit> IoStatementState::GetNextDataEdit(int n) { [&](auto &x) { return x.get().GetNextDataEdit(*this, n); }, u_); } +const NonTbpDefinedIoTable *IoStatementState::nonTbpDefinedIoTable() const { + return common::visit( + [&](auto &x) { return x.get().nonTbpDefinedIoTable(); }, u_); +} + +void IoStatementState::set_nonTbpDefinedIoTable( + const NonTbpDefinedIoTable *table) { + common::visit( + [&](auto &x) { return x.get().set_nonTbpDefinedIoTable(table); }, u_); +} + bool IoStatementState::Emit( const char *data, std::size_t bytes, std::size_t elementBytes) { return common::visit( @@ -633,10 +644,10 @@ IoStatementState::FastAsciiField IoStatementState::GetUpcomingFastAsciiField() { if (!connection.isUTF8 && connection.internalIoCharKind <= 1) { const char *p{nullptr}; if (std::size_t bytes{GetNextInputBytes(p)}) { - return FastAsciiField(connection, p, bytes); + return FastAsciiField{connection, p, bytes}; } } - return FastAsciiField(connection); + return FastAsciiField{connection}; } Fortran::common::optional<char32_t> IoStatementState::NextInField( @@ -920,9 +931,12 @@ ListDirectedStatementState<Direction::Input>::GetNextDataEdit( fastField.connection().positionInRecord = start; } } - if (!imaginaryPart_ && ch && *ch == '(') { - realPart_ = true; - fastField.connection().HandleRelativePosition(byteCount); + if (!imaginaryPart_ && edit.descriptor == DataEdit::ListDirected && ch && + *ch == '(') { + if (maxRepeat > 0) { // not being peeked at fram DefinedFormattedIo() + realPart_ = true; + fastField.connection().HandleRelativePosition(byteCount); + } edit.descriptor = DataEdit::ListDirectedRealPart; } return edit; @@ -952,12 +966,24 @@ bool ExternalUnformattedIoStatementState<DIR>::Receive( template <Direction DIR> ChildIoStatementState<DIR>::ChildIoStatementState( ChildIo &child, const char *sourceFile, int sourceLine) - : IoStatementBase{sourceFile, sourceLine}, child_{child} {} + : IoStatementBase{sourceFile, sourceLine}, child_{child}, + mutableModes_{child.parent().mutableModes()} {} + +template <Direction DIR> +const NonTbpDefinedIoTable * +ChildIoStatementState<DIR>::nonTbpDefinedIoTable() const { +#if !defined(RT_DEVICE_AVOID_RECURSION) + return child_.parent().nonTbpDefinedIoTable(); +#else + ReportUnsupportedChildIo(); +#endif +} template <Direction DIR> -MutableModes &ChildIoStatementState<DIR>::mutableModes() { +void ChildIoStatementState<DIR>::set_nonTbpDefinedIoTable( + const NonTbpDefinedIoTable *table) { #if !defined(RT_DEVICE_AVOID_RECURSION) - return child_.parent().mutableModes(); + child_.parent().set_nonTbpDefinedIoTable(table); #else ReportUnsupportedChildIo(); #endif @@ -1030,9 +1056,7 @@ ChildFormattedIoStatementState<DIR, CHAR>::ChildFormattedIoStatementState( ChildIo &child, const CHAR *format, std::size_t formatLength, const Descriptor *formatDescriptor, const char *sourceFile, int sourceLine) : ChildIoStatementState<DIR>{child, sourceFile, sourceLine}, - mutableModes_{child.parent().mutableModes()}, format_{*this, format, - formatLength, - formatDescriptor} {} + format_{*this, format, formatLength, formatDescriptor} {} template <Direction DIR, typename CHAR> void ChildFormattedIoStatementState<DIR, CHAR>::CompleteOperation() { |