a4c5e1bc87
It's necessary because even for stable a.b.c.d we can't guarantee that this reference will always point to the same symbol because different capture type instantiations generate different scopes with different resulting symbol instances.
49 lines
981 B
Kotlin
Vendored
49 lines
981 B
Kotlin
Vendored
// !LANGUAGE: +VariableDeclarationInWhenSubject
|
|
|
|
fun foo(s1: Int, s2: Int) = s1 + s2
|
|
|
|
fun test1(x: String?) =
|
|
when (val y = x?.length) {
|
|
null -> 0
|
|
else -> foo(x.length, y)
|
|
}
|
|
|
|
fun test2(x: String?) {
|
|
when (val y = run { x!! }) {
|
|
"foo" -> x.length
|
|
"bar" -> y.length
|
|
}
|
|
}
|
|
|
|
fun test3(x: String?, y: String?) {
|
|
when (val z = x ?: y!!) {
|
|
"foo" -> x<!UNSAFE_CALL!>.<!>length
|
|
"bar" -> y<!UNSAFE_CALL!>.<!>length
|
|
"baz" -> z.length
|
|
}
|
|
}
|
|
|
|
fun <T> id(x: T): T = x
|
|
|
|
fun test4(x: String?) {
|
|
when (val y = id(x!!)) {
|
|
"foo" -> x.length
|
|
"bar" -> y.length
|
|
}
|
|
}
|
|
|
|
class Inv<T>(val data: T)
|
|
|
|
fun test5(x: Inv<out Any?>) {
|
|
when (val y = x.data) {
|
|
is String -> y.length // should be ok
|
|
null -> x.data.<!UNRESOLVED_REFERENCE!>length<!> // should be error
|
|
}
|
|
}
|
|
|
|
fun test6(x: Inv<out String?>) {
|
|
when (val y = x.data) {
|
|
is String -> x.data.length // should be ok
|
|
}
|
|
}
|