diff --git a/ets2panda/checker/ets/function.cpp b/ets2panda/checker/ets/function.cpp index ea662ffd3ce8f7aca7cd71cc72832eded137ec70..f6de95a95e38d74507a234db7358e39cac359c58 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}); } }