aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Semantics/expression.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang/lib/Semantics/expression.cpp')
-rw-r--r--flang/lib/Semantics/expression.cpp23
1 files changed, 14 insertions, 9 deletions
diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp
index 3f048ab..8365001 100644
--- a/flang/lib/Semantics/expression.cpp
+++ b/flang/lib/Semantics/expression.cpp
@@ -3644,19 +3644,24 @@ std::optional<characteristics::Procedure> ExpressionAnalyzer::CheckCall(
Say(callSite,
"Assumed-length character function must be defined with a length to be called"_err_en_US);
}
+ if (!chars->IsPure()) {
+ if (const semantics::Scope *pure{semantics::FindPureProcedureContaining(
+ context_.FindScope(callSite))}) {
+ std::string name;
+ if (procSymbol) {
+ name = "'"s + procSymbol->name().ToString() + "'";
+ } else if (const auto *intrinsic{proc.GetSpecificIntrinsic()}) {
+ name = "'"s + intrinsic->name + "'";
+ }
+ Say(callSite,
+ "Procedure %s referenced in pure subprogram '%s' must be pure too"_err_en_US,
+ name, DEREF(pure->symbol()).name());
+ }
+ }
ok &= semantics::CheckArguments(*chars, arguments, context_,
context_.FindScope(callSite), treatExternalAsImplicit,
/*ignoreImplicitVsExplicit=*/false, specificIntrinsic);
}
- if (procSymbol && !IsPureProcedure(*procSymbol)) {
- if (const semantics::Scope *
- pure{semantics::FindPureProcedureContaining(
- context_.FindScope(callSite))}) {
- Say(callSite,
- "Procedure '%s' referenced in pure subprogram '%s' must be pure too"_err_en_US,
- procSymbol->name(), DEREF(pure->symbol()).name());
- }
- }
if (ok && !treatExternalAsImplicit && procSymbol &&
!(chars && chars->HasExplicitInterface())) {
if (const Symbol *global{FindGlobal(*procSymbol)};