From 663eb21990648bc317e9bb92424fdb8821d97058 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 21 Sep 2016 12:33:37 +0300 Subject: [PATCH] Coerce loop body to Unit. --- .../transformations/InsertImplicitCasts.kt | 2 + .../ir/irText/regressions/coercionInLoop.kt | 10 +++++ .../ir/irText/regressions/coercionInLoop.txt | 37 +++++++++++++++++++ .../kotlin/ir/IrTextTestCaseGenerated.java | 15 ++++++++ 4 files changed, 64 insertions(+) create mode 100644 compiler/testData/ir/irText/regressions/coercionInLoop.kt create mode 100644 compiler/testData/ir/irText/regressions/coercionInLoop.txt diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt index a130a4f1dbc..3baa9dbae59 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt @@ -145,6 +145,8 @@ class InsertImplicitCasts(val builtIns: KotlinBuiltIns): IrElementTransformerVoi loop.condition = loop.condition.cast(builtIns.booleanType) + loop.body = loop.body?.coerceToUnit(builtIns.unitType) + return loop } diff --git a/compiler/testData/ir/irText/regressions/coercionInLoop.kt b/compiler/testData/ir/irText/regressions/coercionInLoop.kt new file mode 100644 index 00000000000..fa0e0c006f8 --- /dev/null +++ b/compiler/testData/ir/irText/regressions/coercionInLoop.kt @@ -0,0 +1,10 @@ +fun box(): String { + val a = DoubleArray(5) + val x = a.iterator() + var i = 0 + while (x.hasNext()) { + if (a[i] != x.next()) return "Fail $i" + i++ + } + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/ir/irText/regressions/coercionInLoop.txt b/compiler/testData/ir/irText/regressions/coercionInLoop.txt new file mode 100644 index 00000000000..6b8c21a332c --- /dev/null +++ b/compiler/testData/ir/irText/regressions/coercionInLoop.txt @@ -0,0 +1,37 @@ +FILE /coercionInLoop.kt + FUN public fun box(): kotlin.String + BLOCK_BODY + VAR val a: kotlin.DoubleArray + CALL 'constructor DoubleArray(Int)' type=kotlin.DoubleArray origin=null + size: CONST Int type=kotlin.Int value='5' + VAR val x: kotlin.collections.DoubleIterator + CALL 'iterator(): DoubleIterator' type=kotlin.collections.DoubleIterator origin=null + $this: GET_VAR 'a: DoubleArray' type=kotlin.DoubleArray origin=null + VAR var i: kotlin.Int + CONST Int type=kotlin.Int value='0' + WHILE label=null origin=WHILE_LOOP + condition: CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=null + $this: GET_VAR 'x: DoubleIterator' type=kotlin.collections.DoubleIterator origin=null + body: TYPE_OP origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + BLOCK type=kotlin.Int origin=null + WHEN type=kotlin.Unit origin=IF + if: CALL 'NOT(Boolean): Boolean' type=kotlin.Boolean origin=EXCLEQ + arg0: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EXCLEQ + arg0: CALL 'get(Int): Double' type=kotlin.Double origin=GET_ARRAY_ELEMENT + $this: GET_VAR 'a: DoubleArray' type=kotlin.DoubleArray origin=null + index: GET_VAR 'i: Int' type=kotlin.Int origin=null + arg1: CALL 'next(): Double' type=kotlin.Double origin=null + $this: GET_VAR 'x: DoubleIterator' type=kotlin.collections.DoubleIterator origin=null + then: RETURN type=kotlin.Nothing from='box(): String' + STRING_CONCATENATION type=kotlin.String + CONST String type=kotlin.String value='Fail ' + GET_VAR 'i: Int' type=kotlin.Int origin=null + BLOCK type=kotlin.Int origin=POSTFIX_INCR + VAR IR_TEMPORARY_VARIABLE val tmp0: kotlin.Int + GET_VAR 'i: Int' type=kotlin.Int origin=POSTFIX_INCR + SET_VAR 'i: Int' type=kotlin.Unit origin=POSTFIX_INCR + CALL 'inc(): Int' type=kotlin.Int origin=POSTFIX_INCR + $this: GET_VAR 'tmp0: Int' type=kotlin.Int origin=null + GET_VAR 'tmp0: Int' type=kotlin.Int origin=null + RETURN type=kotlin.Nothing from='box(): String' + CONST String type=kotlin.String value='OK' diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index 15f35169576..2353efc3814 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -715,4 +715,19 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { doTest(fileName); } } + + @TestMetadata("compiler/testData/ir/irText/regressions") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Regressions extends AbstractIrTextTestCase { + public void testAllFilesPresentInRegressions() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/ir/irText/regressions"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("coercionInLoop.kt") + public void testCoercionInLoop() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/regressions/coercionInLoop.kt"); + doTest(fileName); + } + } }