diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BranchingExpressionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BranchingExpressionGenerator.kt index 0bcc7018255..9c2185cb17e 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BranchingExpressionGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BranchingExpressionGenerator.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.classifierOrNull import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.endOffset +import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments import org.jetbrains.kotlin.psi2ir.deparenthesize import org.jetbrains.kotlin.psi2ir.intermediate.defaultLoad @@ -45,7 +46,8 @@ class BranchingExpressionGenerator(statementGenerator: StatementGenerator) : Sta whenBranches@ while (true) { val irCondition = ktLastIf.condition!!.genExpr() - val irThenBranch = ktLastIf.then!!.genExpr() + + val irThenBranch = ktLastIf.then?.genExpr() ?: generateEmptyBlockForMissingBranch(ktLastIf) irBranches.add(IrBranchImpl(irCondition, irThenBranch)) val ktElse = ktLastIf.`else`?.deparenthesize() @@ -63,6 +65,9 @@ class BranchingExpressionGenerator(statementGenerator: StatementGenerator) : Sta return createIrWhen(expression, irBranches, irElseBranch, resultType) } + private fun generateEmptyBlockForMissingBranch(ktLastIf: KtIfExpression) = + IrBlockImpl(ktLastIf.startOffset, ktLastIf.endOffset, context.irBuiltIns.nothingType, IrStatementOrigin.IF, listOf()) + private fun createIrWhen( ktIf: KtIfExpression, irBranches: List, diff --git a/compiler/testData/ir/irText/expressions/kt27933.kt b/compiler/testData/ir/irText/expressions/kt27933.kt new file mode 100644 index 00000000000..1b6d5eea305 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/kt27933.kt @@ -0,0 +1,7 @@ +fun box(): String { + var r = "" + if (r != "") else r += "O" + if (r == "O") r += "K" else; + return r +} + diff --git a/compiler/testData/ir/irText/expressions/kt27933.txt b/compiler/testData/ir/irText/expressions/kt27933.txt new file mode 100644 index 00000000000..98650028f37 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/kt27933.txt @@ -0,0 +1,29 @@ +FILE fqName: fileName:/kt27933.kt + FUN name:box visibility:public modality:FINAL <> () returnType:kotlin.String flags: + BLOCK_BODY + VAR name:r type:kotlin.String flags:var + CONST String type=kotlin.String value="" + WHEN type=kotlin.Unit origin=null + BRANCH + if: CALL 'NOT(Boolean): Boolean' type=kotlin.Boolean origin=EXCLEQ + arg0: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EXCLEQ + arg0: GET_VAR 'r: String' type=kotlin.String origin=null + arg1: CONST String type=kotlin.String value="" + then: BLOCK type=kotlin.Nothing origin=IF + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: SET_VAR 'r: String' type=kotlin.Unit origin=PLUSEQ + CALL 'plus(Any?): String' type=kotlin.String origin=PLUSEQ + $this: GET_VAR 'r: String' type=kotlin.String origin=PLUSEQ + other: CONST String type=kotlin.String value="O" + WHEN type=kotlin.Unit origin=null + BRANCH + if: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'r: String' type=kotlin.String origin=null + arg1: CONST String type=kotlin.String value="O" + then: SET_VAR 'r: String' type=kotlin.Unit origin=PLUSEQ + CALL 'plus(Any?): String' type=kotlin.String origin=PLUSEQ + $this: GET_VAR 'r: String' type=kotlin.String origin=PLUSEQ + other: CONST String type=kotlin.String value="K" + RETURN type=kotlin.Nothing from='box(): String' + GET_VAR 'r: String' type=kotlin.String origin=null diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index 8bbcecca3f7..aca606da7c2 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -947,6 +947,11 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { runTest("compiler/testData/ir/irText/expressions/kt23030.kt"); } + @TestMetadata("kt27933.kt") + public void testKt27933() throws Exception { + runTest("compiler/testData/ir/irText/expressions/kt27933.kt"); + } + @TestMetadata("kt28006.kt") public void testKt28006() throws Exception { runTest("compiler/testData/ir/irText/expressions/kt28006.kt");