| // !LANGUAGE: +AllowContractsForCustomFunctions +UseCallsInPlaceEffect | |
| // !OPT_IN: kotlin.contracts.ExperimentalContracts | |
| import kotlin.contracts.* | |
| inline fun <T> myRun(block: () -> T): T { | |
| contract { | |
| callsInPlace(block, InvocationKind.EXACTLY_ONCE) | |
| } | |
| return block() | |
| } | |
| fun someComputation(): Int = 42 | |
| fun report(x: Int) = Unit | |
| fun innerTryCatchFinally() { | |
| val x: Int | |
| myRun { | |
| try { | |
| x = someComputation() | |
| report(x) | |
| } catch (e: java.lang.Exception) { | |
| x = 42 | |
| report(x) | |
| } finally { | |
| x = 0 | |
| } | |
| } | |
| x.inc() | |
| } |