From 608b88996afb59c6e52a435c1aeb0a822e85cd8c Mon Sep 17 00:00:00 2001 From: Mads Ager Date: Mon, 9 Aug 2021 16:01:20 +0200 Subject: [PATCH] [JVM_IR] Fix inlining of callable references to extension methods. Check directly that the referenced function is an extension function instead of relying on the annotation on the type. ^ KT-47988 Fixed. --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../backend/jvm/codegen/IrInlineCodegen.kt | 5 ++--- .../codegen/box/callableReference/kt47988.kt | 17 +++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../IrJsCodegenBoxES6TestGenerated.java | 5 +++++ .../semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++++ .../IrCodegenBoxWasmTestGenerated.java | 5 +++++ 10 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/box/callableReference/kt47988.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 792ce30f6ac..63619edb647 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -2718,6 +2718,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/callableReference/kt46902.kt"); } + @Test + @TestMetadata("kt47988.kt") + public void testKt47988() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt47988.kt"); + } + @Test @TestMetadata("nested.kt") public void testNested() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt index 883ef53f631..702f6ee6172 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt @@ -56,7 +56,7 @@ class IrInlineCodegen( val isInlineParameter = irValueParameter.isInlineParameter() if (isInlineParameter && argumentExpression.isInlineIrExpression()) { val irReference = (argumentExpression as IrBlock).statements.filterIsInstance().single() - val lambdaInfo = IrExpressionLambdaImpl(codegen, irReference, irValueParameter) + val lambdaInfo = IrExpressionLambdaImpl(codegen, irReference) rememberClosure(parameterType, irValueParameter.index, lambdaInfo) lambdaInfo.generateLambdaBody(sourceCompiler) lambdaInfo.reference.getArgumentsWithIr().forEachIndexed { index, (_, ir) -> @@ -117,9 +117,8 @@ class IrInlineCodegen( class IrExpressionLambdaImpl( codegen: ExpressionCodegen, val reference: IrFunctionReference, - irValueParameter: IrValueParameter ) : ExpressionLambda(), IrExpressionLambda { - override val isExtensionLambda: Boolean = irValueParameter.type.isExtensionFunctionType && reference.extensionReceiver == null + override val isExtensionLambda: Boolean = function.extensionReceiverParameter != null && reference.extensionReceiver == null val function: IrFunction get() = reference.symbol.owner diff --git a/compiler/testData/codegen/box/callableReference/kt47988.kt b/compiler/testData/codegen/box/callableReference/kt47988.kt new file mode 100644 index 00000000000..ae69976464e --- /dev/null +++ b/compiler/testData/codegen/box/callableReference/kt47988.kt @@ -0,0 +1,17 @@ +class A(var x: String) + +fun f(s: String): String { + fun A.localX() { + x = s + "K" + } + + val a: A = A("FAIL") + a.apply(A::localX) + if (a.x != "OK") return a.x + a.apply { localX() } + return a.x +} + +fun box(): String { + return f("O") +} 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 f6e30e4d28f..6c63d0e1da8 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 @@ -2628,6 +2628,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/callableReference/kt46902.kt"); } + @Test + @TestMetadata("kt47988.kt") + public void testKt47988() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt47988.kt"); + } + @Test @TestMetadata("nested.kt") public void testNested() 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 f9265971ce2..1d6bdb3ae02 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 @@ -2718,6 +2718,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/callableReference/kt46902.kt"); } + @Test + @TestMetadata("kt47988.kt") + public void testKt47988() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt47988.kt"); + } + @Test @TestMetadata("nested.kt") public void testNested() 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 2a2e55ae8e4..9d7b8fb78f7 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -2311,6 +2311,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/callableReference/kt46902.kt"); } + @TestMetadata("kt47988.kt") + public void testKt47988() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt47988.kt"); + } + @TestMetadata("nested.kt") public void testNested() throws Exception { runTest("compiler/testData/codegen/box/callableReference/nested.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 85e31fcc64e..fac73c8d67b 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -1571,6 +1571,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/callableReference/kt46902.kt"); } + @TestMetadata("kt47988.kt") + public void testKt47988() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt47988.kt"); + } + @TestMetadata("nested.kt") public void testNested() throws Exception { runTest("compiler/testData/codegen/box/callableReference/nested.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index d65e6f169b2..d03c2b67a21 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -1571,6 +1571,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/callableReference/kt46902.kt"); } + @TestMetadata("kt47988.kt") + public void testKt47988() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt47988.kt"); + } + @TestMetadata("nested.kt") public void testNested() throws Exception { runTest("compiler/testData/codegen/box/callableReference/nested.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 00614d353b8..6352440e8b8 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -1571,6 +1571,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/callableReference/kt46902.kt"); } + @TestMetadata("kt47988.kt") + public void testKt47988() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt47988.kt"); + } + @TestMetadata("nested.kt") public void testNested() throws Exception { runTest("compiler/testData/codegen/box/callableReference/nested.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 5ed2def2af1..e74b2a51654 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -1346,6 +1346,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/callableReference/kt46902.kt"); } + @TestMetadata("kt47988.kt") + public void testKt47988() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/kt47988.kt"); + } + @TestMetadata("nested.kt") public void testNested() throws Exception { runTest("compiler/testData/codegen/box/callableReference/nested.kt");