diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index b13674573fe07..7ffc8eacaca6f 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(x.t).v}; auto &symbol{HandleAttributeStmt(Attr::PARAMETER, name)}; - if (!ConvertToObjectEntity(symbol) || - symbol.test(Symbol::Flag::CrayPointer) || + ConvertToObjectEntity(symbol); + auto *details{symbol.detailsIf()}; + 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(x.t)}; - auto &details{symbol.get()}; - 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 32bf9091a8565..2a1f584ffaf08 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