[flang-commits] [flang] eebe9a3 - [flang][CUDA] Fix crash in name resolution for CUDA function (#108616)
via flang-commits
flang-commits at lists.llvm.org
Mon Sep 16 13:45:09 PDT 2024
Author: Peter Klausler
Date: 2024-09-16T13:45:06-07:00
New Revision: eebe9a3fca39e0d0e464993f41e63aa41c308da7
URL: https://github.com/llvm/llvm-project/commit/eebe9a3fca39e0d0e464993f41e63aa41c308da7
DIFF: https://github.com/llvm/llvm-project/commit/eebe9a3fca39e0d0e464993f41e63aa41c308da7.diff
LOG: [flang][CUDA] Fix crash in name resolution for CUDA function (#108616)
When a function result type appears on a FUNCTION statement after some
CUDA attributes, there wasn't always valid program source location
information attached to the function result variable information stack.
Ensure that some relevant source information is always available.
Added:
Modified:
flang/lib/Semantics/resolve-names.cpp
Removed:
################################################################################
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index d8f601212d8d01..b99f308e1c7fab 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -474,15 +474,15 @@ class FuncResultStack {
~FuncResultStack();
struct FuncInfo {
- explicit FuncInfo(const Scope &s) : scope{s} {}
+ FuncInfo(const Scope &s, SourceName at) : scope{s}, source{at} {}
const Scope &scope;
+ SourceName source;
// Parse tree of the type specification in the FUNCTION prefix
const parser::DeclarationTypeSpec *parsedType{nullptr};
// Name of the function RESULT in the FUNCTION suffix, if any
const parser::Name *resultName{nullptr};
// Result symbol
Symbol *resultSymbol{nullptr};
- std::optional<SourceName> source;
bool inFunctionStmt{false}; // true between Pre/Post of FunctionStmt
};
@@ -492,7 +492,9 @@ class FuncResultStack {
void CompleteTypeIfFunctionResult(Symbol &);
FuncInfo *Top() { return stack_.empty() ? nullptr : &stack_.back(); }
- FuncInfo &Push(const Scope &scope) { return stack_.emplace_back(scope); }
+ FuncInfo &Push(const Scope &scope, SourceName at) {
+ return stack_.emplace_back(scope, at);
+ }
void Pop();
private:
@@ -3799,11 +3801,13 @@ bool SubprogramVisitor::Pre(const parser::PrefixSpec &x) {
if (const auto *parsedType{std::get_if<parser::DeclarationTypeSpec>(&x.u)}) {
if (FuncResultStack::FuncInfo * info{funcResultStack().Top()}) {
if (info->parsedType) { // C1543
- Say(currStmtSource().value(),
+ Say(currStmtSource().value_or(info->source),
"FUNCTION prefix cannot specify the type more than once"_err_en_US);
} else {
info->parsedType = parsedType;
- info->source = currStmtSource();
+ if (auto at{currStmtSource()}) {
+ info->source = *at;
+ }
}
} else {
Say(currStmtSource().value(),
@@ -3978,6 +3982,9 @@ bool SubprogramVisitor::Pre(const parser::FunctionStmt &) {
FuncResultStack::FuncInfo &info{DEREF(funcResultStack().Top())};
CHECK(!info.inFunctionStmt);
info.inFunctionStmt = true;
+ if (auto at{currStmtSource()}) {
+ info.source = *at;
+ }
return BeginAttrs();
}
bool SubprogramVisitor::Pre(const parser::EntryStmt &) { return BeginAttrs(); }
@@ -4507,7 +4514,7 @@ Symbol &SubprogramVisitor::PushSubprogramScope(const parser::Name &name,
symbol->set(subpFlag);
PushScope(Scope::Kind::Subprogram, symbol);
if (subpFlag == Symbol::Flag::Function) {
- funcResultStack().Push(currScope());
+ funcResultStack().Push(currScope(), name.source);
}
if (inInterfaceBlock()) {
auto &details{symbol->get<SubprogramDetails>()};
More information about the flang-commits
mailing list