[flang-commits] [flang] [flang] A nested STRUCTURE must declare entities (PR #99379)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Wed Jul 17 12:32:05 PDT 2024
https://github.com/klausler created https://github.com/llvm/llvm-project/pull/99379
When a DEC legacy STRUCTURE definition appears within another, its STRUCTURE statement must also declare some components of the enclosing structure.
Fixes https://github.com/llvm/llvm-project/issues/99288.
>From 45b869e5c4a37a01f74aa2b457907a32104197c9 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Wed, 17 Jul 2024 12:28:18 -0700
Subject: [PATCH] [flang] A nested STRUCTURE must declare entities
When a DEC legacy STRUCTURE definition appears within another,
its STRUCTURE statement must also declare some components of
the enclosing structure.
Fixes https://github.com/llvm/llvm-project/issues/99288.
---
flang/lib/Parser/Fortran-parsers.cpp | 16 ++++++++++++----
flang/test/Semantics/struct03.f90 | 7 +++++++
2 files changed, 19 insertions(+), 4 deletions(-)
create mode 100644 flang/test/Semantics/struct03.f90
diff --git a/flang/lib/Parser/Fortran-parsers.cpp b/flang/lib/Parser/Fortran-parsers.cpp
index 746d04ad649d1..0bdc4c4e033c7 100644
--- a/flang/lib/Parser/Fortran-parsers.cpp
+++ b/flang/lib/Parser/Fortran-parsers.cpp
@@ -1304,10 +1304,16 @@ TYPE_PARSER(extension<LanguageFeature::CUDA>(construct<CUDAAttributesStmt>(
defaulted(
maybe("::"_tok) >> nonemptyList("expected names"_err_en_US, name)))))
-// Subtle: the name includes the surrounding slashes, which avoids
+// Subtle: A structure's name includes the surrounding slashes, which avoids
// clashes with other uses of the name in the same scope.
-TYPE_PARSER(construct<StructureStmt>(
- "STRUCTURE" >> maybe(sourced("/" >> name / "/")), optionalList(entityDecl)))
+constexpr auto structureName{maybe(sourced("/" >> name / "/"))};
+
+// Note that Parser<StructureStmt>{} has a mandatory list of entity-decls
+// and is used only by NestedStructureStmt{}.Parse() in user-state.cpp.
+TYPE_PARSER(construct<StructureStmt>("STRUCTURE" >> structureName,
+ localRecovery(
+ "entity declarations are required on a nested structure"_err_en_US,
+ nonemptyList(entityDecl), ok)))
constexpr auto nestedStructureDef{
CONTEXT_PARSER("nested STRUCTURE definition"_en_US,
@@ -1323,7 +1329,9 @@ TYPE_PARSER(construct<StructureField>(statement(StructureComponents{})) ||
TYPE_CONTEXT_PARSER("STRUCTURE definition"_en_US,
extension<LanguageFeature::DECStructures>(
"nonstandard usage: STRUCTURE"_port_en_US,
- construct<StructureDef>(statement(Parser<StructureStmt>{}),
+ construct<StructureDef>(
+ statement(construct<StructureStmt>(
+ "STRUCTURE" >> structureName, optionalList(entityDecl))),
many(Parser<StructureField>{}),
statement(construct<StructureDef::EndStructureStmt>(
"END STRUCTURE"_tok)))))
diff --git a/flang/test/Semantics/struct03.f90 b/flang/test/Semantics/struct03.f90
new file mode 100644
index 0000000000000..a334cca8945fc
--- /dev/null
+++ b/flang/test/Semantics/struct03.f90
@@ -0,0 +1,7 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+ structure /s/
+ !ERROR: entity declarations are required on a nested structure
+ structure /nested/
+ end structure
+ end structure
+end
More information about the flang-commits
mailing list