FIR: intersect return types of declarations in intersection scopes

^KT-54378 Fixed
This commit is contained in:
pyos
2022-10-13 10:21:44 +02:00
committed by teamcity
parent 2879e7a74c
commit ee921412fc
11 changed files with 133 additions and 19 deletions
@@ -0,0 +1,14 @@
// FIR_IDENTICAL
// SKIP_TXT
class C<T>(val value: T?)
fun <T> assignable(x: () -> T) {}
fun <V> foo(t: C<out Any>, v: C<out V>) {
assignable<V?> { v.value }
if (t == v) {
// `value: CapturedType(out V)?` <: `value: CapturedType(out Any)?` - same instantiation
assignable<V?> { v.value }
assignable<V?> { t.value }
}
}
@@ -0,0 +1,17 @@
// SKIP_TXT
class C<T>(val value: T)
fun <T> assignable(x: () -> T) {}
fun <T, V> foo(t: C<out T>, v: C<out V>) {
assignable<T> { t.value } // sure
assignable<V> { v.value } // obviously
if (t == v) {
// => {t,v} is C<out T> & C<out V>
// => {t,v}.value is T & V
assignable<T> { t.value }
assignable<V> { v.value }
assignable<T> { v.value }
assignable<V> { t.value }
}
}
@@ -0,0 +1,17 @@
// SKIP_TXT
class C<T>(val value: T)
fun <T> assignable(x: () -> T) {}
fun <T, V> foo(t: C<out T>, v: C<out V>) {
assignable<T> { t.value } // sure
assignable<V> { v.value } // obviously
if (t == v) {
// => {t,v} is C<out T> & C<out V>
// => {t,v}.value is T & V
assignable<T> { <!TYPE_MISMATCH!>t.value<!> }
assignable<V> { <!TYPE_MISMATCH!>v.value<!> }
assignable<T> { v.value }
assignable<V> { t.value }
}
}