From b8a929cb2f0ba3199823552269fe151682154703 Mon Sep 17 00:00:00 2001 From: Peter Klausler Date: Fri, 15 Apr 2022 20:59:13 -0700 Subject: [PATCH] [flang] Fix regression with recent work on intrinsic/generic interactions When resolving a procedure reference, do not allow a successful intrinsic procedure probe result to override an existing symbol. Differential Revision: https://reviews.llvm.org/D123905 --- flang/lib/Evaluate/intrinsics.cpp | 2 +- flang/lib/Semantics/expression.cpp | 31 +++++++++++++++---------------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp index d751c74..63a7f4e3 100644 --- a/flang/lib/Evaluate/intrinsics.cpp +++ b/flang/lib/Evaluate/intrinsics.cpp @@ -2414,7 +2414,7 @@ std::optional IntrinsicProcTable::Implementation::Probe( "Cannot use intrinsic function '%s' as a subroutine"_err_en_US, call.name); } - return std::nullopt; // TODO + return std::nullopt; } // Helper to avoid emitting errors before it is sure there is no match diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp index 41c2492..146e4d1 100644 --- a/flang/lib/Semantics/expression.cpp +++ b/flang/lib/Semantics/expression.cpp @@ -2186,24 +2186,23 @@ auto ExpressionAnalyzer::GetCalleeAndArguments(const parser::Name &name, } if (!resolution) { // Not generic, or no resolution; may be intrinsic - if (!symbol->attrs().test(semantics::Attr::EXTERNAL)) { - if (std::optional specificCall{context_.intrinsics().Probe( - CallCharacteristics{ultimate.name().ToString(), isSubroutine}, - arguments, GetFoldingContext())}) { - CheckBadExplicitType(*specificCall, *symbol); - return CalleeAndArguments{ - ProcedureDesignator{std::move(specificCall->specificIntrinsic)}, - std::move(specificCall->arguments)}; - } else if (symbol->attrs().test(semantics::Attr::INTRINSIC)) { - return std::nullopt; + bool isIntrinsic{symbol->attrs().test(semantics::Attr::INTRINSIC)}; + if (!isIntrinsic && !isGenericInterface) { + resolution = symbol; + } else if (std::optional specificCall{ + context_.intrinsics().Probe( + CallCharacteristics{ + ultimate.name().ToString(), isSubroutine}, + arguments, GetFoldingContext())}) { + CheckBadExplicitType(*specificCall, *symbol); + return CalleeAndArguments{ + ProcedureDesignator{std::move(specificCall->specificIntrinsic)}, + std::move(specificCall->arguments)}; + } else { + if (isGenericInterface) { + EmitGenericResolutionError(*symbol, dueToNullActual); } - } - if (isGenericInterface) { - EmitGenericResolutionError(*symbol, dueToNullActual); return std::nullopt; - } else { - // Neither a generic interface nor an intrinsic - resolution = symbol; } } if (resolution->GetUltimate().has()) { -- 2.7.4