aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Semantics/assignment.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang/lib/Semantics/assignment.cpp')
-rw-r--r--flang/lib/Semantics/assignment.cpp13
1 files changed, 8 insertions, 5 deletions
diff --git a/flang/lib/Semantics/assignment.cpp b/flang/lib/Semantics/assignment.cpp
index e69a73c..0b57197 100644
--- a/flang/lib/Semantics/assignment.cpp
+++ b/flang/lib/Semantics/assignment.cpp
@@ -66,8 +66,13 @@ void AssignmentContext::Analyze(const parser::AssignmentStmt &stmt) {
const SomeExpr &rhs{assignment->rhs};
auto lhsLoc{std::get<parser::Variable>(stmt.t).GetSource()};
const Scope &scope{context_.FindScope(lhsLoc)};
- if (auto whyNot{WhyNotDefinable(lhsLoc, scope,
- DefinabilityFlags{DefinabilityFlag::VectorSubscriptIsOk}, lhs)}) {
+ DefinabilityFlags flags{DefinabilityFlag::VectorSubscriptIsOk};
+ bool isDefinedAssignment{
+ std::holds_alternative<evaluate::ProcedureRef>(assignment->u)};
+ if (isDefinedAssignment) {
+ flags.set(DefinabilityFlag::AllowEventLockOrNotifyType);
+ }
+ if (auto whyNot{WhyNotDefinable(lhsLoc, scope, flags, lhs)}) {
if (whyNot->IsFatal()) {
if (auto *msg{Say(lhsLoc,
"Left-hand side of assignment is not definable"_err_en_US)}) {
@@ -79,9 +84,7 @@ void AssignmentContext::Analyze(const parser::AssignmentStmt &stmt) {
}
}
auto rhsLoc{std::get<parser::Expr>(stmt.t).source};
- if (std::holds_alternative<evaluate::ProcedureRef>(assignment->u)) {
- // it's a defined ASSIGNMENT(=)
- } else {
+ if (!isDefinedAssignment) {
CheckForPureContext(rhs, rhsLoc);
}
if (whereDepth_ > 0) {