diff options
author | Peter Klausler <35819229+klausler@users.noreply.github.com> | 2024-03-01 15:10:47 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-01 15:10:47 -0800 |
commit | 8f80d466d580d0fb97383eac8a2d7d9a1e3f15f4 (patch) | |
tree | 64385beabe039971d5d3cc4db7941c7a751051d4 | |
parent | bcc6ca7ff86518caa97c6f20735a4728e18caa78 (diff) |
[flang] Fix crash in statement function semantics (bug #80532) (#82702)
When statement function expressions are analyzed, ensure that the
semantics context has a valid location set, otherwise a type spec (like
"integer::") can lead to a crash.
Fixes https://github.com/llvm/llvm-project/issues/80532.
-rw-r--r-- | flang/lib/Semantics/expression.cpp | 3 | ||||
-rw-r--r-- | flang/lib/Semantics/resolve-names.cpp | 1 |
2 files changed, 3 insertions, 1 deletions
diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp index 8d817f077880..b957f773816b 100644 --- a/flang/lib/Semantics/expression.cpp +++ b/flang/lib/Semantics/expression.cpp @@ -4613,8 +4613,9 @@ evaluate::Expr<evaluate::SubscriptInteger> AnalyzeKindSelector( SemanticsContext &context, common::TypeCategory category, const std::optional<parser::KindSelector> &selector) { evaluate::ExpressionAnalyzer analyzer{context}; + CHECK(context.location().has_value()); auto restorer{ - analyzer.GetContextualMessages().SetLocation(context.location().value())}; + analyzer.GetContextualMessages().SetLocation(*context.location())}; return analyzer.AnalyzeKindSelector(category, selector); } diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 7f9909ee937d..eb61a76f1087 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -8475,6 +8475,7 @@ void ResolveNamesVisitor::FinishSpecificationPart( if (const auto *statement{std::get_if< parser::Statement<common::Indirection<parser::StmtFunctionStmt>>>( &decl.u)}) { + messageHandler().set_currStmtSource(statement->source); AnalyzeStmtFunctionStmt(statement->statement.value()); } } |