// RUN_PIPELINE_TILL: BACKEND
// LANGUAGE: +DefinitelyNonNullableTypes

import kotlin.reflect.KProperty1

class Mem
class Ext

class Foo<T> {
    fun foo(prop: KProperty1<T & Any, *>): Mem = Mem()
}
fun <T> Foo<T>.bar(prop: KProperty1<T & Any, *>): Ext = Ext()

class Bar<T> {
    fun bar(prop: KProperty1<T & Any, *>): Mem = Mem()
}
fun <T> Bar<T>.bar(prop: KProperty1<T & Any, *>): Ext = Ext()

class Baz<T> {
    fun baz(prop: KProperty1<T, *>): Mem = Mem()
}
fun <T> Baz<T>.baz(prop: KProperty1<T & Any, *>): Ext = Ext()

fun <T> id(t: T): T = t

fun main() {
    val r01: Mem = Foo<String?>().foo(String::length)
    val r02: Mem = Foo<String?>().foo(id(String::length))

    val r03: Ext = Foo<String?>().bar(String::length)
    val r04: Ext = Foo<String?>().bar(id(String::length))

    val r05: Mem = Bar<String?>().bar(String::length)
    val r06: Mem = Bar<String?>().bar(id(String::length))

    val r07 = <!DEBUG_INFO_EXPRESSION_TYPE("Ext")!>Baz<String?>().baz(String::length)<!>
    val r08: Ext = Baz<String?>().baz(id(String::length))
}

/* GENERATED_FIR_TAGS: callableReference, classDeclaration, dnnType, funWithExtensionReceiver, functionDeclaration,
localProperty, nullableType, propertyDeclaration, starProjection, typeParameter */
