From bcd8a28d4c77d1652ddcaaf0fdbe3524df2a2f05 Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Wed, 8 Jun 2022 15:55:11 +0200 Subject: [PATCH] KT-47823 IR.JVM Fix handling of for loop ranges with inline types and break/continue/return --- .../codegen/FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../backend/common/lower/loops/ForLoopsLowering.kt | 6 ++++++ .../testData/codegen/box/inlineClasses/kt47823.kt | 11 +++++++++++ .../runners/codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../kotlin/js/test/JsCodegenBoxTestGenerated.java | 6 ++++++ .../js/test/ir/IrJsCodegenBoxTestGenerated.java | 6 ++++++ .../wasm/semantics/IrCodegenBoxWasmTestGenerated.java | 5 +++++ .../blackboxtest/NativeCodegenBoxTestGenerated.java | 6 ++++++ 10 files changed, 63 insertions(+) create mode 100644 compiler/testData/codegen/box/inlineClasses/kt47823.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 650df974025..385885d69be 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 @@ -21683,6 +21683,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/inlineClasses/kt47762Generic.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); } + @Test + @TestMetadata("kt47823.kt") + public void testKt47823() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt47823.kt"); + } + @Test @TestMetadata("kt48993.kt") public void testKt48993() throws Exception { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ForLoopsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ForLoopsLowering.kt index 48e3a08bcdc..3e1924c9079 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ForLoopsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ForLoopsLowering.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl import org.jetbrains.kotlin.ir.types.getClass +import org.jetbrains.kotlin.ir.types.isNothing import org.jetbrains.kotlin.ir.types.isStrictSubtypeOfClass import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.* @@ -180,6 +181,11 @@ private class RangeLoopTransformer( val loopHeader = headerProcessor.extractHeader(iteratorVariable) ?: return super.visitBlock(expression.apply { specializeIteratorIfPossible(this) }) // The iterable in the header is not supported. + + if (loopHeader.loopInitStatements.any { (it as? IrVariable)?.type?.isNothing() == true }) { + return super.visitBlock(expression) + } + val loweredHeader = lowerHeader(iteratorVariable, loopHeader) val (newLoop, loopReplacementExpression) = lowerWhileLoop(oldLoop, loopHeader) diff --git a/compiler/testData/codegen/box/inlineClasses/kt47823.kt b/compiler/testData/codegen/box/inlineClasses/kt47823.kt new file mode 100644 index 00000000000..b7c6eff1dd8 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/kt47823.kt @@ -0,0 +1,11 @@ +// WITH_STDLIB + +fun box(): String { + for (i in 1 .. 2) { + for (j in 1u .. break) {} + } + for (i in 1 .. 2) { + for (j in 1u .. continue) {} + } + for (i in 1u .. 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 063048b7f5e..2bcdb11a04b 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 @@ -21203,6 +21203,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/kt47762Generic.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); } + @Test + @TestMetadata("kt47823.kt") + public void testKt47823() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt47823.kt"); + } + @Test @TestMetadata("kt48993.kt") public void testKt48993() 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 2487fdea880..f2a6fd9034a 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 @@ -21683,6 +21683,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/kt47762Generic.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); } + @Test + @TestMetadata("kt47823.kt") + public void testKt47823() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt47823.kt"); + } + @Test @TestMetadata("kt48993.kt") public void testKt48993() 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 0ae89d9e942..1a442a40b6f 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -17706,6 +17706,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/kt47762Generic.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); } + @TestMetadata("kt47823.kt") + public void testKt47823() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt47823.kt"); + } + @TestMetadata("kt48993.kt") public void testKt48993() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt48993.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); 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 ad7e285517d..f92959777f2 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 @@ -16723,6 +16723,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/kt47762Generic.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); } + @Test + @TestMetadata("kt47823.kt") + public void testKt47823() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt47823.kt"); + } + @Test @TestMetadata("kt51157.kt") public void testKt51157() 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 9be45208e5c..14a7315868b 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 @@ -16687,6 +16687,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/kt47762Generic.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); } + @Test + @TestMetadata("kt47823.kt") + public void testKt47823() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt47823.kt"); + } + @Test @TestMetadata("kt51157.kt") public void testKt51157() 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 cd749fca1b9..3df9e8fbd72 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 @@ -14776,6 +14776,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/inlineClasses/kt47762Generic.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); } + @TestMetadata("kt47823.kt") + public void testKt47823() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt47823.kt"); + } + @TestMetadata("kt51157.kt") public void testKt51157() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/kt51157.kt"); 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 3f5efe5a35b..248f9aafebc 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 @@ -18396,6 +18396,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest runTest("compiler/testData/codegen/box/inlineClasses/kt47762Generic.kt"); } + @Test + @TestMetadata("kt47823.kt") + public void testKt47823() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt47823.kt"); + } + @Test @TestMetadata("kt51157.kt") public void testKt51157() throws Exception {