diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index 4b3b31a6331..9282293c39a 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -4829,6 +4829,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/casts/dontCreateInconsistentTypeDuringStarProjectionSubstitution.kt"); } + @Test + @TestMetadata("genericReturnCast.kt") + public void testGenericReturnCast() throws Exception { + runTest("compiler/testData/codegen/box/casts/genericReturnCast.kt"); + } + @Test @TestMetadata("intersectionTypeMultipleBounds.kt") public void testIntersectionTypeMultipleBounds() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index 3ef74577dbc..c701dfc5dbf 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -4829,6 +4829,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/casts/dontCreateInconsistentTypeDuringStarProjectionSubstitution.kt"); } + @Test + @TestMetadata("genericReturnCast.kt") + public void testGenericReturnCast() throws Exception { + runTest("compiler/testData/codegen/box/casts/genericReturnCast.kt"); + } + @Test @TestMetadata("intersectionTypeMultipleBounds.kt") public void testIntersectionTypeMultipleBounds() throws Exception { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt index ba92cbed21d..68f7ce85403 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt @@ -270,7 +270,7 @@ open class DefaultParameterInjector( return (0 until functionAccess.valueArgumentsCount).count { functionAccess.getValueArgument(it) != null } != functionAccess.symbol.owner.valueParameters.size } - private fun visitFunctionAccessExpression(expression: T, builder: (IrFunctionSymbol) -> T): T { + private fun visitFunctionAccessExpression(expression: T, builder: (IrFunctionSymbol) -> T): IrExpression { if (!shouldReplaceWithSyntheticFunction(expression)) return expression @@ -282,7 +282,7 @@ open class DefaultParameterInjector( val isStatic = isStatic(expression.symbol.owner) - return builder(symbol).apply { + val newCall = builder(symbol).apply { copyTypeArgumentsFrom(expression) var receivers = 0 @@ -307,6 +307,15 @@ open class DefaultParameterInjector( log { "call::extension@: ${ir2string(expression.extensionReceiver)}" } log { "call::dispatch@: ${ir2string(expression.dispatchReceiver)}" } } + + return newCall.takeIf { it.type == expression.type } ?: IrTypeOperatorCallImpl( + startOffset = newCall.startOffset, + endOffset = newCall.endOffset, + type = expression.type, + operator = IrTypeOperator.IMPLICIT_CAST, + typeOperand = expression.type, + argument = newCall + ) } override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall): IrExpression { @@ -352,8 +361,8 @@ open class DefaultParameterInjector( override fun visitCall(expression: IrCall): IrExpression { expression.transformChildrenVoid() - return visitFunctionAccessExpression(expression) { - with(expression) { + with(expression) { + return visitFunctionAccessExpression(expression) { IrCallImpl( startOffset, endOffset, (it as IrSimpleFunctionSymbol).owner.returnType, it, typeArgumentsCount = typeArgumentsCount, diff --git a/compiler/testData/codegen/box/casts/genericReturnCast.kt b/compiler/testData/codegen/box/casts/genericReturnCast.kt new file mode 100644 index 00000000000..eb2f777c4fd --- /dev/null +++ b/compiler/testData/codegen/box/casts/genericReturnCast.kt @@ -0,0 +1,17 @@ +fun someFunc(a: T, arg: T? = null): T = arg ?: a + +fun box(): String { + var key: String? = null + key = someFunc("a") + if (key != "a") return "FAIL1" + key = someFunc("a", "b") + if (key != "b") return "FAIL2" + + var key1: Int? = null + key1 = someFunc(42) + if (key1 != 42) return "FAIL3" + key1 = someFunc(42, 24) + if (key1 != 24) return "FAIL3" + + return "OK" +} \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index e39c61fe1c2..02eb1d064ae 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -4667,6 +4667,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/casts/dontCreateInconsistentTypeDuringStarProjectionSubstitution.kt"); } + @Test + @TestMetadata("genericReturnCast.kt") + public void testGenericReturnCast() throws Exception { + runTest("compiler/testData/codegen/box/casts/genericReturnCast.kt"); + } + @Test @TestMetadata("intersectionTypeMultipleBounds.kt") public void testIntersectionTypeMultipleBounds() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 23ace5fa0cb..5f4d9088d13 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -4829,6 +4829,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/casts/dontCreateInconsistentTypeDuringStarProjectionSubstitution.kt"); } + @Test + @TestMetadata("genericReturnCast.kt") + public void testGenericReturnCast() throws Exception { + runTest("compiler/testData/codegen/box/casts/genericReturnCast.kt"); + } + @Test @TestMetadata("intersectionTypeMultipleBounds.kt") public void testIntersectionTypeMultipleBounds() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index 42fba17435d..47f22fbd684 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -4829,6 +4829,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/casts/dontCreateInconsistentTypeDuringStarProjectionSubstitution.kt"); } + @Test + @TestMetadata("genericReturnCast.kt") + public void testGenericReturnCast() throws Exception { + runTest("compiler/testData/codegen/box/casts/genericReturnCast.kt"); + } + @Test @TestMetadata("intersectionTypeMultipleBounds.kt") public void testIntersectionTypeMultipleBounds() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 7996376e859..2d6e5d0ea18 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -4071,6 +4071,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/casts/dontCreateInconsistentTypeDuringStarProjectionSubstitution.kt"); } + @TestMetadata("genericReturnCast.kt") + public void testGenericReturnCast() throws Exception { + runTest("compiler/testData/codegen/box/casts/genericReturnCast.kt"); + } + @TestMetadata("intersectionTypeMultipleBounds.kt") public void testIntersectionTypeMultipleBounds() throws Exception { runTest("compiler/testData/codegen/box/casts/intersectionTypeMultipleBounds.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java index f462f406fe2..c28c4507fda 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java @@ -3389,6 +3389,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/casts/dontCreateInconsistentTypeDuringStarProjectionSubstitution.kt"); } + @Test + @TestMetadata("genericReturnCast.kt") + public void testGenericReturnCast() throws Exception { + runTest("compiler/testData/codegen/box/casts/genericReturnCast.kt"); + } + @Test @TestMetadata("intersectionTypeMultipleBounds.kt") public void testIntersectionTypeMultipleBounds() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java index 736e6f3a499..ee6f583a93d 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java @@ -3443,6 +3443,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest { runTest("compiler/testData/codegen/box/casts/dontCreateInconsistentTypeDuringStarProjectionSubstitution.kt"); } + @Test + @TestMetadata("genericReturnCast.kt") + public void testGenericReturnCast() throws Exception { + runTest("compiler/testData/codegen/box/casts/genericReturnCast.kt"); + } + @Test @TestMetadata("intersectionTypeMultipleBounds.kt") public void testIntersectionTypeMultipleBounds() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index 2eaa51c2186..78eea0a669c 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -3443,6 +3443,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/casts/dontCreateInconsistentTypeDuringStarProjectionSubstitution.kt"); } + @Test + @TestMetadata("genericReturnCast.kt") + public void testGenericReturnCast() throws Exception { + runTest("compiler/testData/codegen/box/casts/genericReturnCast.kt"); + } + @Test @TestMetadata("intersectionTypeMultipleBounds.kt") public void testIntersectionTypeMultipleBounds() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java index 2efe308ced9..d613da2d1fe 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java @@ -3443,6 +3443,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes runTest("compiler/testData/codegen/box/casts/dontCreateInconsistentTypeDuringStarProjectionSubstitution.kt"); } + @Test + @TestMetadata("genericReturnCast.kt") + public void testGenericReturnCast() throws Exception { + runTest("compiler/testData/codegen/box/casts/genericReturnCast.kt"); + } + @Test @TestMetadata("intersectionTypeMultipleBounds.kt") public void testIntersectionTypeMultipleBounds() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java index b3e9f5b0666..73ff00f712b 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java @@ -3594,6 +3594,12 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe runTest("compiler/testData/codegen/box/casts/dontCreateInconsistentTypeDuringStarProjectionSubstitution.kt"); } + @Test + @TestMetadata("genericReturnCast.kt") + public void testGenericReturnCast() throws Exception { + runTest("compiler/testData/codegen/box/casts/genericReturnCast.kt"); + } + @Test @TestMetadata("intersectionTypeMultipleBounds.kt") public void testIntersectionTypeMultipleBounds() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java index a0f53881441..2c4cae3d591 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java @@ -3555,6 +3555,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest runTest("compiler/testData/codegen/box/casts/dontCreateInconsistentTypeDuringStarProjectionSubstitution.kt"); } + @Test + @TestMetadata("genericReturnCast.kt") + public void testGenericReturnCast() throws Exception { + runTest("compiler/testData/codegen/box/casts/genericReturnCast.kt"); + } + @Test @TestMetadata("intersectionTypeMultipleBounds.kt") public void testIntersectionTypeMultipleBounds() throws Exception { diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java index daac4576478..a0b2de3f5da 100644 --- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java +++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java @@ -3036,6 +3036,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/casts/dontCreateInconsistentTypeDuringStarProjectionSubstitution.kt"); } + @TestMetadata("genericReturnCast.kt") + public void testGenericReturnCast() throws Exception { + runTest("compiler/testData/codegen/box/casts/genericReturnCast.kt"); + } + @TestMetadata("intersectionTypeMultipleBounds.kt") public void testIntersectionTypeMultipleBounds() throws Exception { runTest("compiler/testData/codegen/box/casts/intersectionTypeMultipleBounds.kt");