Files
kotlin-fork/compiler/testData/diagnostics/tests/visibility/moreSpecificProtected.fir.txt
T
Denis.Zharkov b6b132a9a3 K2: Avoid false-positive overload resolution ambiguity with smart casts
The idea is that when we have successful candidates both from smart cast
and original type, we should discriminate in the favor of former ones.

While this problem (see kt55722.kt) existed before this branch is merged,
initially it was recognized on FP Ultimate when we stopped assuming
captured types from the same projections as equal (see kt55722Initial.kt).

^KT-55722 Fixed
^KT-55024 Fixed
^KT-56283 Related
^KT-56310 Related
2023-02-15 08:13:54 +00:00

172 lines
7.0 KiB
Plaintext
Vendored

FILE: moreSpecificProtected.fir.kt
public open class Base : R|kotlin/Any| {
public constructor(): R|Base| {
super<R|kotlin/Any|>()
}
}
public final class Derived : R|Base| {
public constructor(): R|Derived| {
super<R|Base|>()
}
}
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<R|kotlin/Any|>()
}
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<R|A|>()
}
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|<local>/a|.R|/A.foo|(R|<local>/d|, R|<local>/d|).R|/checkType|<R|M1|>(checkType@fun R|CheckTypeInv<M1>|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|/_|<R|M1|>()
}
)
R|<local>/b|.R|/A.foo|(R|<local>/d|, R|<local>/d|).R|/checkType|<R|M3|>(checkType@fun R|CheckTypeInv<M3>|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|/_|<R|M3|>()
}
)
R|<local>/c|.R|/B.foo|(R|<local>/d|, R|<local>/d|).R|/checkType|<R|M2Sub|>(checkType@fun R|CheckTypeInv<M2Sub>|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|/_|<R|M2Sub|>()
}
)
R|<local>/a|.R|/A.baz|(R|<local>/d|, R|<local>/d|).R|/checkType|<R|M4|>(checkType@fun R|CheckTypeInv<M4>|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|/_|<R|M4|>()
}
)
R|<local>/b|.R|/B.baz|(R|<local>/d|, R|<local>/d|).R|/checkType|<R|M5Sub|>(checkType@fun R|CheckTypeInv<M5Sub>|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|/_|<R|M5Sub|>()
}
)
R|<local>/c|.R|/C.baz|(R|<local>/d|, R|<local>/d|).R|/checkType|<R|M6|>(checkType@fun R|CheckTypeInv<M6>|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|/_|<R|M6|>()
}
)
when (R|<local>/a|) {
($subj$ is R|C|) -> {
R|<local>/a|.R|/C.fromC|
R|<local>/a|.R|/B.foo|(R|<local>/d|, R|<local>/d|).R|/checkType|<R|M2Sub|>(checkType@fun R|CheckTypeInv<M2Sub>|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|/_|<R|M2Sub|>()
}
)
R|<local>/a|.R|/C.baz|(R|<local>/d|, R|<local>/d|).R|/checkType|<R|M6|>(checkType@fun R|CheckTypeInv<M6>|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|/_|<R|M6|>()
}
)
}
($subj$ is R|B|) -> {
R|<local>/a|.R|/B.fromB|
R|<local>/a|.R|/A.foo|(R|<local>/d|, R|<local>/d|).R|/checkType|<R|M3|>(checkType@fun R|CheckTypeInv<M3>|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|/_|<R|M3|>()
}
)
R|<local>/a|.R|/B.baz|(R|<local>/d|, R|<local>/d|).R|/checkType|<R|M5Sub|>(checkType@fun R|CheckTypeInv<M5Sub>|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|/_|<R|M5Sub|>()
}
)
}
}
when (R|<local>/b|) {
($subj$ is R|C|) -> {
R|<local>/b|.R|/C.fromC|
R|<local>/b|.R|/A.foo|(R|<local>/d|, R|<local>/d|).R|/checkType|<R|M3|>(checkType@fun R|CheckTypeInv<M3>|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|/_<None of the following candidates is applicable because of receiver type mismatch: [/_]>#|<R|M2Sub|>()
}
)
R|<local>/b|.R|/A.foo|(R|<local>/d|, R|<local>/d|).R|/checkType|<R|M3|>(checkType@fun R|CheckTypeInv<M3>|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|/_|<R|M3|>()
}
)
R|<local>/b|.R|/B.baz|(R|<local>/d|, R|<local>/d|).R|/checkType|<R|M5Sub|>(checkType@fun R|CheckTypeInv<M5Sub>|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|/_<None of the following candidates is applicable because of receiver type mismatch: [/_]>#|<R|M6|>()
}
)
R|<local>/b|.R|/B.baz|(R|<local>/d|, R|<local>/d|).R|/checkType|<R|M5Sub|>(checkType@fun R|CheckTypeInv<M5Sub>|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|/_|<R|M5Sub|>()
}
)
}
}
}
}
public final class C : R|B| {
public constructor(): R|C| {
super<R|B|>()
}
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|()
}
}