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 6970bc7c773..12d0052ebf9 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 @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.psi2ir.generators +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.whenComma import org.jetbrains.kotlin.ir.declarations.IrVariable @@ -85,12 +86,17 @@ class BranchingExpressionGenerator(statementGenerator: StatementGenerator) : Sta scope.createTemporaryVariable(statementGenerator.generateExpression(it), "subject") } + + val inferredType = getInferredTypeWithImplicitCastsOrFail(expression) + // TODO relies on ControlFlowInformationProvider, get rid of it - val resultType = - if (context.bindingContext[BindingContext.USED_AS_EXPRESSION, expression] ?: false) - getInferredTypeWithImplicitCastsOrFail(expression) - else - context.builtIns.unitType + val isUsedAsExpression = context.bindingContext[BindingContext.USED_AS_EXPRESSION, expression] ?: false + + val resultType = when { + isUsedAsExpression -> inferredType + KotlinBuiltIns.isNothing(inferredType) -> inferredType + else -> context.builtIns.unitType + } val irWhen = IrWhenImpl(expression.startOffset, expression.endOffset, resultType, IrStatementOrigin.WHEN) diff --git a/compiler/testData/ir/irCfg/when/whenReturn.txt b/compiler/testData/ir/irCfg/when/whenReturn.txt index 445747384d5..078317f60fc 100644 --- a/compiler/testData/ir/irCfg/when/whenReturn.txt +++ b/compiler/testData/ir/irCfg/when/whenReturn.txt @@ -5,7 +5,7 @@ CONTENT 1 FUN public fun toString(grade: kotlin.String): kotlin.String 2 GET_VAR 'value-parameter grade: String' type=kotlin.String origin=null 3 VAR IR_TEMPORARY_VARIABLE val tmp0_subject: kotlin.String - 4 WHEN type=kotlin.Unit origin=WHEN + 4 WHEN type=kotlin.Nothing origin=WHEN 5 GET_VAR 'tmp0_subject: String' type=kotlin.String origin=null 6 CONST String type=kotlin.String value='A' OUTGOING -> BB 1, 5 diff --git a/compiler/testData/ir/irText/expressions/whenReturn.txt b/compiler/testData/ir/irText/expressions/whenReturn.txt index bfd715abca8..c53df485f78 100644 --- a/compiler/testData/ir/irText/expressions/whenReturn.txt +++ b/compiler/testData/ir/irText/expressions/whenReturn.txt @@ -2,10 +2,10 @@ FILE /whenReturn.kt FUN public fun toString(grade: kotlin.String): kotlin.String VALUE_PARAMETER value-parameter grade: kotlin.String BLOCK_BODY - BLOCK type=kotlin.Unit origin=WHEN + BLOCK type=kotlin.Nothing origin=WHEN VAR IR_TEMPORARY_VARIABLE val tmp0_subject: kotlin.String GET_VAR 'value-parameter grade: String' type=kotlin.String origin=null - WHEN type=kotlin.Unit origin=WHEN + WHEN type=kotlin.Nothing origin=WHEN BRANCH if: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EQEQ arg0: GET_VAR 'tmp0_subject: String' type=kotlin.String origin=null