[FIR] Fix collecting member candidates on receiver with smartcast

^KT-51460 Fixed
^KT-51827
This commit is contained in:
Dmitriy Novozhilov
2022-04-05 19:21:55 +04:00
committed by teamcity
parent 51bd0fd2db
commit 6e2402620f
29 changed files with 1378 additions and 34 deletions
@@ -0,0 +1,84 @@
// FIR_IDENTICAL
interface Base {
fun baseFun()
}
interface Derived : Base {
fun derivedFun()
}
abstract class A<T : Base> {
protected val a: T = null!!
fun fest_1(other: A<*>) {
other.a.baseFun() // OK
if (other is B) {
other.a.baseFun()
other.a.derivedFun()
}
if (other is C) {
other.a.baseFun()
other.a.derivedFun()
}
if (other is D) {
other.a.baseFun()
other.a.derivedFun()
}
}
open class B : A<Derived>() {
class Nested {
fun fest_3(other: A<*>) {
other.a.baseFun() // OK
if (other is B) {
other.a.baseFun()
other.a.derivedFun()
}
if (other is C) {
other.a.baseFun()
other.a.derivedFun()
}
if (other is D) {
other.a.baseFun()
other.a.derivedFun()
}
}
}
}
class C : B() {
fun fest_4(other: A<*>) {
other.a.baseFun() // OK
if (other is B) {
other.a.baseFun()
other.a.derivedFun()
}
if (other is C) {
other.a.baseFun()
other.a.derivedFun()
}
if (other is D) {
other.a.baseFun()
other.a.derivedFun()
}
}
}
class D : A<Derived>() {
fun fest_5(other: A<*>) {
other.a.baseFun() // OK
if (other is B) {
other.a.baseFun()
other.a.derivedFun()
}
if (other is C) {
other.a.baseFun()
other.a.derivedFun()
}
if (other is D) {
other.a.baseFun()
other.a.derivedFun()
}
}
}
}