K2: Fix ISE from inference on delegate vars with implicit types

See the test data.
ISE happened because at some point after incomplete `getValue` resolution
of `a` property, we updated in the `transformAccessors` the property type
to the `Variable(Y)` type and then used it as a 3rd argument for
`setValue` call which is incorrect because the variable belongs
to a different constraint system (from `getValue`).

Mostly, the fix is just a repeating K1 behavior, namely postponing
`setValue` resolution until delegate inference is completed.

^KT-59066 Fixed
This commit is contained in:
Denis.Zharkov
2023-06-09 11:36:47 +02:00
committed by Space Team
parent b8c4a4c80a
commit 41933facbb
9 changed files with 175 additions and 7 deletions
@@ -0,0 +1,24 @@
import kotlin.reflect.KProperty
// Definitions
class M<E>
operator fun <X> M<out X>.getValue(thisRef: Any?, property: KProperty<*>): String = "value"
operator fun <Z> M<in Z>.setValue(thisRef: Any?, property: KProperty<*>, value: Z) {}
fun <U> m(): M<U> = M()
// We don't allow to infer type of a delegate expression through a setValue, where the argument (value) is constrained by the return type of a getValue
var a by <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>m<!>()
// We infer type of delegate expression through a setValue from the explicit property type
var b: String by m()
fun takeString(v: String) {}
fun main() {
takeString(a)
a = "a"
takeString(b)
b = "b"
}