8cc5f2abfb
unless the lambda is inline. This way, final field will remain final.
61 lines
1.3 KiB
Kotlin
Vendored
61 lines
1.3 KiB
Kotlin
Vendored
// !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect
|
|
// !USE_EXPERIMENTAL: kotlin.internal.ContractsDsl
|
|
|
|
import kotlin.contracts.*
|
|
|
|
@kotlin.contracts.ExperimentalContracts
|
|
inline fun inlineMe(block: () -> Unit) {
|
|
contract {
|
|
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
|
|
}
|
|
block()
|
|
}
|
|
|
|
@kotlin.contracts.ExperimentalContracts
|
|
inline fun crossinlineMe(crossinline block: () -> Unit) {
|
|
contract {
|
|
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
|
|
}
|
|
block()
|
|
}
|
|
|
|
@Suppress("NOTHING_TO_INLINE")
|
|
@kotlin.contracts.ExperimentalContracts
|
|
inline fun noinlineMe(noinline block: () -> Unit) {
|
|
contract {
|
|
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
|
|
}
|
|
block()
|
|
}
|
|
|
|
@kotlin.contracts.ExperimentalContracts
|
|
fun notinline(block: () -> Unit) {
|
|
contract {
|
|
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
|
|
}
|
|
block()
|
|
}
|
|
|
|
@kotlin.contracts.ExperimentalContracts
|
|
class Test {
|
|
val a: String
|
|
val b: String
|
|
val c: String
|
|
val d: String
|
|
|
|
init {
|
|
inlineMe {
|
|
a = "allowed"
|
|
}
|
|
crossinlineMe {
|
|
b = "not allowed"
|
|
}
|
|
noinlineMe {
|
|
c = "not allowed"
|
|
}
|
|
notinline {
|
|
d = "not allowed"
|
|
}
|
|
}
|
|
}
|