[FIR] Add ReturnsImplies effect analyzer

This commit is contained in:
Oleg Ivanov
2020-08-11 12:41:43 +03:00
parent 3454ae7ca4
commit 21b8679799
37 changed files with 1110 additions and 89 deletions
@@ -0,0 +1,32 @@
// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts
import kotlin.contracts.*
// TESTCASE NUMBER: 1
inline fun case_1(block: () -> Unit) {
contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }
return block()
}
// TESTCASE NUMBER: 2
inline fun case_2(value_1: Int?, block: () -> Unit): Boolean {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
returns(true) implies (value_1 != null)
}
block()
return value_1 != null
}
// TESTCASE NUMBER: 3
inline fun <T> T?.case_3(value_1: Int?, value_2: Boolean, value_3: Int?, block: () -> Unit): Boolean? {
<!WRONG_IMPLIES_CONDITION!>contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
returns(true) implies (value_1 != null)
returns(false) implies (!value_2)
returnsNotNull() implies (this@case_3 != null && value_3 != null)
}<!>
block()
return value_1 != null
}
@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts
/*