diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 06d99a93af8..f1ef1d6e5e8 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1045,7 +1045,9 @@ public class ExpressionCodegen extends JetVisitor implem @Override public StackValue visitBlockExpression(JetBlockExpression expression, StackValue receiver) { List statements = expression.getStatements(); - return generateBlock(statements); + JetType unitType = KotlinBuiltIns.getInstance().getUnitType(); + boolean lastStatementIsExpression = !unitType.equals(bindingContext.get(EXPRESSION_TYPE, expression)); + return generateBlock(statements, lastStatementIsExpression); } @Override @@ -1069,7 +1071,7 @@ public class ExpressionCodegen extends JetVisitor implem //noinspection ConstantConditions if (bindingContext.get(BindingContext.BLOCK, expression)) { //noinspection ConstantConditions - return generateBlock(expression.getFunctionLiteral().getBodyExpression().getStatements()); + return gen(expression.getFunctionLiteral().getBodyExpression()); } else { return genClosure(expression); @@ -1165,7 +1167,7 @@ public class ExpressionCodegen extends JetVisitor implem } } - private StackValue generateBlock(List statements) { + private StackValue generateBlock(List statements, boolean lastStatementIsExpression) { final Label blockEnd = new Label(); List> leaveTasks = Lists.newArrayList(); @@ -1197,9 +1199,9 @@ public class ExpressionCodegen extends JetVisitor implem generateLocalFunctionDeclaration((JetNamedFunction) statement, leaveTasks); } - boolean isStatement = iterator.hasNext() || !isInsideNonUnitFunction(); + boolean isExpression = !iterator.hasNext() && lastStatementIsExpression; - StackValue result = isStatement ? genStatement(statement) : gen(statement); + StackValue result = isExpression ? gen(statement) : genStatement(statement); if (!iterator.hasNext()) { answer = result; @@ -1218,12 +1220,6 @@ public class ExpressionCodegen extends JetVisitor implem return answer; } - private boolean isInsideNonUnitFunction() { - DeclarationDescriptor descriptor = context.getContextDescriptor(); - JetType unit = KotlinBuiltIns.getInstance().getUnitType(); - return descriptor instanceof CallableDescriptor && !unit.equals(((CallableDescriptor) descriptor).getReturnType()); - } - private void generateLocalVariableDeclaration( @NotNull JetVariableDeclaration variableDeclaration, final @NotNull Label blockEnd, diff --git a/compiler/testData/codegen/regressions/kt3203_1.kt b/compiler/testData/codegen/regressions/kt3203_1.kt new file mode 100644 index 00000000000..a1b72471df1 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt3203_1.kt @@ -0,0 +1,19 @@ +fun testIf() { + val condition = true + val result = if (condition) { + val hello: String? = "hello" + if (hello == null) { + false + } + else { + true + } + } + else true + if (!result) throw AssertionError("result is false") +} + +fun box(): String { + testIf() + return "OK" +} diff --git a/compiler/testData/codegen/regressions/kt3203_2.kt b/compiler/testData/codegen/regressions/kt3203_2.kt new file mode 100644 index 00000000000..bde4cc3fe77 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt3203_2.kt @@ -0,0 +1,20 @@ +fun check1() { + val result = if (true) { + if (true) 1 else 2 + } + else 3 + if (result != 1) throw AssertionError("result: $result") +} + +fun check2() { + val result = if (true) + if (true) 1 else 2 + else 3 + if (result != 1) throw AssertionError("result: $result") +} + +fun box(): String { + check1() + check2() + return "OK" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java index e0b98c9ef23..bd3b57c0981 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java @@ -476,4 +476,14 @@ public class ControlStructuresTest extends CodegenTestCase { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); blackBoxFile("regressions/kt3087.kt"); } + + public void testKt3203_1() { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxFile("regressions/kt3203_1.kt"); + } + + public void testKt3203_2() { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxFile("regressions/kt3203_2.kt"); + } }