From f730edf029f63bea1334e9c5711027b960ff2505 Mon Sep 17 00:00:00 2001 From: Zelentsov Dmitry Date: Fri, 16 May 2025 16:54:57 +0300 Subject: [PATCH] Fix signature selection for function parameters Signed-off-by: Zelentsov Dmitry --- ets2panda/checker/ets/function.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ets2panda/checker/ets/function.cpp b/ets2panda/checker/ets/function.cpp index ea662ffd3..f6de95a95 100644 --- a/ets2panda/checker/ets/function.cpp +++ b/ets2panda/checker/ets/function.cpp @@ -890,21 +890,20 @@ Signature *ETSChecker::FindMostSpecificSignature(const ArenaVector return result; } -static Type *GetParatmeterTypeOrRestAtIdx(checker::ETSChecker *checker, Signature *sig, const size_t idx) +static Type *GetParameterTypeOrRestAtIdx(checker::ETSChecker *checker, Signature *sig, const size_t idx) { return idx < sig->ArgCount() ? sig->Params().at(idx)->TsType() : checker->GetElementTypeOfArray(sig->RestVar()->TsType()); } static void InitMostSpecificType(TypeRelation *relation, const ArenaVector &signatures, - [[maybe_unused]] Type *&mostSpecificType, [[maybe_unused]] Signature *&prevSig, - const size_t idx) + Type *&mostSpecificType, Signature *&prevSig, const size_t idx) { // Attempt to choose the widest type of available ones SavedTypeRelationFlagsContext ctx {relation, TypeRelationFlag::WIDENING | TypeRelationFlag::ONLY_CHECK_WIDENING}; auto checker = relation->GetChecker()->AsETSChecker(); for (auto *sig : signatures) { - Type *sigType = GetParatmeterTypeOrRestAtIdx(checker, sig, idx); + Type *sigType = GetParameterTypeOrRestAtIdx(checker, sig, idx); relation->Result(false); if (sigType->IsETSObjectType()) { @@ -944,7 +943,7 @@ void ETSChecker::SearchAmongMostSpecificTypes(Type *&mostSpecificType, Signature bool lookForClassType) { auto [pos, idx, sig] = info; - Type *sigType = GetParatmeterTypeOrRestAtIdx(this, sig, idx); + Type *sigType = GetParameterTypeOrRestAtIdx(this, sig, idx); if (prevSig->Function()->Params()[idx]->IsETSParameterExpression()) { Relation()->SetNode(prevSig->Function()->Params()[idx]->AsETSParameterExpression()); } @@ -1076,8 +1075,9 @@ ArenaMultiMap ETSChecker::GetSuitableSignaturesForParameter } for (auto *sig : signatures) { - Type *sigType = GetParatmeterTypeOrRestAtIdx(this, sig, i); - if (Relation()->IsIdenticalTo(sigType, mostSpecificType)) { + Type *sigType = GetParameterTypeOrRestAtIdx(this, sig, i); + if (Relation()->IsIdenticalTo(sigType, mostSpecificType) || + (sigType->IsETSFunctionType() && Relation()->IsSupertypeOf(sigType, mostSpecificType))) { bestSignaturesForParameter.insert({i, sig}); } } -- Gitee