[flang-commits] [PATCH] D117819: [flang] Handle FLUSH(unknown unit)
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Thu Jan 20 11:12:42 PST 2022
klausler created this revision.
klausler added a reviewer: vdonaldson.
klausler added a project: Flang.
Herald added a subscriber: jdoerfert.
klausler requested review of this revision.
The unit number passed to a FLUSH statement is not required to
be a valid open unit; nothing happens (esp. not the creation of
an empty fort.n file) in this case.
https://reviews.llvm.org/D117819
Files:
flang/runtime/io-api.cpp
flang/runtime/io-stmt.h
Index: flang/runtime/io-stmt.h
===================================================================
--- flang/runtime/io-stmt.h
+++ flang/runtime/io-stmt.h
@@ -34,7 +34,7 @@
class InquireIOLengthState;
class ExternalMiscIoStatementState;
class CloseStatementState;
-class NoopCloseStatementState;
+class NoopStatementState; // CLOSE or FLUSH on unknown unit
template <Direction, typename CHAR = char>
class InternalFormattedIoStatementState;
@@ -238,7 +238,7 @@
private:
std::variant<std::reference_wrapper<OpenStatementState>,
std::reference_wrapper<CloseStatementState>,
- std::reference_wrapper<NoopCloseStatementState>,
+ std::reference_wrapper<NoopStatementState>,
std::reference_wrapper<
InternalFormattedIoStatementState<Direction::Output>>,
std::reference_wrapper<
@@ -616,9 +616,9 @@
ConnectionState connection_;
};
-class NoopCloseStatementState : public NoUnitIoStatementState {
+class NoopStatementState : public NoUnitIoStatementState {
public:
- NoopCloseStatementState(const char *sourceFile, int sourceLine)
+ NoopStatementState(const char *sourceFile, int sourceLine)
: NoUnitIoStatementState{sourceFile, sourceLine, *this} {}
void set_status(CloseStatus) {} // discards
};
Index: flang/runtime/io-api.cpp
===================================================================
--- flang/runtime/io-api.cpp
+++ flang/runtime/io-api.cpp
@@ -317,7 +317,7 @@
} else {
// CLOSE(UNIT=bad unit) is just a no-op
Terminator oom{sourceFile, sourceLine};
- return &New<NoopCloseStatementState>{oom}(sourceFile, sourceLine)
+ return &New<NoopStatementState>{oom}(sourceFile, sourceLine)
.release()
->ioStatementState();
}
@@ -325,11 +325,16 @@
Cookie IONAME(BeginFlush)(
ExternalUnit unitNumber, const char *sourceFile, int sourceLine) {
- Terminator terminator{sourceFile, sourceLine};
- ExternalFileUnit &unit{
- ExternalFileUnit::LookUpOrCrash(unitNumber, terminator)};
- return &unit.BeginIoStatement<ExternalMiscIoStatementState>(
- unit, ExternalMiscIoStatementState::Flush, sourceFile, sourceLine);
+ if (ExternalFileUnit * unit{ExternalFileUnit::LookUp(unitNumber)}) {
+ return &unit->BeginIoStatement<ExternalMiscIoStatementState>(
+ *unit, ExternalMiscIoStatementState::Flush, sourceFile, sourceLine);
+ } else {
+ // FLUSH(UNIT=unknown) is a no-op
+ Terminator oom{sourceFile, sourceLine};
+ return &New<NoopStatementState>{oom}(sourceFile, sourceLine)
+ .release()
+ ->ioStatementState();
+ }
}
Cookie IONAME(BeginBackspace)(
@@ -879,7 +884,7 @@
}
return false;
}
- if (io.get_if<NoopCloseStatementState>()) {
+ if (io.get_if<NoopStatementState>()) {
return true; // don't bother validating STATUS= in a no-op CLOSE
}
io.GetIoErrorHandler().Crash(
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D117819.401713.patch
Type: text/x-patch
Size: 2893 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20220120/04b7edd1/attachment.bin>
More information about the flang-commits
mailing list