// !LANGUAGE: +SuspendConversion fun useSuspend(sfn: suspend () -> Unit) {} fun useSuspendExt(sfn: suspend Int.() -> Unit) {} fun useSuspendArg(sfn: suspend (Int) -> Unit) {} fun useSuspendArgT(sfn: suspend (T) -> Unit) {} fun useSuspendExtT(sfn: suspend T.() -> Unit) {} fun produceFun(): () -> Unit = {} fun testSimple(fn: () -> Unit) { useSuspend(fn) } fun testSimpleNonVal() { useSuspend(produceFun()) } fun testExtAsExt(fn: Int.() -> Unit) { useSuspendExt(fn) } fun testExtAsSimple(fn: Int.() -> Unit) { useSuspendArg(fn) } fun testSimpleAsExt(fn: (Int) -> Unit) { useSuspendExt(fn) } fun testSimpleAsSimpleT(fn: (Int) -> Unit) { useSuspendArgT(fn) } fun testSimpleAsExtT(fn: (Int) -> Unit) { useSuspendExtT(fn) } fun testExtAsSimpleT(fn: Int.() -> Unit) { useSuspendArgT(fn) } fun testExtAsExtT(fn: Int.() -> Unit) { useSuspendExtT(fn) } fun testSimpleSAsSimpleT(fn: (S) -> Unit) { useSuspendArgT(fn) } fun testSimpleSAsExtT(fn: (S) -> Unit) { useSuspendExtT(fn) } fun testExtSAsSimpleT(fn: S.() -> Unit) { useSuspendArgT(fn) } fun testExtSAsExtT(fn: S.() -> Unit) { useSuspendExtT(fn) } fun testSmartCastWithSuspendConversion(a: Any) { a as () -> Unit useSuspend(a) } fun testSmartCastOnVarWithSuspendConversion(a: Any) { var b = a b as () -> Unit useSuspend(b) } fun testSmartCastVsSuspendConversion(a: () -> Unit) { a as suspend () -> Unit useSuspend(a) } fun testSmartCastOnVarVsSuspendConversion(a: () -> Unit) { var b = a b as suspend () -> Unit useSuspend(b) } fun testIntersectionVsSuspendConversion(x: T) where T : () -> Unit, T : suspend () -> Unit { useSuspend(x) }