KT-10139: any if without else used in expression is an error

regardless of expected type: it can't be an expression, even of type Unit.

 #KT-10139 Fixed
This commit is contained in:
Dmitry Petrov
2015-11-27 16:06:11 +03:00
parent b0dab4c67a
commit 1a3a296827
8 changed files with 155 additions and 16 deletions
@@ -0,0 +1,72 @@
fun idAny(x: Any) = x
fun <T> id(x: T) = x
fun idUnit(x: Unit) = x
class MList {
// MutableCollection<T>.add returns Boolean, but nobody cares
fun add(): Boolean = true
}
val mlist = MList()
fun work() {}
val xx1 = <!INVALID_IF_AS_EXPRESSION!>if (true) 42<!>
val xx2: Unit = <!INVALID_IF_AS_EXPRESSION!>if (true) 42<!>
val xx3 = idAny(<!INVALID_IF_AS_EXPRESSION!>if (true) 42<!>)
val xx4 = id(<!INVALID_IF_AS_EXPRESSION!>if (true) 42<!>)
val xx5 = idUnit(<!INVALID_IF_AS_EXPRESSION!>if (true) 42<!>)
val xx6 = null ?: <!INVALID_IF_AS_EXPRESSION!>if (true) 42<!>
val xx7 = "" + <!INVALID_IF_AS_EXPRESSION!>if (true) 42<!>
val wxx1 = <!NO_ELSE_IN_WHEN!>when<!> { true -> 42 }
val wxx2: Unit = when { true -> <!CONSTANT_EXPECTED_TYPE_MISMATCH!>42<!> }
val wxx3 = idAny(<!NO_ELSE_IN_WHEN!>when<!> { true -> 42 })
val wxx4 = id(<!NO_ELSE_IN_WHEN!>when<!> { true -> 42 })
val wxx5 = idUnit(when { true -> 42 }) // TODO illegal expression
val wxx6 = null ?: <!NO_ELSE_IN_WHEN!>when<!> { true -> 42 }
val wxx7 = "" + <!NO_ELSE_IN_WHEN!>when<!> { true -> 42 }
val fn1 = { if (true) <!UNUSED_EXPRESSION!>42<!> }
val fn2 = { if (true) mlist.add() }
val fn3 = { if (true) work() }
val fn4 = { <!NO_ELSE_IN_WHEN!>when<!> { true -> 42 } }
val fn5 = { <!NO_ELSE_IN_WHEN!>when<!> { true -> mlist.add() } }
val fn6 = { when { true -> work() } }
val ufn1: () -> Unit = { if (true) <!UNUSED_EXPRESSION!>42<!> }
val ufn2: () -> Unit = { if (true) mlist.add() }
val ufn3: () -> Unit = { if (true) work() }
val ufn4: () -> Unit = { when { true -> <!UNUSED_EXPRESSION!>42<!> } }
val ufn5: () -> Unit = { when { true -> mlist.add() } }
val ufn6: () -> Unit = { when { true -> work() } }
fun foo1(x: String?) {
"" + <!INVALID_IF_AS_EXPRESSION!>if (true) 42<!>
w@while (true) {
x ?: if (true) break
x ?: <!NO_ELSE_IN_WHEN!>when<!> { true -> break@w }
}
}
fun foo2() {
if (true) {
mlist.add()
}
else if (true) {
mlist.add()
}
else if (true) {
mlist.add()
}
when {
true -> mlist.add()
else -> when {
true -> mlist.add()
else -> when {
true -> mlist.add()
}
}
}
}