[FIR] Implement checks for contract not allowed

^KT-55423 Fixed
This commit is contained in:
Kirill Rakhman
2023-02-08 12:03:36 +01:00
committed by Space Team
parent b2fbf8bed5
commit f946ddeb40
50 changed files with 377 additions and 178 deletions
@@ -6,7 +6,7 @@ import kotlin.contracts.*
// TESTCASE NUMBER: 1
fun case_1() {
val fun_1 = fun(block: () -> Unit) {
contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }
<!CONTRACT_NOT_ALLOWED!>contract<!> { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }
return block()
}
@@ -17,7 +17,7 @@ fun case_1() {
// TESTCASE NUMBER: 2
fun case_2() {
val lambda_1 = { block: () -> Unit ->
contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }
<!CONTRACT_NOT_ALLOWED!>contract<!> { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }
block()
}
@@ -43,7 +43,7 @@ class case_4 : ClassLevel3() {
fun <T>T.case_4_3_wrap() {
fun case_4_3_contract() {
contract { returns() implies (this@case_4_3_wrap is ClassLevel1) }
<!CONTRACT_NOT_ALLOWED!>contract<!> { <!ERROR_IN_CONTRACT_DESCRIPTION!>returns() implies (this@case_4_3_wrap is ClassLevel1)<!> }
if (this@case_4_3_wrap !is ClassLevel1) throw Exception()
}
case_4_3_contract()
@@ -6,7 +6,7 @@ import kotlin.contracts.*
// TESTCASE NUMBER: 1
val Boolean.case_1: () -> Unit
get() {
contract {
<!CONTRACT_NOT_ALLOWED!>contract<!> {
returns() implies (this@case_1)
}
return {}
@@ -15,7 +15,7 @@ val Boolean.case_1: () -> Unit
// TESTCASE NUMBER: 2
val (() -> Unit).case_2: () -> Unit
get() {
contract {
<!CONTRACT_NOT_ALLOWED!>contract<!> {
callsInPlace(this@case_2, InvocationKind.EXACTLY_ONCE)
}
return {}
@@ -27,7 +27,7 @@ var Boolean.case_3: () -> Unit
return {}
}
set(value) {
<!WRONG_INVOCATION_KIND!>contract {
<!WRONG_INVOCATION_KIND!><!CONTRACT_NOT_ALLOWED!>contract<!> {
callsInPlace(value, InvocationKind.EXACTLY_ONCE)
}<!>
}
@@ -38,7 +38,7 @@ var (() -> Unit).case_4: () -> Unit
return {}
}
set(value) {
contract {
<!CONTRACT_NOT_ALLOWED!>contract<!> {
callsInPlace(this@case_4, InvocationKind.EXACTLY_ONCE)
}
}
@@ -46,7 +46,7 @@ var (() -> Unit).case_4: () -> Unit
// TESTCASE NUMBER: 5
val Boolean.case_5: () -> Unit
get() {
contract {
<!CONTRACT_NOT_ALLOWED!>contract<!> {
returns() implies (this@case_5)
}