fecc5ba501
If a potential receiver is resolved to an error type, we consider any other type as a subtype of it and therefore may select any candidate that we happen to find in a scope. In particular, in the case of scripts, or code with a context receiver, the receiver candidate resolved to a cycle was accepted as a receiver to an invoke on a random class from stdlib. The fix skips adding invoke resolve task in this case, allowing the tower to find the correct candidate in another scope. #KT-64241 fixed #KT-65576 fixed
43 lines
1.1 KiB
Kotlin
Vendored
43 lines
1.1 KiB
Kotlin
Vendored
// ISSUE: KT-65576
|
|
|
|
fun foo(): Int = 0
|
|
|
|
object Implicit {
|
|
operator fun Any.invoke(): String = "Fail"
|
|
|
|
val foo = foo()
|
|
}
|
|
|
|
object Explicit {
|
|
operator fun Any.invoke(): String = "Fail"
|
|
|
|
val foo: String = <!DEBUG_INFO_LEAKING_THIS, UNINITIALIZED_VARIABLE!>foo<!>()
|
|
}
|
|
|
|
class Inv<T>(val value: T)
|
|
|
|
object ImplicitWrapped {
|
|
operator fun Inv<*>.invoke(): Inv<String> = Inv("Fail")
|
|
|
|
val foo = Inv(<!DEBUG_INFO_MISSING_UNRESOLVED, TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM_ERROR!>foo<!>)()
|
|
}
|
|
|
|
object ImplicitIndirect {
|
|
operator fun Any.invoke(): String = "Fail"
|
|
|
|
val foo get() = bar()
|
|
val bar get() = baz()
|
|
val baz get() = foo()
|
|
}
|
|
|
|
fun takeInt(x: Int) {}
|
|
|
|
fun test() {
|
|
takeInt(Implicit.foo)
|
|
takeInt(<!TYPE_MISMATCH!>Explicit.foo<!>) // should be an error
|
|
takeInt(ImplicitWrapped.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>foo<!>) // should be an error
|
|
takeInt(<!TYPE_MISMATCH!>ImplicitIndirect.foo<!>) // should be an error
|
|
takeInt(<!TYPE_MISMATCH!>ImplicitIndirect.bar<!>) // should be an error
|
|
takeInt(ImplicitIndirect.baz)
|
|
}
|