diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/OverloadConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/OverloadConflictResolver.kt index b8a051ef445..c4743c323a6 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/OverloadConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/OverloadConflictResolver.kt @@ -59,7 +59,7 @@ class ConeOverloadConflictResolver( return FlatSignature( call, constructor.typeParameters.map { it.symbol }, - constructor.valueParameters.map { it.returnTypeRef.coneTypeUnsafe() }, + call.argumentMapping!!.map { it.value.returnTypeRef.coneTypeUnsafe() }, //constructor.receiverTypeRef != null, false, constructor.valueParameters.any { it.isVararg }, diff --git a/compiler/fir/resolve/testData/resolve/expresssions/factoryFunctionOverloads.kt b/compiler/fir/resolve/testData/resolve/expresssions/factoryFunctionOverloads.kt new file mode 100644 index 00000000000..7a155e1149e --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/factoryFunctionOverloads.kt @@ -0,0 +1,17 @@ +interface B +interface C { + val b: B +} + +fun A(b: B?, flag: Boolean = true) = A(b!!, flag) + +fun A(c: C, flag: Boolean = true) = A(c.b, flag) + +class A(val b: B, val flag: Boolean = true) + + +fun foo(c: C, b: B, bn: B?) { + val x = A(c) + val y = A(b) + val z = A(bn) +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/expresssions/factoryFunctionOverloads.txt b/compiler/fir/resolve/testData/resolve/expresssions/factoryFunctionOverloads.txt new file mode 100644 index 00000000000..38aa92c8779 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/factoryFunctionOverloads.txt @@ -0,0 +1,39 @@ +FILE: factoryFunctionOverloads.kt + public abstract interface B : R|kotlin/Any| { + } + public abstract interface C : R|kotlin/Any| { + public abstract val b: R|B| + public get(): R|B| + + } + public final fun A(b: R|B|?, flag: R|kotlin/Boolean| = Boolean(true)): R|A| { + ^A R|/A.A|(when (lval : R|B|? = R|/b|) { + ==($subj$, Null(null)) -> { + throw #() + } + else -> { + R|/| + } + } + , R|/flag|) + } + public final fun A(c: R|C|, flag: R|kotlin/Boolean| = Boolean(true)): R|A| { + ^A R|/A.A|(R|/c|.R|/C.b|, R|/flag|) + } + public final class A : R|kotlin/Any| { + public constructor(b: R|B|, flag: R|kotlin/Boolean| = Boolean(true)): R|A| { + super() + } + + public final val b: R|B| = R|/b| + public get(): R|B| + + public final val flag: R|kotlin/Boolean| = R|/flag| + public get(): R|kotlin/Boolean| + + } + public final fun foo(c: R|C|, b: R|B|, bn: R|B|?): R|kotlin/Unit| { + lval x: R|A| = R|/A|(R|/c|) + lval y: R|A| = R|/A.A|(R|/b|) + lval z: R|A| = R|/A.A|(R|/bn|) + } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java index 787740ac2aa..a107bd121f8 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java @@ -217,6 +217,11 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase { runTest("compiler/fir/resolve/testData/resolve/expresssions/dispatchReceiver.kt"); } + @TestMetadata("factoryFunctionOverloads.kt") + public void testFactoryFunctionOverloads() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/expresssions/factoryFunctionOverloads.kt"); + } + @TestMetadata("lambda.kt") public void testLambda() throws Exception { runTest("compiler/fir/resolve/testData/resolve/expresssions/lambda.kt");