KT-234 Force when() expressions to have an 'else' branch

KT-973 Unreachable code
This commit is contained in:
svtk
2012-01-18 13:31:42 +04:00
parent 94e3cc9976
commit becd713111
23 changed files with 175 additions and 50 deletions
@@ -6,7 +6,7 @@ fun notAnExpression() {
any(<!SUPER_IS_NOT_AN_EXPRESSION!>super<!>) // not an expression
if (<!SUPER_IS_NOT_AN_EXPRESSION!>super<!>) {} else {} // not an expression
val <!UNUSED_VARIABLE!>x<!> = <!SUPER_IS_NOT_AN_EXPRESSION!>super<!> // not an expression
when (1) {
<!NO_ELSE_IN_WHEN!>when<!> (1) {
<!SUPER_IS_NOT_AN_EXPRESSION!>super<!> -> 1 // not an expression
}
@@ -86,4 +86,4 @@ class A1 {
fun test() {
<!SUPER_IS_NOT_AN_EXPRESSION!>super<!>.equals(null)
}
}
}
@@ -15,12 +15,11 @@ fun testUnresolved() {
foo1(<!UNRESOLVED_REFERENCE!>i<!>)
s.<!UNRESOLVED_REFERENCE!>foo<!>()
when(<!UNRESOLVED_REFERENCE!>a<!>) {
<!NO_ELSE_IN_WHEN!>when<!>(<!UNRESOLVED_REFERENCE!>a<!>) {
is Int -> <!UNRESOLVED_REFERENCE!>a<!>
is String -> <!UNRESOLVED_REFERENCE!>a<!>
}
//TODO
for (j in <!UNRESOLVED_REFERENCE!>collection<!>) {
var i: Int = j
i += 1
+6 -7
View File
@@ -4,7 +4,6 @@ fun foo() : Int {
val s = ""
val x = 1
when (x) {
is * -> 1
is <!INCOMPATIBLE_TYPES!>String<!> -> 1
!is Int -> 1
is Any? -> 1
@@ -16,7 +15,7 @@ fun foo() : Int {
// Commented for KT-621 .<!!UNRESOLVED_REFERENCE!>a<!!> => 1
// Commented for KT-621 .equals(1).<!!UNRESOLVED_REFERENCE!>a<!!> => 1
// Commented for KT-621 <!UNNECESSARY_SAFE_CALL!!>?.<!!>equals(1) => 1
else -> 1
is * -> 1
}
// Commented for KT-621
@@ -34,7 +33,7 @@ fun test() {
val x = 1;
val s = "";
when (x) {
<!NO_ELSE_IN_WHEN!>when<!> (x) {
<!INCOMPATIBLE_TYPES!>s<!> -> 1
is <!INCOMPATIBLE_TYPES!>""<!> -> 1
x -> 1
@@ -44,7 +43,7 @@ fun test() {
val z = #(1, 1)
when (z) {
<!NO_ELSE_IN_WHEN!>when<!> (z) {
is #(*, *) -> 1
is #(*, 1) -> 1
is #(1, 1) -> 1
@@ -55,8 +54,8 @@ fun test() {
}
when (z) {
<!ELSE_MISPLACED_IN_WHEN!>else -> 1<!>
#(1, 1) -> 2
<!ELSE_MISPLACED_IN_WHEN!>else<!> -> 1
<!UNREACHABLE_CODE!>#(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)
@@ -6,19 +6,19 @@ fun foo() : Int {
var z = 0
when(d) {
is 5, is 3 -> <!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY, UNUSED_CHANGED_VALUE!>z++<!>
<!ELSE_MISPLACED_IN_WHEN!>else -> { <!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>z = <!UNUSED_VALUE!>-1000<!><!> }<!>
return z -> <!UNREACHABLE_CODE!>34<!>
<!ELSE_MISPLACED_IN_WHEN!>else<!> -> { <!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>z = <!UNUSED_VALUE!>-1000<!><!> }
<!UNREACHABLE_CODE!>return z -> 34<!>
}
}
//test unreachable code
fun fff(): Int {
var d = 3
when(d) {
<!NO_ELSE_IN_WHEN!>when<!>(d) {
is 4 -> 21
return 2 -> <!UNREACHABLE_CODE!>return 47<!>
<!UNREACHABLE_CODE!>bar()<!> -> <!UNREACHABLE_CODE!>45<!>
<!UNREACHABLE_CODE!>444<!> -> <!UNREACHABLE_CODE!>true<!>
<!UNREACHABLE_CODE!>bar() -> 45<!>
<!UNREACHABLE_CODE!>444 -> true<!>
}
return 34
}
@@ -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 {
<!NO_ELSE_IN_WHEN!>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
}
<!UNREACHABLE_CODE!>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
<!UNREACHABLE_CODE!>2 -> 2<!>
}
fun t4(x: Int) = when (x) {
is val a -> 1
<!UNREACHABLE_CODE!>2 -> 2<!>
}
fun t5(x: Int) = <!NO_ELSE_IN_WHEN!>when<!> (x) {
is val a : Int -> 1
2 -> 2
}
fun foo3(x: Int) = when(x) {
<!ELSE_MISPLACED_IN_WHEN!>else<!> -> 1
<!UNREACHABLE_CODE!>2 -> 2<!>
}
fun foo4(x: Int) = when(x) {
2 -> x
is val a -> a
}
@@ -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 = <!NO_ELSE_IN_WHEN!>when<!>(a) {
is Int -> a
is String -> <!TYPE_MISMATCH!>a<!>
}
fun illegalWhenBlock(a: Any): Int {
when(a) {
<!NO_ELSE_IN_WHEN!>when<!>(a) {
is Int -> return a
is String -> return <!TYPE_MISMATCH!>a<!>
}
@@ -223,7 +223,7 @@ fun mergeAutocasts(a: Any?) {
if (a is Int || a is String) {
a.<!UNRESOLVED_REFERENCE!>compareTo<!>("")
}
when (a) {
<!NO_ELSE_IN_WHEN!>when<!> (a) {
is String, is Any -> a.<!UNRESOLVED_REFERENCE!>compareTo<!>("")
}
if (a is String && a is Any) {