[flang-commits] [flang] [flang] Fix crash in name resolution (PR #85835)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Tue Mar 19 10:55:33 PDT 2024
https://github.com/klausler created https://github.com/llvm/llvm-project/pull/85835
ConvertToObjectEntity() returns true for use- and host-associated object symbols, too. Ensure in this case that the symbol really is a non-associated object.
Fixes https://github.com/llvm/llvm-project/issues/85776.
>From fabb61942f31a7b3bdc8f361cef7d630aa3ee67c Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Tue, 19 Mar 2024 10:53:01 -0700
Subject: [PATCH] [flang] Fix crash in name resolution
ConvertToObjectEntity() returns true for use- and host-associated
object symbols, too. Ensure in this case that the symbol
really is a non-associated object.
Fixes https://github.com/llvm/llvm-project/issues/85776.
---
flang/lib/Semantics/resolve-names.cpp | 18 +++++++++---------
flang/test/Semantics/resolve61.f90 | 9 +++++++++
2 files changed, 18 insertions(+), 9 deletions(-)
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index b13674573fe07e..7ffc8eacaca6f4 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -4646,23 +4646,23 @@ bool DeclarationVisitor::Pre(const parser::OldParameterStmt &x) {
bool DeclarationVisitor::Pre(const parser::NamedConstantDef &x) {
auto &name{std::get<parser::NamedConstant>(x.t).v};
auto &symbol{HandleAttributeStmt(Attr::PARAMETER, name)};
- if (!ConvertToObjectEntity(symbol) ||
- symbol.test(Symbol::Flag::CrayPointer) ||
+ ConvertToObjectEntity(symbol);
+ auto *details{symbol.detailsIf<ObjectEntityDetails>()};
+ if (!details || symbol.test(Symbol::Flag::CrayPointer) ||
symbol.test(Symbol::Flag::CrayPointee)) {
SayWithDecl(
name, symbol, "PARAMETER attribute not allowed on '%s'"_err_en_US);
return false;
}
const auto &expr{std::get<parser::ConstantExpr>(x.t)};
- auto &details{symbol.get<ObjectEntityDetails>()};
- if (details.init() || symbol.test(Symbol::Flag::InDataStmt)) {
+ if (details->init() || symbol.test(Symbol::Flag::InDataStmt)) {
Say(name, "Named constant '%s' already has a value"_err_en_US);
}
if (inOldStyleParameterStmt_) {
// non-standard extension PARAMETER statement (no parentheses)
Walk(expr);
auto folded{EvaluateExpr(expr)};
- if (details.type()) {
+ if (details->type()) {
SayWithDecl(name, symbol,
"Alternative style PARAMETER '%s' must not already have an explicit type"_err_en_US);
} else if (folded) {
@@ -4674,9 +4674,9 @@ bool DeclarationVisitor::Pre(const parser::NamedConstantDef &x) {
} else if (auto shape{ToArraySpec(
GetFoldingContext(), evaluate::GetShape(*folded))}) {
// The type of the named constant is assumed from the expression.
- details.set_type(*type);
- details.set_init(std::move(*folded));
- details.set_shape(std::move(*shape));
+ details->set_type(*type);
+ details->set_init(std::move(*folded));
+ details->set_shape(std::move(*shape));
} else {
Say(at, "The expression must have constant shape"_err_en_US);
}
@@ -4693,7 +4693,7 @@ bool DeclarationVisitor::Pre(const parser::NamedConstantDef &x) {
Walk(expr);
if (auto converted{EvaluateNonPointerInitializer(
symbol, expr, expr.thing.value().source)}) {
- details.set_init(std::move(*converted));
+ details->set_init(std::move(*converted));
}
}
return false;
diff --git a/flang/test/Semantics/resolve61.f90 b/flang/test/Semantics/resolve61.f90
index 32bf9091a85651..2a1f584ffaf089 100644
--- a/flang/test/Semantics/resolve61.f90
+++ b/flang/test/Semantics/resolve61.f90
@@ -126,3 +126,12 @@ subroutine s
pointer(ip, x) ! ok, local declaration
end
end
+
+subroutine p14
+ real :: r
+ block
+ asynchronous :: r
+ !ERROR: PARAMETER attribute not allowed on 'r'
+ parameter (r = 1.0)
+ end block
+end
More information about the flang-commits
mailing list