diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java index f60d03d93da..05854faf797 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java @@ -24,7 +24,7 @@ public interface JetControlFlowBuilder { void jumpOnFalse(@NotNull Label label); void jumpOnTrue(@NotNull Label label); void nondeterministicJump(Label label); // Maybe, jump to label - void jumpToError(@NotNull JetThrowExpression expression); + void jumpToError(JetThrowExpression expression); // Entry/exit points Label getEntryPoint(@NotNull JetElement labelElement); diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java index 838843df9d9..1171c0dd984 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java @@ -58,7 +58,7 @@ public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder { } @Override - public void jumpToError(@NotNull JetThrowExpression expression) { + public void jumpToError(JetThrowExpression expression) { builder.jumpToError(expression); } diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 9e39691fa81..9b821e77295 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -619,6 +619,8 @@ public class JetControlFlowProcessor { value(subjectExpression, false, inCondition); } + Label doneLabel = builder.createUnboundLabel(); + Label nextLabel = builder.createUnboundLabel(); for (JetWhenEntry whenEntry : expression.getEntries()) { if (whenEntry.getSubWhen() != null) throw new UnsupportedOperationException(); // TODO @@ -660,9 +662,12 @@ public class JetControlFlowProcessor { builder.nondeterministicJump(nextLabel); value(whenEntry.getExpression(), true, inCondition); + builder.jump(doneLabel); builder.bindLabel(nextLabel); nextLabel = builder.createUnboundLabel(); } + builder.jumpToError(null); + builder.bindLabel(doneLabel); } @Override diff --git a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java index c892c41ed24..b78be129e7b 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java @@ -244,7 +244,7 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd } @Override - public void jumpToError(@NotNull JetThrowExpression expression) { + public void jumpToError(JetThrowExpression expression) { add(new UnconditionalJumpInstruction(error)); } diff --git a/idea/testData/checker/When.jet b/idea/testData/checker/When.jet index 3fa319c383d..7eb6e6b582f 100644 --- a/idea/testData/checker/When.jet +++ b/idea/testData/checker/When.jet @@ -15,4 +15,6 @@ fun foo() { .equals(1) => 1 ?.equals(1).equals(2) => 1 } -} \ No newline at end of file +} + +val _type_test : Int = foo() // this is needed to ensure the inferred return type of foo() \ No newline at end of file