83 lines
1.4 KiB
Kotlin
Vendored
83 lines
1.4 KiB
Kotlin
Vendored
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
|
// FIR_IDENTICAL
|
|
// WITH_STDLIB
|
|
|
|
// MODULE: lib
|
|
// FILE: lib.kt
|
|
|
|
val lock = Any()
|
|
|
|
inline fun inlineMe(c: () -> Unit) {
|
|
synchronized(lock) {
|
|
c()
|
|
}
|
|
}
|
|
|
|
inline fun monitorInFinally(a: () -> Unit, b: () -> Unit) {
|
|
try {
|
|
a()
|
|
} finally {
|
|
synchronized(lock) {
|
|
b()
|
|
}
|
|
}
|
|
}
|
|
|
|
// MODULE: main(lib)
|
|
// FILE: main.kt
|
|
|
|
fun builder(c: suspend () -> Unit) {}
|
|
|
|
suspend fun suspensionPoint() {}
|
|
|
|
fun test() {
|
|
builder <!SUSPENSION_POINT_INSIDE_MONITOR!>{
|
|
inlineMe {
|
|
suspensionPoint()
|
|
}
|
|
}<!>
|
|
|
|
builder <!SUSPENSION_POINT_INSIDE_MONITOR!>{
|
|
monitorInFinally(
|
|
{},
|
|
{ suspensionPoint() }
|
|
)
|
|
}<!>
|
|
|
|
builder {
|
|
withCrossinline {}
|
|
|
|
withCrossinline {
|
|
suspensionPoint()
|
|
}
|
|
}
|
|
|
|
synchronized(lock) {
|
|
builder {
|
|
suspensionPoint()
|
|
}
|
|
}
|
|
|
|
synchronized(lock) {
|
|
object : SuspendRunnable {
|
|
override suspend fun run() {
|
|
suspensionPoint()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
interface SuspendRunnable {
|
|
suspend fun run()
|
|
}
|
|
|
|
|
|
<!SUSPENSION_POINT_INSIDE_MONITOR!>inline fun withCrossinline(crossinline a: suspend () -> Unit): suspend () -> Unit {
|
|
val c : suspend () -> Unit = <!SUSPENSION_POINT_INSIDE_MONITOR!>{
|
|
inlineMe {
|
|
a()
|
|
}
|
|
}<!>
|
|
return c
|
|
}<!>
|