[flang-commits] [PATCH] D124467: [flang] Fix crash from PDT component init in module file
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Tue Apr 26 10:18:04 PDT 2022
klausler created this revision.
klausler added a reviewer: clementval.
klausler added a project: Flang.
Herald added a subscriber: jdoerfert.
Herald added a project: All.
klausler requested review of this revision.
Semantics now needs to preserve the parse trees from module files,
in case they contain parameterized derived type definitions with
component initializers that may require re-analysis during PDT
instantiation. Save them in the SemanticsContext.
https://reviews.llvm.org/D124467
Files:
flang/include/flang/Semantics/semantics.h
flang/lib/Semantics/mod-file.cpp
flang/lib/Semantics/semantics.cpp
Index: flang/lib/Semantics/semantics.cpp
===================================================================
--- flang/lib/Semantics/semantics.cpp
+++ flang/lib/Semantics/semantics.cpp
@@ -355,6 +355,10 @@
}
}
+parser::Program &SemanticsContext::SaveParseTree(parser::Program &&tree) {
+ return modFileParseTrees_.emplace_back(std::move(tree));
+}
+
bool Semantics::Perform() {
// Implicitly USE the __Fortran_builtins module so that special types
// (e.g., __builtin_team_type) are available to semantics, esp. for
Index: flang/lib/Semantics/mod-file.cpp
===================================================================
--- flang/lib/Semantics/mod-file.cpp
+++ flang/lib/Semantics/mod-file.cpp
@@ -970,13 +970,14 @@
}
llvm::raw_null_ostream NullStream;
parsing.Parse(NullStream);
- auto &parseTree{parsing.parseTree()};
+ std::optional<parser::Program> &parsedProgram{parsing.parseTree()};
if (!parsing.messages().empty() || !parsing.consumedWholeFile() ||
- !parseTree) {
+ !parsedProgram) {
Say(name, ancestorName, "Module file is corrupt: %s"_err_en_US,
sourceFile->path());
return nullptr;
}
+ parser::Program &parseTree{context_.SaveParseTree(std::move(*parsedProgram))};
Scope *parentScope; // the scope this module/submodule goes into
if (!isIntrinsic.has_value()) {
for (const auto &dir : context_.intrinsicModuleDirectories()) {
@@ -991,7 +992,7 @@
: context_.globalScope()};
if (!ancestor) {
parentScope = &topScope;
- } else if (std::optional<SourceName> parent{GetSubmoduleParent(*parseTree)}) {
+ } else if (std::optional<SourceName> parent{GetSubmoduleParent(parseTree)}) {
parentScope = Read(*parent, false /*not intrinsic*/, ancestor, silent);
} else {
parentScope = ancestor;
@@ -1002,7 +1003,7 @@
}
Symbol &modSymbol{*pair.first->second};
modSymbol.set(Symbol::Flag::ModFile);
- ResolveNames(context_, *parseTree, topScope);
+ ResolveNames(context_, parseTree, topScope);
CHECK(modSymbol.has<ModuleDetails>());
CHECK(modSymbol.test(Symbol::Flag::ModFile));
if (isIntrinsic.value_or(false)) {
Index: flang/include/flang/Semantics/semantics.h
===================================================================
--- flang/include/flang/Semantics/semantics.h
+++ flang/include/flang/Semantics/semantics.h
@@ -195,6 +195,10 @@
void UseFortranBuiltinsModule();
const Scope *GetBuiltinsScope() const { return builtinsScope_; }
+ // Saves a module file's parse tree so that it remains available
+ // during semantics.
+ parser::Program &SaveParseTree(parser::Program &&);
+
private:
void CheckIndexVarRedefine(
const parser::CharBlock &, const Symbol &, parser::MessageFixedText &&);
@@ -226,6 +230,7 @@
UnorderedSymbolSet errorSymbols_;
std::set<std::string> tempNames_;
const Scope *builtinsScope_{nullptr}; // module __Fortran_builtins
+ std::list<parser::Program> modFileParseTrees_;
};
class Semantics {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D124467.425257.patch
Type: text/x-patch
Size: 3021 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20220426/bfff5374/attachment.bin>
More information about the flang-commits
mailing list