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 31bfcec6ce7..7870411aa85 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java @@ -10,7 +10,7 @@ import java.util.List; * @author abreslav */ public interface JetControlFlowBuilder { - void read(@NotNull JetExpression expression); + void read(@NotNull JetElement element); void readUnit(@NotNull JetExpression expression); // General label management 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 0c6ea512103..01894b01598 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java @@ -13,9 +13,9 @@ public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder { protected @Nullable JetControlFlowBuilder builder; @Override - public void read(@NotNull JetExpression expression) { + public void read(@NotNull JetElement element) { assert builder != null; - builder.read(expression); + builder.read(element); } @Override 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 d9897b438d8..12fee5b0ec3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -746,6 +746,7 @@ public class JetControlFlowProcessor { if (subjectExpression != null) { value(subjectExpression, inCondition); } + boolean hasElseOrIrrefutableBranch = false; Label doneLabel = builder.createUnboundLabel(); @@ -753,11 +754,18 @@ public class JetControlFlowProcessor { for (Iterator iterator = expression.getEntries().iterator(); iterator.hasNext(); ) { JetWhenEntry whenEntry = iterator.next(); + builder.read(whenEntry); + if (whenEntry.isElse()) { + hasElseOrIrrefutableBranch = true; if (iterator.hasNext()) { trace.report(ELSE_MISPLACED_IN_WHEN.on(whenEntry)); } } + boolean isIrrefutable = JetPsiUtil.isIrrefutable(whenEntry); + if (isIrrefutable) { + hasElseOrIrrefutableBranch = true; + } Label bodyLabel = builder.createUnboundLabel(); @@ -770,17 +778,22 @@ public class JetControlFlowProcessor { } } - builder.nondeterministicJump(nextLabel); + if (!isIrrefutable) { + builder.nondeterministicJump(nextLabel); + } builder.bindLabel(bodyLabel); value(whenEntry.getExpression(), inCondition); + builder.allowDead(); builder.jump(doneLabel); builder.bindLabel(nextLabel); nextLabel = builder.createUnboundLabel(); } - // TODO : if there's else, no error can happen - builder.jumpToError(null); builder.bindLabel(doneLabel); + if (!hasElseOrIrrefutableBranch) { + trace.report(NO_ELSE_IN_WHEN.on(expression)); + } + builder.stopAllowDead(); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java index c0284d377b5..f5b5f06dae2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java @@ -74,7 +74,7 @@ public class JetFlowInformationProvider { wrappedTrace.close(); } - private void collectReturnExpressions(@NotNull JetElement subroutine, @NotNull final Collection returnedExpressions) { + private void collectReturnExpressions(@NotNull JetElement subroutine, @NotNull final Collection returnedExpressions) { Pseudocode pseudocode = pseudocodeMap.get(subroutine); assert pseudocode != null; @@ -85,14 +85,14 @@ public class JetFlowInformationProvider { @Override public void visitReturnValue(ReturnValueInstruction instruction) { if (instructions.contains(instruction)) { //exclude non-local return expressions - returnedExpressions.add((JetExpression) instruction.getElement()); + returnedExpressions.add(instruction.getElement()); } } @Override public void visitReturnNoValue(ReturnNoValueInstruction instruction) { if (instructions.contains(instruction)) { - returnedExpressions.add((JetExpression) instruction.getElement()); + returnedExpressions.add(instruction.getElement()); } } @@ -122,7 +122,7 @@ public class JetFlowInformationProvider { public void visitInstruction(Instruction instruction) { if (instruction instanceof JetElementInstruction) { JetElementInstruction elementInstruction = (JetElementInstruction) instruction; - returnedExpressions.add((JetExpression) elementInstruction.getElement()); + returnedExpressions.add(elementInstruction.getElement()); } else { throw new IllegalStateException(instruction + " precedes the exit point"); @@ -138,7 +138,7 @@ public class JetFlowInformationProvider { JetExpression bodyExpression = function.getBodyExpression(); if (bodyExpression == null) return; - List returnedExpressions = Lists.newArrayList(); + List returnedExpressions = Lists.newArrayList(); collectReturnExpressions(function.asElement(), returnedExpressions); boolean nothingReturned = returnedExpressions.isEmpty(); @@ -155,7 +155,7 @@ public class JetFlowInformationProvider { trace.report(UNREACHABLE_CODE.on(element)); } - for (JetExpression returnedExpression : returnedExpressions) { + for (JetElement returnedExpression : returnedExpressions) { returnedExpression.accept(new JetVisitorVoid() { @Override public void visitReturnExpression(JetReturnExpression expression) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java index 71d5ffc290e..0425c7d2403 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java @@ -227,8 +227,8 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd } @Override - public void read(@NotNull JetExpression expression) { - add(new ReadValueInstruction(expression)); + public void read(@NotNull JetElement element) { + add(new ReadValueInstruction(element)); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java index f9e1ea2ded1..b4565b36517 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java @@ -33,7 +33,7 @@ public class Pseudocode { return name; } - public int getTargetInstructionIndex() { + public Integer getTargetInstructionIndex() { return targetInstructionIndex; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReadValueInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReadValueInstruction.java index b8847d46211..fe4f7671536 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReadValueInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ReadValueInstruction.java @@ -1,15 +1,15 @@ package org.jetbrains.jet.lang.cfg.pseudocode; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.psi.JetElement; /** * @author abreslav */ public class ReadValueInstruction extends InstructionWithNext { - public ReadValueInstruction(@NotNull JetExpression expression) { - super(expression); + public ReadValueInstruction(@NotNull JetElement element) { + super(element); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index 6faa4c683b7..733e89b9215 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -263,7 +263,22 @@ public interface Errors { ParameterizedDiagnosticFactory1 TOO_MANY_ARGUMENTS = ParameterizedDiagnosticFactory1.create(ERROR, "Too many arguments for {0}"); ParameterizedDiagnosticFactory1 ERROR_COMPILE_TIME_VALUE = ParameterizedDiagnosticFactory1.create(ERROR, "{0}"); - SimpleDiagnosticFactory ELSE_MISPLACED_IN_WHEN = SimpleDiagnosticFactory.create(ERROR, "'else' entry must be the last one in a when-expression"); + SimpleDiagnosticFactoryWithPsiElement ELSE_MISPLACED_IN_WHEN = new SimpleDiagnosticFactoryWithPsiElement(ERROR, "'else' entry must be the last one in a when-expression") { + @NotNull + @Override + public TextRange getTextRange(@NotNull JetWhenEntry entry) { + PsiElement elseKeywordElement = entry.getElseKeywordElement(); + assert elseKeywordElement != null; + return elseKeywordElement.getTextRange(); + } + }; + SimpleDiagnosticFactoryWithPsiElement NO_ELSE_IN_WHEN = new SimpleDiagnosticFactoryWithPsiElement(ERROR, "'when' expression must contain 'else' branch") { + @NotNull + @Override + public TextRange getTextRange(@NotNull JetWhenExpression element) { + return element.getWhenKeywordElement().getTextRange(); + } + }; SimpleDiagnosticFactory CYCLIC_INHERITANCE_HIERARCHY = SimpleDiagnosticFactory.create(ERROR, "There's a cycle in the inheritance hierarchy for this type"); SimpleDiagnosticFactory MANY_CLASSES_IN_SUPERTYPE_LIST = SimpleDiagnosticFactory.create(ERROR, "Only one class may appear in a supertype list"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnosticFactoryWithPsiElement.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnosticFactoryWithPsiElement.java index a0da054399a..7600980fb3d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnosticFactoryWithPsiElement.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnosticFactoryWithPsiElement.java @@ -1,6 +1,7 @@ package org.jetbrains.jet.lang.diagnostics; import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; @@ -15,19 +16,28 @@ public abstract class SimpleDiagnosticFactoryWithPsiElement(this, severity, message, elementToBlame, textRange); + } @NotNull public Diagnostic on(@NotNull T elementToBlame, @NotNull ASTNode nodeToMark) { - return new DiagnosticWithPsiElementImpl(this, severity, message, elementToBlame, nodeToMark.getTextRange()); + return on(elementToBlame, nodeToMark.getTextRange()); } @NotNull public Diagnostic on(@NotNull T elementToBlame, @NotNull PsiElement elementToMark) { - return new DiagnosticWithPsiElementImpl(this, severity, message, elementToBlame, elementToMark.getTextRange()); + return on(elementToBlame, elementToMark.getTextRange()); } @NotNull public Diagnostic on(@NotNull T element) { - return on(element, element.getNode()); + return on(element, getTextRange(element)); + } + + @NotNull + public TextRange getTextRange(@NotNull T element) { + return element.getTextRange(); } } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java index 7336820ded1..eb0f28d43a9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java @@ -148,4 +148,23 @@ public class JetPsiUtil { private static String makeFQName(String prefix, JetClassOrObject jetClass) { return ((prefix == null || prefix.length() == 0) ? "" : prefix + ".") + jetClass.getName(); } + + public static boolean isIrrefutable(JetWhenEntry entry) { + if (entry.isElse()) return true; + for (JetWhenCondition condition : entry.getConditions()) { + if (condition instanceof JetWhenConditionIsPattern) { + JetPattern pattern = ((JetWhenConditionIsPattern) condition).getPattern(); + if (pattern instanceof JetWildcardPattern) { + return true; + } + if (pattern instanceof JetBindingPattern) { + JetBindingPattern bindingPattern = (JetBindingPattern) pattern; + if (bindingPattern.getVariableDeclaration().getPropertyTypeRef() == null && bindingPattern.getCondition() == null) { + return true; + } + } + } + } + return false; + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetWhenEntry.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetWhenEntry.java index d4adc5210a1..d374782df1b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetWhenEntry.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetWhenEntry.java @@ -1,6 +1,7 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lexer.JetTokens; @@ -14,7 +15,12 @@ public class JetWhenEntry extends JetElement { } public boolean isElse() { - return findChildByType(JetTokens.ELSE_KEYWORD) != null; + return getElseKeywordElement() != null; + } + + @Nullable + public PsiElement getElseKeywordElement() { + return findChildByType(JetTokens.ELSE_KEYWORD); } @Nullable diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetWhenExpression.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetWhenExpression.java index bbec3d4075c..36578540051 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetWhenExpression.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetWhenExpression.java @@ -1,9 +1,11 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.JetNodeTypes; +import org.jetbrains.jet.lexer.JetTokens; import java.util.List; @@ -34,4 +36,9 @@ public class JetWhenExpression extends JetExpression { public R accept(@NotNull JetVisitor visitor, D data) { return visitor.visitWhenExpression(this, data); } + + @NotNull + public PsiElement getWhenKeywordElement() { + return findChildByType(JetTokens.WHEN_KEYWORD); + } } diff --git a/compiler/testData/codegen/patternMatching/exceptionOnNoMatch.jet b/compiler/testData/codegen/patternMatching/exceptionOnNoMatch.jet index f5e668b9faf..2c98ded9809 100644 --- a/compiler/testData/codegen/patternMatching/exceptionOnNoMatch.jet +++ b/compiler/testData/codegen/patternMatching/exceptionOnNoMatch.jet @@ -1,3 +1,4 @@ fun isZero(x: Int) = when(x) { 0 -> true + else -> throw Exception() } diff --git a/compiler/testData/diagnostics/tests/Super.jet b/compiler/testData/diagnostics/tests/Super.jet index 1f41daa88ce..fd52c4c0b58 100644 --- a/compiler/testData/diagnostics/tests/Super.jet +++ b/compiler/testData/diagnostics/tests/Super.jet @@ -6,7 +6,7 @@ fun notAnExpression() { any(super) // not an expression if (super) {} else {} // not an expression val x = super // not an expression - when (1) { + when (1) { super -> 1 // not an expression } @@ -86,4 +86,4 @@ class A1 { fun test() { super.equals(null) } -} +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/Unresolved.jet b/compiler/testData/diagnostics/tests/Unresolved.jet index 0ec39c5fcbe..617fa8a3064 100644 --- a/compiler/testData/diagnostics/tests/Unresolved.jet +++ b/compiler/testData/diagnostics/tests/Unresolved.jet @@ -15,12 +15,11 @@ fun testUnresolved() { foo1(i) s.foo() - when(a) { + when(a) { is Int -> a is String -> a } - //TODO for (j in collection) { var i: Int = j i += 1 diff --git a/compiler/testData/diagnostics/tests/When.jet b/compiler/testData/diagnostics/tests/When.jet index 0943aa7cdb6..e5a446c6077 100644 --- a/compiler/testData/diagnostics/tests/When.jet +++ b/compiler/testData/diagnostics/tests/When.jet @@ -4,7 +4,6 @@ fun foo() : Int { val s = "" val x = 1 when (x) { - is * -> 1 is String -> 1 !is Int -> 1 is Any? -> 1 @@ -16,7 +15,7 @@ fun foo() : Int { // Commented for KT-621 .a => 1 // Commented for KT-621 .equals(1).a => 1 // Commented for KT-621 ?.equals(1) => 1 - else -> 1 + is * -> 1 } // Commented for KT-621 @@ -34,7 +33,7 @@ fun test() { val x = 1; val s = ""; - when (x) { + when (x) { s -> 1 is "" -> 1 x -> 1 @@ -44,7 +43,7 @@ fun test() { val z = #(1, 1) - when (z) { + when (z) { is #(*, *) -> 1 is #(*, 1) -> 1 is #(1, 1) -> 1 @@ -55,8 +54,8 @@ fun test() { } when (z) { - else -> 1 - #(1, 1) -> 2 + else -> 1 + #(1, 1) -> 2 } when (z) { @@ -64,4 +63,4 @@ fun test() { } } -val #(Int, Int).boo : #(Int, Int, Int) = #(1, 1, 1) +val #(Int, Int).boo : #(Int, Int, Int) = #(1, 1, 1) \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/controlStructures/kt786.jet b/compiler/testData/diagnostics/tests/controlStructures/kt786.jet index e82c47aa5fc..102b7dbc3cc 100644 --- a/compiler/testData/diagnostics/tests/controlStructures/kt786.jet +++ b/compiler/testData/diagnostics/tests/controlStructures/kt786.jet @@ -6,19 +6,19 @@ fun foo() : Int { var z = 0 when(d) { is 5, is 3 -> z++ - else -> { z = -1000 } - return z -> 34 + else -> { z = -1000 } + return z -> 34 } } //test unreachable code fun fff(): Int { var d = 3 - when(d) { + when(d) { is 4 -> 21 return 2 -> return 47 - bar() -> 45 - 444 -> true + bar() -> 45 + 444 -> true } return 34 } diff --git a/compiler/testData/diagnostics/tests/controlStructures/when.kt234.kt973.jet b/compiler/testData/diagnostics/tests/controlStructures/when.kt234.kt973.jet new file mode 100644 index 00000000000..f74625cc30a --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/when.kt234.kt973.jet @@ -0,0 +1,54 @@ +//KT-234 Force when() expressions to have an 'else' branch +//KT-973 Unreachable code + +package kt234_kt973 + + +fun test(t : #(Int, Int)) : Int { + when (t) { + is #(10, 10) -> return 1 + } + return 0 // unreachable code +} + +fun test1(t : #(Int, Int)) : Int { + when (t) { + is #(10, 10) -> return 1 + else -> return 2 + } + return 0 // unreachable code +} + +//more tests +fun t1(x: Int) = when(x) { + is * -> 1 +} + +fun t2(x: Int) = when(x) { + is val a -> 1 +} + +fun t3(x: Int) = when (x) { + is * -> 1 + 2 -> 2 +} + +fun t4(x: Int) = when (x) { + is val a -> 1 + 2 -> 2 +} + +fun t5(x: Int) = when (x) { + is val a : Int -> 1 + 2 -> 2 +} + +fun foo3(x: Int) = when(x) { + else -> 1 + 2 -> 2 +} + +fun foo4(x: Int) = when(x) { + 2 -> x + is val a -> a +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/infos/Autocasts.jet b/compiler/testData/diagnostics/tests/infos/Autocasts.jet index a869d644ed6..3b92d238d76 100644 --- a/compiler/testData/diagnostics/tests/infos/Autocasts.jet +++ b/compiler/testData/diagnostics/tests/infos/Autocasts.jet @@ -153,12 +153,12 @@ fun getStringLength(obj : Any) : Char? { } fun toInt(i: Int?): Int = if (i != null) i else 0 -fun illegalWhenBody(a: Any): Int = when(a) { +fun illegalWhenBody(a: Any): Int = when(a) { is Int -> a is String -> a } fun illegalWhenBlock(a: Any): Int { - when(a) { + when(a) { is Int -> return a is String -> return a } @@ -223,7 +223,7 @@ fun mergeAutocasts(a: Any?) { if (a is Int || a is String) { a.compareTo("") } - when (a) { + when (a) { is String, is Any -> a.compareTo("") } if (a is String && a is Any) { diff --git a/compiler/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java b/compiler/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java index 4643204921f..2f1c4fd66f1 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java @@ -1,6 +1,5 @@ package org.jetbrains.jet.codegen; -import jet.NoPatternMatchedException; import jet.Tuple2; import java.lang.reflect.Method; @@ -25,7 +24,7 @@ public class PatternMatchingTest extends CodegenTestCase { loadFile(); Method foo = generateFunction(); assertTrue((Boolean) foo.invoke(null, 0)); - assertThrows(foo, NoPatternMatchedException.class, null, 1); + assertThrows(foo, Exception.class, null, 1); } public void testPattern() throws Exception { diff --git a/idea/testData/checker/Unresolved.jet b/idea/testData/checker/Unresolved.jet index b9407e489c4..95228d79b6e 100644 --- a/idea/testData/checker/Unresolved.jet +++ b/idea/testData/checker/Unresolved.jet @@ -18,9 +18,9 @@ fun testUnresolved() { when(a) { is Int -> a is String -> a + else -> a } - //TODO for (j in collection) { var i: Int = j i += 1 diff --git a/idea/testData/checker/When.jet b/idea/testData/checker/When.jet index 2362c95f494..c4bf4638653 100644 --- a/idea/testData/checker/When.jet +++ b/idea/testData/checker/When.jet @@ -4,7 +4,6 @@ fun foo() : Int { val s = "" val x = 1 when (x) { - is * -> 1 is String -> 1 !is Int -> 1 is Any? -> 1 @@ -16,7 +15,7 @@ fun foo() : Int { // Commented for KT-621 .a -> 1 // Commented for KT-621 .equals(1).a -> 1 // Commented for KT-621 ?.equals(1) -> 1 - else -> 1 + is * -> 1 } // Commented for KT-621 @@ -39,6 +38,7 @@ fun test() { x -> 1 is 1 -> 1 is #(1, 1) -> 1 + else -> 1 } val z = #(1, 1) @@ -51,11 +51,12 @@ fun test() { is #(1, "1", *) -> 1 is boo #(1, "a", *) -> 1 is boo #(1, *) -> 1 + else -> 1 } when (z) { - else -> 1 - #(1, 1) -> 2 + else -> 1 + #(1, 1) -> 2 } when (z) { diff --git a/idea/testData/checker/infos/Autocasts.jet b/idea/testData/checker/infos/Autocasts.jet index fa45c29c3ad..cfacc4c3336 100644 --- a/idea/testData/checker/infos/Autocasts.jet +++ b/idea/testData/checker/infos/Autocasts.jet @@ -154,11 +154,13 @@ fun toInt(i: Int?): Int = if (i != null) a is String -> a + else -> 1 } fun illegalWhenBlock(a: Any): Int { when(a) { is Int -> return a is String -> return a + else -> return 1 } } fun declarations(a: Any?) { @@ -221,7 +223,7 @@ fun mergeAutocasts(a: Any?) { if (a is Int || a is String) { a.compareTo("") } - when (a) { + when (a) { is String, is Any -> a.compareTo("") } if (a is String && a is Any) {