From 5c2753b5d141f754f37f510b341f986fb3ead9c8 Mon Sep 17 00:00:00 2001 From: pyos Date: Mon, 31 May 2021 10:46:12 +0200 Subject: [PATCH] JVM_IR: use substituted return type in function reference invoke #KT-46982 Fixed --- .../runners/codegen/FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../kotlin/backend/jvm/lower/FunctionReferenceLowering.kt | 5 +++-- .../codegen/box/callableReference/arrayConstructor.kt | 6 ++++++ .../test/runners/codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../runners/codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../kotlin/codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java | 5 +++++ .../js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java | 5 +++++ .../test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java | 5 +++++ 10 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/box/callableReference/arrayConstructor.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 5df7260822f..0650db96c25 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 @@ -2446,6 +2446,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/callableReference"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("arrayConstructor.kt") + public void testArrayConstructor() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/arrayConstructor.kt"); + } + @Test @TestMetadata("arrayConstructorArgument.kt") public void testArrayConstructorArgument() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt index 925e5f2d0cd..4c955f9e53a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt @@ -383,6 +383,7 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext) // The type of the reference is KFunction private val parameterTypes = (irFunctionReference.type as IrSimpleType).arguments.map { (it as IrTypeProjection).type } private val argumentTypes = parameterTypes.dropLast(1) + private val referenceReturnType = parameterTypes.last() private val typeArgumentsMap = irFunctionReference.typeSubstitutionMap @@ -671,7 +672,7 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext) functionReferenceClass.addFunction { setSourceRange(if (isLambda) callee else irFunctionReference) name = superMethod.name - returnType = callee.returnType + returnType = referenceReturnType isSuspend = callee.isSuspend }.apply { overriddenSymbols += superMethod.symbol @@ -703,7 +704,7 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext) body = context.createJvmIrBuilder(symbol, startOffset, endOffset).run { var unboundIndex = 0 - val call = irCall(callee).apply { + val call = irCall(callee.symbol, referenceReturnType).apply { for (typeParameter in irFunctionReference.symbol.owner.allTypeParameters) { putTypeArgument(typeParameter.index, typeArgumentsMap[typeParameter.symbol]) } diff --git a/compiler/testData/codegen/box/callableReference/arrayConstructor.kt b/compiler/testData/codegen/box/callableReference/arrayConstructor.kt new file mode 100644 index 00000000000..23318619b93 --- /dev/null +++ b/compiler/testData/codegen/box/callableReference/arrayConstructor.kt @@ -0,0 +1,6 @@ +// WITH_RUNTIME +// IGNORE_BACKEND: JS_IR +fun g(b: (Int, (Int) -> String) -> Array): Array = + b(1) { "OK" } + +fun box(): String = g(::Array)[0] 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 218f61b9359..e2ac8f51110 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 @@ -2446,6 +2446,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/callableReference"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true); } + @Test + @TestMetadata("arrayConstructor.kt") + public void testArrayConstructor() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/arrayConstructor.kt"); + } + @Test @TestMetadata("arrayConstructorArgument.kt") public void testArrayConstructorArgument() 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 07a491e2ed6..b5b2c8a1062 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 @@ -2446,6 +2446,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/callableReference"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("arrayConstructor.kt") + public void testArrayConstructor() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/arrayConstructor.kt"); + } + @Test @TestMetadata("arrayConstructorArgument.kt") public void testArrayConstructorArgument() 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 02d48518766..5844454bafd 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -2170,6 +2170,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/callableReference"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true); } + @TestMetadata("arrayConstructor.kt") + public void testArrayConstructor() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/arrayConstructor.kt"); + } + @TestMetadata("arrayConstructorArgument.kt") public void testArrayConstructorArgument() throws Exception { runTest("compiler/testData/codegen/box/callableReference/arrayConstructorArgument.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 87334cb35ea..f3bbad2ba51 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 @@ -1460,6 +1460,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/callableReference"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR_ES6, true); } + @TestMetadata("arrayConstructor.kt") + public void testArrayConstructor() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/arrayConstructor.kt"); + } + @TestMetadata("arrayConstructorArgument.kt") public void testArrayConstructorArgument() throws Exception { runTest("compiler/testData/codegen/box/callableReference/arrayConstructorArgument.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 810b9786e83..2ce38035cab 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 @@ -1460,6 +1460,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/callableReference"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true); } + @TestMetadata("arrayConstructor.kt") + public void testArrayConstructor() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/arrayConstructor.kt"); + } + @TestMetadata("arrayConstructorArgument.kt") public void testArrayConstructorArgument() throws Exception { runTest("compiler/testData/codegen/box/callableReference/arrayConstructorArgument.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 05bf8a71d32..feb2bd587a6 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 @@ -1460,6 +1460,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/callableReference"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS, true); } + @TestMetadata("arrayConstructor.kt") + public void testArrayConstructor() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/arrayConstructor.kt"); + } + @TestMetadata("arrayConstructorArgument.kt") public void testArrayConstructorArgument() throws Exception { runTest("compiler/testData/codegen/box/callableReference/arrayConstructorArgument.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 437f3a2a683..11436ee02e0 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 @@ -1270,6 +1270,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/callableReference"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true); } + @TestMetadata("arrayConstructor.kt") + public void testArrayConstructor() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/arrayConstructor.kt"); + } + @TestMetadata("arrayOf.kt") public void testArrayOf() throws Exception { runTest("compiler/testData/codegen/box/callableReference/arrayOf.kt");