From 0805916564bff69ad6817fc8323ae323abae6717 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 17 Dec 2021 10:50:51 +0300 Subject: [PATCH] IR KT-47483 handle 'Nothing' in array constructor call --- .../codegen/FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../common/lower/ArrayConstructorLowering.kt | 14 +++++++++----- compiler/testData/codegen/box/arrays/kt47483.kt | 3 +++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../kotlin/js/test/JsCodegenBoxTestGenerated.java | 6 ++++++ .../JsLegacyPrimitiveArraysBoxTestGenerated.java | 6 ++++++ .../js/test/ir/IrJsCodegenBoxTestGenerated.java | 6 ++++++ .../semantics/IrCodegenBoxWasmTestGenerated.java | 5 +++++ .../NativeExtBlackBoxTestGenerated.java | 6 ++++++ 11 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/codegen/box/arrays/kt47483.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 6bec77da6de..5d76896e69e 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 @@ -1083,6 +1083,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/arrays/kt45410.kt"); } + @Test + @TestMetadata("kt47483.kt") + public void testKt47483() throws Exception { + runTest("compiler/testData/codegen/box/arrays/kt47483.kt"); + } + @Test @TestMetadata("kt47499.kt") public void testKt47499() throws Exception { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ArrayConstructorLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ArrayConstructorLowering.kt index 0fecc886317..43217a215b8 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ArrayConstructorLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ArrayConstructorLowering.kt @@ -19,10 +19,7 @@ import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol -import org.jetbrains.kotlin.ir.types.IrSimpleType -import org.jetbrains.kotlin.ir.types.IrTypeProjection -import org.jetbrains.kotlin.ir.types.classifierOrFail -import org.jetbrains.kotlin.ir.types.getClass +import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.constructedClass import org.jetbrains.kotlin.ir.util.constructors import org.jetbrains.kotlin.ir.util.functions @@ -69,6 +66,10 @@ private class ArrayConstructorTransformer( // (and similar for primitive arrays) val size = expression.getValueArgument(0)!!.transform(this, null) val invokable = expression.getValueArgument(1)!!.transform(this, null) + if (invokable.type.isNothing()) { + // Expressions of type 'Nothing' don't terminate. + return invokable + } val scope = (currentScope ?: createScope(container)).scope return context.createIrBuilder(scope.scopeOwnerSymbol).irBlock(expression.startOffset, expression.endOffset) { val index = createTmpVariable(irInt(0), isMutable = true) @@ -89,7 +90,10 @@ private class ArrayConstructorTransformer( +irCall(result.type.getClass()!!.functions.single { it.name == OperatorNameConventions.SET }).apply { dispatchReceiver = irGet(result) putValueArgument(0, irGet(tempIndex)) - putValueArgument(1, generator.inline(parent, listOf(tempIndex)).patchDeclarationParents(scope.getLocalDeclarationParent())) + val inlined = generator + .inline(parent, listOf(tempIndex)) + .patchDeclarationParents(scope.getLocalDeclarationParent()) + putValueArgument(1, inlined) } val inc = index.type.getClass()!!.functions.single { it.name == OperatorNameConventions.INC } +irSet(index.symbol, irCallOp(inc.symbol, index.type, irGet(index))) diff --git a/compiler/testData/codegen/box/arrays/kt47483.kt b/compiler/testData/codegen/box/arrays/kt47483.kt new file mode 100644 index 00000000000..0e596058da0 --- /dev/null +++ b/compiler/testData/codegen/box/arrays/kt47483.kt @@ -0,0 +1,3 @@ +fun box(): String { + val test: Array = Array(42, return "OK") +} 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 b7de4ef51eb..54db22ceeb0 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 @@ -1005,6 +1005,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/arrays/kt45410.kt"); } + @Test + @TestMetadata("kt47483.kt") + public void testKt47483() throws Exception { + runTest("compiler/testData/codegen/box/arrays/kt47483.kt"); + } + @Test @TestMetadata("kt47499.kt") public void testKt47499() 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 c9b9b4021ee..5877ea4e3a6 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 @@ -1083,6 +1083,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/arrays/kt45410.kt"); } + @Test + @TestMetadata("kt47483.kt") + public void testKt47483() throws Exception { + runTest("compiler/testData/codegen/box/arrays/kt47483.kt"); + } + @Test @TestMetadata("kt47499.kt") public void testKt47499() 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 97ccfe290a9..5e999c344be 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -884,6 +884,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/arrays/kt45410.kt"); } + @TestMetadata("kt47483.kt") + public void testKt47483() throws Exception { + runTest("compiler/testData/codegen/box/arrays/kt47483.kt"); + } + @TestMetadata("kt47499.kt") public void testKt47499() throws Exception { runTest("compiler/testData/codegen/box/arrays/kt47499.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 8f7711f8d71..c3087060335 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 @@ -537,6 +537,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/arrays/kt4357.kt"); } + @Test + @TestMetadata("kt47483.kt") + public void testKt47483() throws Exception { + runTest("compiler/testData/codegen/box/arrays/kt47483.kt"); + } + @Test @TestMetadata("kt503.kt") public void testKt503() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsLegacyPrimitiveArraysBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsLegacyPrimitiveArraysBoxTestGenerated.java index 02605dce8a3..21847024d69 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsLegacyPrimitiveArraysBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsLegacyPrimitiveArraysBoxTestGenerated.java @@ -319,6 +319,12 @@ public class JsLegacyPrimitiveArraysBoxTestGenerated extends AbstractJsLegacyPri runTest("compiler/testData/codegen/box/arrays/kt4357.kt"); } + @Test + @TestMetadata("kt47483.kt") + public void testKt47483() throws Exception { + runTest("compiler/testData/codegen/box/arrays/kt47483.kt"); + } + @Test @TestMetadata("kt503.kt") public void testKt503() 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 aec3a981746..32184f576c7 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 @@ -579,6 +579,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/arrays/kt4357.kt"); } + @Test + @TestMetadata("kt47483.kt") + public void testKt47483() throws Exception { + runTest("compiler/testData/codegen/box/arrays/kt47483.kt"); + } + @Test @TestMetadata("kt503.kt") public void testKt503() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 2d8cf0467c5..fefcf597ec2 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -529,6 +529,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/arrays/kt4357.kt"); } + @TestMetadata("kt47483.kt") + public void testKt47483() throws Exception { + runTest("compiler/testData/codegen/box/arrays/kt47483.kt"); + } + @TestMetadata("kt503.kt") public void testKt503() throws Exception { runTest("compiler/testData/codegen/box/arrays/kt503.kt"); diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java index 9088066ac8b..fd7a4afbf3e 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java @@ -598,6 +598,12 @@ public class NativeExtBlackBoxTestGenerated extends AbstractNativeBlackBoxTest { runTest("compiler/testData/codegen/box/arrays/kt4357.kt"); } + @Test + @TestMetadata("kt47483.kt") + public void testKt47483() throws Exception { + runTest("compiler/testData/codegen/box/arrays/kt47483.kt"); + } + @Test @TestMetadata("kt503.kt") public void testKt503() throws Exception {