FILE: moreSpecificProtected.fir.kt public open class Base : R|kotlin/Any| { public constructor(): R|Base| { super() } } public final class Derived : R|Base| { public constructor(): R|Derived| { super() } } public abstract interface M1 : R|kotlin/Any| { } public abstract interface M2 : R|kotlin/Any| { } public abstract interface M2Sub : R|M2| { } public abstract interface M3 : R|kotlin/Any| { } public abstract interface M3Sub : R|M3| { } public abstract interface M4 : R|kotlin/Any| { } public abstract interface M5 : R|kotlin/Any| { } public abstract interface M5Sub : R|M5| { } public abstract interface M5SubSub : R|M5Sub| { } public abstract interface M6 : R|kotlin/Any| { } public open class A : R|kotlin/Any| { public constructor(): R|A| { super() } public final fun foo(a1: R|Base|, a2: R|Base|): R|M1| { ^foo R|kotlin/TODO|() } protected open fun foo(a1: R|Base|, a2: R|Derived|): R|M2| { ^foo R|kotlin/TODO|() } protected open fun foo(a1: R|Derived|, a2: R|Derived|): R|M3| { ^foo R|kotlin/TODO|() } public final fun baz(a1: R|Base|, a2: R|Base|): R|M4| { ^baz R|kotlin/TODO|() } protected open fun baz(a1: R|Derived|, a2: R|Derived|): R|M5| { ^baz R|kotlin/TODO|() } } public open class B : R|A| { public constructor(): R|B| { super() } public final val fromB: R|kotlin/Any| = R|kotlin/Any.Any|() public get(): R|kotlin/Any| protected open override fun foo(a1: R|Base|, a2: R|Derived|): R|M2Sub| { ^foo R|kotlin/TODO|() } protected open override fun baz(a1: R|Derived|, a2: R|Derived|): R|M5Sub| { ^baz R|kotlin/TODO|() } public final fun f(a: R|A|, b: R|B|, c: R|C|, d: R|Derived|): R|kotlin/Unit| { R|/a|.R|/A.foo|(R|/d|, R|/d|).R|/checkType|(checkType@fun R|CheckTypeInv|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|/_|() } ) R|/b|.R|/A.foo|(R|/d|, R|/d|).R|/checkType|(checkType@fun R|CheckTypeInv|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|/_|() } ) R|/c|.R|/B.foo|(R|/d|, R|/d|).R|/checkType|(checkType@fun R|CheckTypeInv|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|/_|() } ) R|/a|.R|/A.baz|(R|/d|, R|/d|).R|/checkType|(checkType@fun R|CheckTypeInv|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|/_|() } ) R|/b|.R|/B.baz|(R|/d|, R|/d|).R|/checkType|(checkType@fun R|CheckTypeInv|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|/_|() } ) R|/c|.R|/C.baz|(R|/d|, R|/d|).R|/checkType|(checkType@fun R|CheckTypeInv|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|/_|() } ) when (R|/a|) { ($subj$ is R|C|) -> { R|/a|.R|/C.fromC| R|/a|.R|/B.foo|(R|/d|, R|/d|).R|/checkType|(checkType@fun R|CheckTypeInv|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|/_|() } ) R|/a|.R|/C.baz|(R|/d|, R|/d|).R|/checkType|(checkType@fun R|CheckTypeInv|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|/_|() } ) } ($subj$ is R|B|) -> { R|/a|.R|/B.fromB| R|/a|.R|/A.foo|(R|/d|, R|/d|).R|/checkType|(checkType@fun R|CheckTypeInv|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|/_|() } ) R|/a|.R|/B.baz|(R|/d|, R|/d|).R|/checkType|(checkType@fun R|CheckTypeInv|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|/_|() } ) } } when (R|/b|) { ($subj$ is R|C|) -> { R|/b|.R|/C.fromC| R|/b|.R|/A.foo|(R|/d|, R|/d|).R|/checkType|(checkType@fun R|CheckTypeInv|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|/_#|() } ) R|/b|.R|/A.foo|(R|/d|, R|/d|).R|/checkType|(checkType@fun R|CheckTypeInv|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|/_|() } ) R|/b|.R|/B.baz|(R|/d|, R|/d|).R|/checkType|(checkType@fun R|CheckTypeInv|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|/_#|() } ) R|/b|.R|/B.baz|(R|/d|, R|/d|).R|/checkType|(checkType@fun R|CheckTypeInv|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|/_|() } ) } } } } public final class C : R|B| { public constructor(): R|C| { super() } public final val fromC: R|kotlin/Any| = R|kotlin/Any.Any|() public get(): R|kotlin/Any| protected open override fun foo(a1: R|Derived|, a2: R|Derived|): R|M3Sub| { ^foo R|kotlin/TODO|() } protected open override fun baz(a1: R|Derived|, a2: R|Derived|): R|M5SubSub| { ^baz R|kotlin/TODO|() } public final fun baz(a1: R|Derived|, a2: R|Base|): R|M6| { ^baz R|kotlin/TODO|() } }