import kotlin.reflect.KProperty class TypeInference { val explicitTypes by providerFun() val withoutTypes: String by providerFun() } class Inv(val x: T) fun T.providerFun() = object : DelegateProvider() { override fun provideDelegate(thisRef: T, property: KProperty<*>): Inv { return Inv("OK") as Inv } } operator fun Inv.getValue(thisRef: Any?, property: KProperty<*>): T = x abstract class DelegateProvider { abstract operator fun provideDelegate( thisRef: T, property: KProperty<*> ): Inv } fun box(): String { val t = TypeInference() if (t.explicitTypes != t.withoutTypes) return "fail 1" return t.withoutTypes }