[flang-commits] [flang] [flang] Fix crash in name resolution (PR #85835)
via flang-commits
flang-commits at lists.llvm.org
Tue Mar 19 10:56:05 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-semantics
Author: Peter Klausler (klausler)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/85835.diff
2 Files Affected:
- (modified) flang/lib/Semantics/resolve-names.cpp (+9-9)
- (modified) flang/test/Semantics/resolve61.f90 (+9)
``````````diff
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
``````````
</details>
https://github.com/llvm/llvm-project/pull/85835
More information about the flang-commits
mailing list