diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java index 72360b8b838..7425493651c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java @@ -18,6 +18,7 @@ public interface JetControlFlowBuilder { Label createUnboundLabel(); void bindLabel(@NotNull Label label); + void allowDead(); // Jumps void jump(@NotNull Label label); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java index af961793212..df5470480f4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java @@ -37,6 +37,12 @@ public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder { builder.bindLabel(label); } + @Override + public void allowDead() { + assert builder != null; + builder.allowDead(); + } + @Override public void jump(@NotNull Label label) { assert builder != null; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index b65c0db05c5..bc30b50af1e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -5,18 +5,19 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.BindingTrace; -import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.types.JetStandardClasses; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.expressions.OperatorConventions; import org.jetbrains.jet.lexer.JetTokens; -import java.util.*; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; import static org.jetbrains.jet.lang.diagnostics.Errors.*; @@ -356,18 +357,35 @@ public class JetControlFlowProcessor { }); } - Label onException = builder.createUnboundLabel(); - builder.nondeterministicJump(onException); + List catchClauses = expression.getCatchClauses(); + final boolean hasCatches = !catchClauses.isEmpty(); + Label onException = null; + if (hasCatches) { + onException = builder.createUnboundLabel(); + builder.nondeterministicJump(onException); + } value(expression.getTryBlock(), inCondition); - List catchClauses = expression.getCatchClauses(); - if (!catchClauses.isEmpty()) { + if (hasCatches) { + builder.allowDead(); Label afterCatches = builder.createUnboundLabel(); builder.jump(afterCatches); builder.bindLabel(onException); - for (Iterator iterator = catchClauses.iterator(); iterator.hasNext(); ) { - JetCatchClause catchClause = iterator.next(); + LinkedList