[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
This commit is contained in:
Peter Klausler 2022-04-15 20:59:13 -07:00
parent ba01306009
commit b8a929cb2f
2 changed files with 17 additions and 18 deletions

View File

@ -2414,7 +2414,7 @@ std::optional<SpecificCall> 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

View File

@ -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> 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;
}
}
if (isGenericInterface) {
EmitGenericResolutionError(*symbol, dueToNullActual);
return std::nullopt;
} else {
// Neither a generic interface nor an intrinsic
bool isIntrinsic{symbol->attrs().test(semantics::Attr::INTRINSIC)};
if (!isIntrinsic && !isGenericInterface) {
resolution = symbol;
} else if (std::optional<SpecificCall> 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);
}
return std::nullopt;
}
}
if (resolution->GetUltimate().has<semantics::DerivedTypeDetails>()) {