// RUN_PIPELINE_TILL: BACKEND
// NB new inference doesn't really work with old JVM back-end.

// WITH_JDK
// FILE: samConversionsWithSmartCasts.kt

fun test1(a: () -> Unit) {
    if (a is Runnable) {
        J.runStatic(<!DEBUG_INFO_SMARTCAST!>a<!>)
    }
}

fun test2(a: () -> Unit) {
    if (a is Runnable) {
        J().run1(<!DEBUG_INFO_SMARTCAST!>a<!>)
    }
}

fun test3(a: () -> Unit) {
    if (a is Runnable) {
        J().run2(<!DEBUG_INFO_SMARTCAST!>a<!>, <!DEBUG_INFO_SMARTCAST!>a<!>)
    }
}

fun test4(a: () -> Unit, b: () -> Unit) {
    if (a is Runnable) {
        J().run2(<!DEBUG_INFO_SMARTCAST!>a<!>, b)
    }
}

fun test5(a: Any) {
    if (a is Runnable) {
        J().run1(<!DEBUG_INFO_SMARTCAST!>a<!>)
    }
}

fun test5x(a: Any) {
    if (a is Runnable) {
        a <!UNCHECKED_CAST!>as () -> Unit<!>
        J().run1(<!DEBUG_INFO_SMARTCAST!>a<!>)
    }
}

fun test6(a: Any) {
    a <!UNCHECKED_CAST!>as () -> Unit<!>
    J().run1(<!DEBUG_INFO_SMARTCAST!>a<!>)
}

fun test7(a: (Int) -> Int) {
    a <!UNCHECKED_CAST!>as () -> Unit<!>
    J().run1(<!DEBUG_INFO_SMARTCAST!>a<!>)
}

fun test8(a: () -> Unit) {
    J().run1(J.id(a))
}

fun test9() {
    J().run1(::test9)
}

// FILE: J.java
public class J {
    public static void runStatic(Runnable r) {}

    public void run1(Runnable r) {}

    public void run2(Runnable r1, Runnable r2) {}

    public static <T> T id(T x) { return x; }
}

/* GENERATED_FIR_TAGS: asExpression, callableReference, flexibleType, functionDeclaration, functionalType, ifExpression,
intersectionType, isExpression, javaFunction, javaType, samConversion, smartcast */
