diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp --- a/flang/lib/Semantics/expression.cpp +++ b/flang/lib/Semantics/expression.cpp @@ -2704,10 +2704,22 @@ actuals_.emplace_back(std::move(*expr)); return; } - const Symbol *symbol{GetFirstSymbol(*expr)}; - context_.Say(x.GetSource(), - "Assignment to constant '%s' is not allowed"_err_en_US, - symbol ? symbol->name() : x.GetSource()); + const Symbol *symbol{GetLastSymbol(*expr)}; + if (!symbol) { + context_.SayAt(x, "Assignment to constant '%s' is not allowed"_err_en_US, + x.GetSource()); + } else if (auto *subp{symbol->detailsIf()}) { + auto *msg{context_.SayAt(x, + "Assignment to subprogram '%s' is not allowed"_err_en_US, + symbol->name())}; + if (subp->isFunction()) { + const auto &result{subp->result().name()}; + msg->Attach(result, "Function result is '%s'"_err_en_US, result); + } + } else { + context_.SayAt(x, "Assignment to constant '%s' is not allowed"_err_en_US, + symbol->name()); + } } fatalErrors_ = true; } diff --git a/flang/test/Semantics/assign04.f90 b/flang/test/Semantics/assign04.f90 --- a/flang/test/Semantics/assign04.f90 +++ b/flang/test/Semantics/assign04.f90 @@ -115,3 +115,13 @@ integer :: a(10), v(10) a(v(:)) = 1 ! vector subscript is ok end + +subroutine s8 + !ERROR: Assignment to subprogram 's8' is not allowed + s8 = 1.0 +end + +real function f9() result(r) + !ERROR: Assignment to subprogram 'f9' is not allowed + f9 = 1.0 +end