Do not coerce function literals to suspend.
The design is to use `suspend fun` instead of coercion, just as suspend lambdas. However, this syntax is not supported in the parser. But this is not a problem, since the coercion lead to internal compiler error. As a workaround everybody uses suspend lambdas. #KT-24860: Fixed
This commit is contained in:
committed by
Ilya Gorbunov
parent
d57e1bb68b
commit
9df411481c
+29
@@ -0,0 +1,29 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
fun fail1(c: suspend () -> Unit) {}
|
||||
|
||||
fun fail2(c: () -> Unit) {}
|
||||
|
||||
fun success1(c: suspend () -> Unit) {}
|
||||
|
||||
fun test1() {
|
||||
fail1(<!TYPE_MISMATCH!>fun () {}<!>)
|
||||
fun fail2(c: suspend () -> Unit) {}
|
||||
fail2(<!TYPE_MISMATCH!>fun () {}<!>)
|
||||
fun success1(c: () -> Unit) {}
|
||||
success1(fun() {})
|
||||
}
|
||||
|
||||
suspend fun fail3(c: suspend () -> Unit) {}
|
||||
|
||||
suspend fun fail4(c: () -> Unit) {}
|
||||
|
||||
suspend fun success2(c: suspend () -> Unit) {}
|
||||
|
||||
suspend fun test2() {
|
||||
fail3(<!TYPE_MISMATCH!>fun () {}<!>)
|
||||
fun fail4(c: suspend () -> Unit) {}
|
||||
fail4(<!TYPE_MISMATCH!>fun () {}<!>)
|
||||
fun success2(c: () -> Unit) {}
|
||||
success2(fun() {})
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
package
|
||||
|
||||
public fun fail1(/*0*/ c: suspend () -> kotlin.Unit): kotlin.Unit
|
||||
public fun fail2(/*0*/ c: () -> kotlin.Unit): kotlin.Unit
|
||||
public suspend fun fail3(/*0*/ c: suspend () -> kotlin.Unit): kotlin.Unit
|
||||
public suspend fun fail4(/*0*/ c: () -> kotlin.Unit): kotlin.Unit
|
||||
public fun success1(/*0*/ c: suspend () -> kotlin.Unit): kotlin.Unit
|
||||
public suspend fun success2(/*0*/ c: suspend () -> kotlin.Unit): kotlin.Unit
|
||||
public fun test1(): kotlin.Unit
|
||||
public suspend fun test2(): kotlin.Unit
|
||||
Vendored
+4
-5
@@ -1,10 +1,9 @@
|
||||
// !WITH_NEW_INFERENCE
|
||||
typealias SuspendFn = suspend () -> Unit
|
||||
|
||||
val test1f: suspend () -> Unit = fun () {}
|
||||
val test2f: suspend Any.() -> Unit = fun Any.() {}
|
||||
val test1f: suspend () -> Unit = <!TYPE_MISMATCH!>fun () {}<!>
|
||||
val test2f: suspend Any.() -> Unit = <!TYPE_MISMATCH!>fun Any.() {}<!>
|
||||
|
||||
// This is a bug in the old inference and should be fixed in new inference
|
||||
// see "Fix anonymous function literals handling in type checker" for more deatils
|
||||
val test3f: suspend Any.(Int) -> Int = <!OI;TYPE_MISMATCH!>fun (k: Int) = k + 1<!>
|
||||
val test4f: SuspendFn = <!OI;TYPE_MISMATCH!>fun Any.() {}<!>
|
||||
val test3f: suspend Any.(Int) -> Int = <!TYPE_MISMATCH!>fun (k: Int) = k + 1<!>
|
||||
val test4f: SuspendFn = <!TYPE_MISMATCH!>fun Any.() {}<!>
|
||||
Reference in New Issue
Block a user