[flang-commits] [flang] [flang][runtime] Extension: NAMELIST input may omit terminal '/' (PR #76476)
via flang-commits
flang-commits at lists.llvm.org
Wed Dec 27 15:52:27 PST 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-runtime
Author: Peter Klausler (klausler)
<details>
<summary>Changes</summary>
... when it is followed eventually by the '&' that begins the next NAMELIST input group. This is a gfortran extension.
---
Full diff: https://github.com/llvm/llvm-project/pull/76476.diff
2 Files Affected:
- (modified) flang/docs/Extensions.md (+2)
- (modified) flang/runtime/namelist.cpp (+10-6)
``````````diff
diff --git a/flang/docs/Extensions.md b/flang/docs/Extensions.md
index 6c6588025a392d..eaf85614736a24 100644
--- a/flang/docs/Extensions.md
+++ b/flang/docs/Extensions.md
@@ -315,6 +315,8 @@ end
* When a file included via an `INCLUDE` line or `#include` directive
has a continuation marker at the end of its last line in free form,
Fortran line continuation works.
+* A `NAMELIST` input group may omit its trailing `/` character if
+ it is followed by another `NAMELIST` input group.
### Extensions supported when enabled by options
diff --git a/flang/runtime/namelist.cpp b/flang/runtime/namelist.cpp
index 61815a7cc8a403..e714ee1dc76303 100644
--- a/flang/runtime/namelist.cpp
+++ b/flang/runtime/namelist.cpp
@@ -378,12 +378,13 @@ static bool HandleComponent(IoStatementState &io, Descriptor &desc,
return false;
}
-// Advance to the terminal '/' of a namelist group.
+// Advance to the terminal '/' of a namelist group or leading '&'
+// of the next.
static void SkipNamelistGroup(IoStatementState &io) {
std::size_t byteCount{0};
while (auto ch{io.GetNextNonBlank(byteCount)}) {
io.HandleRelativePosition(byteCount);
- if (*ch == '/') {
+ if (*ch == '/' || *ch == '&') {
break;
} else if (*ch == '\'' || *ch == '"') {
// Skip quoted character literal
@@ -448,7 +449,7 @@ bool IONAME(InputNamelist)(Cookie cookie, const NamelistGroup &group) {
// Read the group's items
while (true) {
next = io.GetNextNonBlank(byteCount);
- if (!next || *next == '/') {
+ if (!next || *next == '/' || *next == '&') {
break;
}
if (!GetLowerCaseName(io, name, sizeof name)) {
@@ -540,12 +541,15 @@ bool IONAME(InputNamelist)(Cookie cookie, const NamelistGroup &group) {
io.HandleRelativePosition(byteCount);
}
}
- if (!next || *next != '/') {
+ if (next && *next == '/') {
+ io.HandleRelativePosition(byteCount);
+ } else if (*next && *next == '&') {
+ // stop at beginning of next group
+ } else {
handler.SignalError(
"No '/' found after NAMELIST group '%s'", group.groupName);
return false;
}
- io.HandleRelativePosition(byteCount);
return true;
}
@@ -565,7 +569,7 @@ bool IsNamelistNameOrSlash(IoStatementState &io) {
// TODO: how to deal with NaN(...) ambiguity?
return ch && (*ch == '=' || *ch == '(' || *ch == '%');
} else {
- return *ch == '/';
+ return *ch == '/' || *ch == '&';
}
}
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/76476
More information about the flang-commits
mailing list