From 65ff684589cb377a817c90ef9d4299b9afb45182 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Thu, 21 Sep 2023 16:29:29 +0200 Subject: [PATCH] [FIR] Don't discriminate generics in conflict resolution for callable references #KT-59430 Fixed --- .../fir/resolve/calls/ConeOverloadConflictResolver.kt | 9 ++++++++- .../diagnostics/tests/callableReference/kt49038.fir.kt | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadConflictResolver.kt index a9c5dc61d56..8360f7ae75d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadConflictResolver.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.getSingleExpectForActualOrNull import org.jetbrains.kotlin.fir.declarations.utils.isActual import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.declarations.utils.modality +import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.inference.ConeTypeParameterBasedTypeVariable import org.jetbrains.kotlin.fir.resolve.inference.InferenceComponents @@ -53,7 +54,13 @@ class ConeOverloadConflictResolver( override fun chooseMaximallySpecificCandidates( candidates: Set, discriminateAbstracts: Boolean, - ): Set = chooseMaximallySpecificCandidates(candidates, discriminateAbstracts, discriminateGenerics = true) + ): Set = chooseMaximallySpecificCandidates( + candidates, + discriminateAbstracts, + // We don't discriminate against generics for callable references because, other than in regular calls, + // there is no syntax for specifying generic type arguments. + discriminateGenerics = candidates.first().callInfo.callSite !is FirCallableReferenceAccess + ) /** * Partial mirror of [org.jetbrains.kotlin.resolve.calls.results.OverloadingConflictResolver.chooseMaximallySpecificCandidates] diff --git a/compiler/testData/diagnostics/tests/callableReference/kt49038.fir.kt b/compiler/testData/diagnostics/tests/callableReference/kt49038.fir.kt index 86f7f10ca61..5a13499e5a7 100644 --- a/compiler/testData/diagnostics/tests/callableReference/kt49038.fir.kt +++ b/compiler/testData/diagnostics/tests/callableReference/kt49038.fir.kt @@ -8,6 +8,6 @@ class A class B fun box(): String { - val ref1 = take(::foo) // error before 1.6.20; ok, resolved to (3) since 1.6.20 + val ref1 = take(::foo) // error before 1.6.20; ok, resolved to (3) since 1.6.20 return "OK" }