[flang-commits] [PATCH] D128760: [flang] Better error recovery for bad submodules
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Tue Jun 28 14:29:33 PDT 2022
klausler created this revision.
klausler added a reviewer: jeanPerier.
klausler added a project: Flang.
Herald added a subscriber: jdoerfert.
Herald added a project: All.
klausler requested review of this revision.
When a submodule appears in a source file and the compiler can't find the
named ancestor module (and submodule, if one appears), crashes may occur
later due to the absence of a scope. For better resilience, a dummy
ancestral scope should be generated within which the submodule scope
can be created.
https://reviews.llvm.org/D128760
Files:
flang/lib/Semantics/resolve-names.cpp
Index: flang/lib/Semantics/resolve-names.cpp
===================================================================
--- flang/lib/Semantics/resolve-names.cpp
+++ flang/lib/Semantics/resolve-names.cpp
@@ -2938,21 +2938,29 @@
bool ModuleVisitor::BeginSubmodule(
const parser::Name &name, const parser::ParentIdentifier &parentId) {
- auto &ancestorName{std::get<parser::Name>(parentId.t)};
- auto &parentName{std::get<std::optional<parser::Name>>(parentId.t)};
+ const auto &ancestorName{std::get<parser::Name>(parentId.t)};
+ Scope *parentScope{nullptr};
Scope *ancestor{FindModule(ancestorName, false /*not intrinsic*/)};
- if (!ancestor) {
- return false;
+ if (ancestor) {
+ if (const auto &parentName{
+ std::get<std::optional<parser::Name>>(parentId.t)}) {
+ parentScope = FindModule(*parentName, false /*not intrinsic*/, ancestor);
+ } else {
+ parentScope = ancestor;
+ }
}
- Scope *parentScope{parentName
- ? FindModule(*parentName, false /*not intrinsic*/, ancestor)
- : ancestor};
- if (!parentScope) {
- return false;
+ if (parentScope) {
+ PushScope(*parentScope);
+ } else {
+ // Error recovery: there's no ancestor scope, so create a dummy one to
+ // hold the submodule's scope.
+ SourceName dummyName{context().GetTempName(currScope())};
+ Symbol &dummySymbol{MakeSymbol(dummyName, Attrs{}, ModuleDetails{false})};
+ PushScope(Scope::Kind::Module, &dummySymbol);
+ parentScope = &currScope();
}
- PushScope(*parentScope); // submodule is hosted in parent
BeginModule(name, true);
- if (!ancestor->AddSubmodule(name.source, currScope())) {
+ if (ancestor && !ancestor->AddSubmodule(name.source, currScope())) {
Say(name, "Module '%s' already has a submodule named '%s'"_err_en_US,
ancestorName.source, name.source);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D128760.440770.patch
Type: text/x-patch
Size: 1854 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20220628/6ba5bb2e/attachment.bin>
More information about the flang-commits
mailing list