Inference: handle Exact constraints with captured types properly

#KT-41818 Fixed
This commit is contained in:
Mikhail Glukhikh
2021-04-15 15:55:41 +03:00
parent 51d348d5fa
commit 9b3f1b9b8a
9 changed files with 80 additions and 3 deletions
@@ -0,0 +1,18 @@
FILE: implicitNothingInDelegate.kt
@R|kotlin/Suppress|(vararg(String(INVISIBLE_REFERENCE))) public final operator fun <V, V1 : R|V|> R|kotlin/collections/Map<in kotlin/String, @Exact V>|.getValue(thisRef: R|kotlin/Any?|, property: R|kotlin/reflect/KProperty<*>|): R|V1| {
^getValue Null(null)!!
}
public final val m2: R|kotlin/collections/Map<kotlin/String, *>| = R|kotlin/collections/mapOf|<R|kotlin/String|, R|kotlin/String|>(String(baz).R|kotlin/to|<R|kotlin/String|, R|kotlin/String|>(String(bat)))
public get(): R|kotlin/collections/Map<kotlin/String, *>|
public final val bar: R|kotlin/String|
public get(): R|kotlin/String| {
^ R|/m2|.R|/getValue|<R|kotlin/Any?|, R|kotlin/String|>(Null(null), ::R|/bar|)
}
public final fun foo(): R|kotlin/Unit| {
lval m1: R|kotlin/collections/Map<kotlin/String, kotlin/Any>| = R|kotlin/collections/mapOf|<R|kotlin/String|, R|kotlin/String|>(String(foo).R|kotlin/to|<R|kotlin/String|, R|kotlin/String|>(String(bar)))
lval foo: R|kotlin/String|by R|<local>/m1|
lval baz: R|kotlin/String|by R|/m2|
R|kotlin/io/println|(R|<local>/foo|)
R|kotlin/io/println|(R|<local>/baz|)
R|kotlin/io/println|(R|/bar|)
}
@@ -0,0 +1,20 @@
// FIR_IDENTICAL
// FIR_DUMP
// WITH_REFLECT
import kotlin.reflect.KProperty
@Suppress("INVISIBLE_REFERENCE")
public operator fun <V, V1 : V> Map<in String, @kotlin.internal.Exact V>.getValue(thisRef: Any?, property: KProperty<*>): V1 = null!!
val m2: Map<String, *> = mapOf("baz" to "bat")
val bar: String get() = m2.getValue(null, ::bar)
fun foo() {
val m1: Map<String, Any> = mapOf("foo" to "bar")
val foo: String by m1
val baz: String by m2
println(foo) // bar
println(baz) // kotlin.KotlinNothingValueException
println(bar)
}
@@ -0,0 +1,7 @@
package
public val bar: kotlin.String
public val m2: kotlin.collections.Map<kotlin.String, *>
public fun foo(): kotlin.Unit
@kotlin.Suppress(names = {"INVISIBLE_REFERENCE"}) public operator fun </*0*/ V, /*1*/ V1 : V> kotlin.collections.Map<in kotlin.String, V>.getValue(/*0*/ thisRef: kotlin.Any?, /*1*/ property: kotlin.reflect.KProperty<*>): V1