diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt index 07a1329307f..b6f53e60ce9 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt @@ -6,10 +6,7 @@ package org.jetbrains.kotlin.fir.resolve.calls.jvm import org.jetbrains.kotlin.fir.containingClassLookupTag -import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration -import org.jetbrains.kotlin.fir.declarations.FirConstructor -import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction -import org.jetbrains.kotlin.fir.declarations.FirVariable +import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.calls.AbstractConeCallConflictResolver @@ -71,12 +68,22 @@ class ConeEquivalentCallConflictResolver( if (first is FirVariable != second is FirVariable) { return false } + if (!firstCandidate.orderOfMappedArguments.contentEquals(secondCandidate.orderOfMappedArguments)) { + return false + } val firstSignature = createFlatSignature(firstCandidate, first) val secondSignature = createFlatSignature(secondCandidate, second) return compareCallsByUsedArguments(firstSignature, secondSignature, discriminateGenerics = false, useOriginalSamTypes = false) && compareCallsByUsedArguments(secondSignature, firstSignature, discriminateGenerics = false, useOriginalSamTypes = false) } + private val Candidate.orderOfMappedArguments: IntArray? + get() { + val function = symbol.fir as? FirFunction ?: return null + val parametersToIndices = function.valueParameters.mapIndexed { index, it -> it to index }.toMap() + return argumentMapping?.map { parametersToIndices[it.value] ?: error("Unmapped argument in arguments mapping") }?.toIntArray() + } + private fun createFlatSignature(call: Candidate, declaration: FirCallableDeclaration): FlatSignature { return when (declaration) { is FirSimpleFunction -> createFlatSignature(call, declaration) diff --git a/compiler/testData/diagnostics/tests/ambiguityNamedVararg.fir.kt b/compiler/testData/diagnostics/tests/ambiguityNamedVararg.fir.kt deleted file mode 100644 index 4044f6fa3a6..00000000000 --- a/compiler/testData/diagnostics/tests/ambiguityNamedVararg.fir.kt +++ /dev/null @@ -1,12 +0,0 @@ -// DIAGNOSTICS: -DEBUG_INFO_MISSING_UNRESOLVED -// ISSUE: KT-55933 - -fun swapVararg(vararg namedVararg: String, named: Int){} -fun swapVararg(named: Int, vararg namedVararg: String){} - -val x = swapVararg(named = 42, namedVararg = arrayOf("1", "2"),) - -fun swap(string: String, int: Int){} -fun swap(int: Int, string: String){} - -val y = swap(int = 42, string = "2") diff --git a/compiler/testData/diagnostics/tests/ambiguityNamedVararg.kt b/compiler/testData/diagnostics/tests/ambiguityNamedVararg.kt index 045b5c48d3e..cd049140f83 100644 --- a/compiler/testData/diagnostics/tests/ambiguityNamedVararg.kt +++ b/compiler/testData/diagnostics/tests/ambiguityNamedVararg.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // DIAGNOSTICS: -DEBUG_INFO_MISSING_UNRESOLVED // ISSUE: KT-55933 diff --git a/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsMixed.fir.kt b/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsMixed.fir.kt index e72dd034e0c..bbd1b14884b 100644 --- a/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsMixed.fir.kt +++ b/compiler/testData/diagnostics/tests/resolve/overloadConflicts/varargsMixed.fir.kt @@ -8,6 +8,6 @@ fun overloadedFun5(vararg ss: String) = X1 fun overloadedFun5(s: String, vararg ss: String) = X2 val test1 = overloadedFun5("") -val test2 = overloadedFun5("", "") +val test2 = overloadedFun5("", "") val test3: X2 = overloadedFun5(s = "", ss = "") val test4: X1 = overloadedFun5(ss = "")