summaryrefslogtreecommitdiff
path: root/flang-rt/lib/runtime/io-stmt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang-rt/lib/runtime/io-stmt.cpp')
-rw-r--r--flang-rt/lib/runtime/io-stmt.cpp50
1 files changed, 33 insertions, 17 deletions
diff --git a/flang-rt/lib/runtime/io-stmt.cpp b/flang-rt/lib/runtime/io-stmt.cpp
index 28149090eb16..e260c0ca7511 100644
--- a/flang-rt/lib/runtime/io-stmt.cpp
+++ b/flang-rt/lib/runtime/io-stmt.cpp
@@ -46,9 +46,9 @@ bool IoStatementBase::Receive(char *, std::size_t, std::size_t) {
return false;
}
-Fortran::common::optional<DataEdit> IoStatementBase::GetNextDataEdit(
+common::optional<DataEdit> IoStatementBase::GetNextDataEdit(
IoStatementState &, int) {
- return Fortran::common::nullopt;
+ return common::nullopt;
}
bool IoStatementBase::BeginReadingRecord() { return true; }
@@ -532,7 +532,7 @@ int ExternalFormattedIoStatementState<DIR, CHAR>::EndIoStatement() {
return ExternalIoStatementState<DIR>::EndIoStatement();
}
-Fortran::common::optional<DataEdit> IoStatementState::GetNextDataEdit(int n) {
+common::optional<DataEdit> IoStatementState::GetNextDataEdit(int n) {
return common::visit(
[&](auto &x) { return x.get().GetNextDataEdit(*this, n); }, u_);
}
@@ -618,13 +618,13 @@ ExternalFileUnit *IoStatementState::GetExternalFileUnit() const {
[](auto &x) { return x.get().GetExternalFileUnit(); }, u_);
}
-Fortran::common::optional<char32_t> IoStatementState::GetCurrentCharSlow(
+common::optional<char32_t> IoStatementState::GetCurrentCharSlow(
std::size_t &byteCount) {
const char *p{nullptr};
std::size_t bytes{GetNextInputBytes(p)};
if (bytes == 0) {
byteCount = 0;
- return Fortran::common::nullopt;
+ return common::nullopt;
} else {
const ConnectionState &connection{GetConnectionState()};
if (connection.isUTF8) {
@@ -661,8 +661,8 @@ IoStatementState::FastAsciiField IoStatementState::GetUpcomingFastAsciiField() {
return FastAsciiField{connection};
}
-Fortran::common::optional<char32_t> IoStatementState::NextInField(
- Fortran::common::optional<int> &remaining, const DataEdit &edit,
+common::optional<char32_t> IoStatementState::NextInField(
+ common::optional<int> &remaining, const DataEdit &edit,
FastAsciiField *field) {
std::size_t byteCount{0};
if (!remaining) { // Stream, list-directed, NAMELIST, &c.
@@ -680,21 +680,21 @@ Fortran::common::optional<char32_t> IoStatementState::NextInField(
case '"':
case '*':
case '\n': // for stream access
- return Fortran::common::nullopt;
+ return common::nullopt;
case '&':
case '$':
if (edit.IsNamelist()) {
- return Fortran::common::nullopt;
+ return common::nullopt;
}
break;
case ',':
if (!(edit.modes.editingFlags & decimalComma)) {
- return Fortran::common::nullopt;
+ return common::nullopt;
}
break;
case ';':
if (edit.modes.editingFlags & decimalComma) {
- return Fortran::common::nullopt;
+ return common::nullopt;
}
break;
default:
@@ -712,7 +712,7 @@ Fortran::common::optional<char32_t> IoStatementState::NextInField(
} else if (*remaining > 0) {
if (auto next{GetCurrentChar(byteCount, field)}) {
if (byteCount > static_cast<std::size_t>(*remaining)) {
- return Fortran::common::nullopt;
+ return common::nullopt;
}
*remaining -= byteCount;
if (field) {
@@ -726,10 +726,10 @@ Fortran::common::optional<char32_t> IoStatementState::NextInField(
if (CheckForEndOfRecord(0,
field ? field->connection() : GetConnectionState())) { // do padding
--*remaining;
- return Fortran::common::optional<char32_t>{' '};
+ return common::optional<char32_t>{' '};
}
}
- return Fortran::common::nullopt;
+ return common::nullopt;
}
bool IoStatementState::CheckForEndOfRecord(
@@ -821,7 +821,7 @@ bool ListDirectedStatementState<Direction::Output>::EmitLeadingSpaceOrAdvance(
return true;
}
-Fortran::common::optional<DataEdit>
+common::optional<DataEdit>
ListDirectedStatementState<Direction::Output>::GetNextDataEdit(
IoStatementState &io, int maxRepeat) {
DataEdit edit;
@@ -838,7 +838,7 @@ int ListDirectedStatementState<Direction::Input>::EndIoStatement() {
return IostatOk;
}
-Fortran::common::optional<DataEdit>
+common::optional<DataEdit>
ListDirectedStatementState<Direction::Input>::GetNextDataEdit(
IoStatementState &io, int maxRepeat) {
// N.B. list-directed transfers cannot be nonadvancing (C1221)
@@ -891,7 +891,7 @@ ListDirectedStatementState<Direction::Input>::GetNextDataEdit(
}
eatComma_ = true;
if (!ch) {
- return Fortran::common::nullopt;
+ return common::nullopt;
}
if (*ch == '/') {
hitSlash_ = true;
@@ -1076,6 +1076,14 @@ void ChildFormattedIoStatementState<DIR, CHAR>::CompleteOperation() {
template <Direction DIR, typename CHAR>
int ChildFormattedIoStatementState<DIR, CHAR>::EndIoStatement() {
+ if constexpr (DIR == Direction::Input) {
+ if (auto *listInput{this->child()
+ .parent()
+ .template get_if<
+ ListDirectedStatementState<Direction::Input>>()}) {
+ listInput->set_eatComma(false);
+ }
+ }
CompleteOperation();
return ChildIoStatementState<DIR>::EndIoStatement();
}
@@ -1097,6 +1105,7 @@ ChildListIoStatementState<DIR>::ChildListIoStatementState(
if constexpr (DIR == Direction::Input) {
if (auto *listInput{child.parent()
.get_if<ListDirectedStatementState<Direction::Input>>()}) {
+ this->set_eatComma(listInput->eatComma());
this->namelistGroup_ = listInput->namelistGroup();
}
}
@@ -1121,6 +1130,13 @@ bool ChildListIoStatementState<DIR>::AdvanceRecord(int n) {
template <Direction DIR> int ChildListIoStatementState<DIR>::EndIoStatement() {
if constexpr (DIR == Direction::Input) {
+ if (auto *listInput{this->child()
+ .parent()
+ .template get_if<
+ ListDirectedStatementState<Direction::Input>>()}) {
+ listInput->set_eatComma(this->eatComma());
+ listInput->set_hitSlash(this->hitSlash());
+ }
if (int status{ListDirectedStatementState<DIR>::EndIoStatement()};
status != IostatOk) {
return status;