K2: Fix false-positive overload ambiguity after smart cast

Mostly, the change is just mirroring the same logic from K1
OverloadingConflictResolver

^KT-58524 Fixed
This commit is contained in:
Denis.Zharkov
2023-05-09 16:52:47 +02:00
committed by Space Team
parent efdecc63cb
commit 442844f165
9 changed files with 159 additions and 2 deletions
@@ -0,0 +1,33 @@
// ISSUE: KT-58524
interface MyGenericInterface<T> {
fun update(f: (T) -> T) {}
}
interface SubGenericInterface<F> : MyGenericInterface<F> {
override fun update(f: (F) -> F) {}
}
interface SubInterfaceInt : SubGenericInterface<Int> {
override fun update(f: (Int) -> Int) {}
}
fun foo1(a: MyGenericInterface<Number>) {
a <!UNCHECKED_CAST!>as MyGenericInterface<Int><!>
a.update { expectInt(it) }
}
fun foo2(a: MyGenericInterface<Number>) {
a <!UNCHECKED_CAST!>as SubGenericInterface<Int><!>
a.update { expectInt(it) }
}
fun foo3(a: MyGenericInterface<Number>) {
a as SubInterfaceInt
a.update { expectInt(it) }
}
fun expectInt(w: Int): Int = w
@@ -0,0 +1,33 @@
// ISSUE: KT-58524
interface MyGenericInterface<T> {
fun update(f: (T) -> T) {}
}
interface SubGenericInterface<F> : MyGenericInterface<F> {
override fun update(f: (F) -> F) {}
}
interface SubInterfaceInt : SubGenericInterface<Int> {
override fun update(f: (Int) -> Int) {}
}
fun foo1(a: MyGenericInterface<Number>) {
a <!UNCHECKED_CAST!>as MyGenericInterface<Int><!>
<!DEBUG_INFO_SMARTCAST!>a<!>.update { expectInt(it) }
}
fun foo2(a: MyGenericInterface<Number>) {
a <!UNCHECKED_CAST!>as SubGenericInterface<Int><!>
<!DEBUG_INFO_SMARTCAST!>a<!>.update { expectInt(it) }
}
fun foo3(a: MyGenericInterface<Number>) {
a as SubInterfaceInt
<!DEBUG_INFO_SMARTCAST!>a<!>.update { expectInt(it) }
}
fun expectInt(w: Int): Int = w