forked from OSchip/llvm-project
[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:
parent
ba01306009
commit
b8a929cb2f
|
@ -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
|
||||
|
|
|
@ -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>()) {
|
||||
|
|
Loading…
Reference in New Issue