[flang-commits] [PATCH] D90493: [flang] Detect and rewrite ambiguous READ(CVAR)[, item-list]
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Fri Oct 30 15:47:56 PDT 2020
This revision was automatically updated to reflect the committed changes.
Closed by commit rG4acd8f7f0a7e: [flang] Detect and rewrite ambiguous READ(CVAR)[,item-list] (authored by klausler).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D90493/new/
https://reviews.llvm.org/D90493
Files:
flang/lib/Parser/io-parsers.cpp
flang/lib/Semantics/rewrite-parse-tree.cpp
flang/test/Semantics/rewrite01.f90
Index: flang/test/Semantics/rewrite01.f90
===================================================================
--- /dev/null
+++ flang/test/Semantics/rewrite01.f90
@@ -0,0 +1,10 @@
+! RUN: %f18 -fparse-only -fdebug-dump-parse-tree %s 2>&1 | FileCheck %s
+! Ensure that READ(CVAR) [, item-list] is corrected when CVAR is a
+! character variable so as to be a formatted read from the default
+! unit, not an unformatted read from an internal unit (which is not
+! possible in Fortran).
+character :: cvar
+! CHECK-NOT: IoUnit -> Variable -> Designator -> DataRef -> Name = 'cvar'
+! CHECK: Format -> Expr = 'cvar'
+read(cvar)
+end
Index: flang/lib/Semantics/rewrite-parse-tree.cpp
===================================================================
--- flang/lib/Semantics/rewrite-parse-tree.cpp
+++ flang/lib/Semantics/rewrite-parse-tree.cpp
@@ -146,7 +146,25 @@
}
}
+// READ(CVAR) [, ...] will be misparsed as UNIT=CVAR; correct
+// it to READ CVAR [,...] with CVAR as a format rather than as
+// an internal I/O unit for unformatted I/O, which Fortran does
+// not support.
void RewriteMutator::Post(parser::ReadStmt &x) {
+ if (x.iounit && !x.format && x.controls.empty()) {
+ if (auto *var{std::get_if<parser::Variable>(&x.iounit->u)}) {
+ const parser::Name &last{parser::GetLastName(*var)};
+ DeclTypeSpec *type{last.symbol ? last.symbol->GetType() : nullptr};
+ if (type && type->category() == DeclTypeSpec::Character) {
+ x.format = std::visit(
+ [](auto &&indirection) {
+ return parser::Expr{std::move(indirection)};
+ },
+ std::move(var->u));
+ x.iounit.reset();
+ }
+ }
+ }
FixMisparsedUntaggedNamelistName(x);
}
Index: flang/lib/Parser/io-parsers.cpp
===================================================================
--- flang/lib/Parser/io-parsers.cpp
+++ flang/lib/Parser/io-parsers.cpp
@@ -139,6 +139,10 @@
// R1210 read-stmt ->
// READ ( io-control-spec-list ) [input-item-list] |
// READ format [, input-item-list]
+// The ambiguous READ(CVAR) is parsed as if CVAR were the unit.
+// As Fortran doesn't have internal unformatted I/O, it should
+// be parsed as if (CVAR) were a format; this is corrected by
+// rewriting in semantics when we know that CVAR is character.
constexpr auto inputItemList{
extension<LanguageFeature::IOListLeadingComma>(
some("," >> inputItem)) || // legacy extension: leading comma
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D90493.302033.patch
Type: text/x-patch
Size: 2464 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20201030/65175dbb/attachment.bin>
More information about the flang-commits
mailing list