[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:49:21 PDT 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGf4bb211a3b16: [flang] Fix crash from PDT component init in module file (authored by klausler).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D124467/new/
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.425264.patch
Type: text/x-patch
Size: 3021 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20220426/0e4a6141/attachment-0001.bin>
More information about the flang-commits
mailing list