FIR: intersect return types of declarations in intersection scopes
^KT-54378 Fixed
This commit is contained in:
+14
@@ -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 }
|
||||
}
|
||||
}
|
||||
Vendored
+17
@@ -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 }
|
||||
}
|
||||
}
|
||||
+17
@@ -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 }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user