[flang-commits] [flang] [flang][runtime] Extension: NAMELIST input may omit terminal '/' (PR #76476)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Wed Dec 27 15:52:03 PST 2023
https://github.com/klausler created https://github.com/llvm/llvm-project/pull/76476
... when it is followed eventually by the '&' that begins the next NAMELIST input group. This is a gfortran extension.
>From c74afd81ac2fd368071ec47c59e0522d65bbe06c Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Wed, 27 Dec 2023 15:49:18 -0800
Subject: [PATCH] [flang][runtime] Extension: NAMELIST input may omit terminal
'/'
... when it is followed eventually by the '&' that begins the next
NAMELIST input group. This is a gfortran extension.
---
flang/docs/Extensions.md | 2 ++
flang/runtime/namelist.cpp | 16 ++++++++++------
2 files changed, 12 insertions(+), 6 deletions(-)
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 == '&';
}
}
}
More information about the flang-commits
mailing list