[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,14 +6,14 @@ import kotlin.contracts.*
// TESTCASE NUMBER: 1
inline fun case_1(block: () -> Unit) {
val value_1 = 1
contract { }
<!CONTRACT_NOT_ALLOWED!>contract<!> { }
return block()
}
// TESTCASE NUMBER: 2
inline fun case_2(block: () -> Unit) {
10 - 1
contract {
<!CONTRACT_NOT_ALLOWED!>contract<!> {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}
return block()
@@ -22,7 +22,7 @@ inline fun case_2(block: () -> Unit) {
// TESTCASE NUMBER: 3
inline fun case_3(block: () -> Unit) {
throw Exception()
contract {
<!CONTRACT_NOT_ALLOWED!>contract<!> {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.UNKNOWN)
}
return block()
@@ -34,7 +34,7 @@ inline fun case_3(block: () -> Unit) {
*/
inline fun case_4(block: () -> Unit) {
.0009
return contract {
return <!CONTRACT_NOT_ALLOWED!>contract<!> {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}
}
@@ -45,7 +45,7 @@ inline fun case_4(block: () -> Unit) {
*/
fun case_5(value_1: Int?) {
println("!")
contract {
<!CONTRACT_NOT_ALLOWED!>contract<!> {
returns(true) implies (value_1 != null)
} <!CAST_NEVER_SUCCEEDS!>as<!> ContractBuilder
}
@@ -56,7 +56,7 @@ fun case_5(value_1: Int?) {
*/
fun case_6(value_1: Int?) {
100 + 10
throw Exception(contract {
throw Exception(<!CONTRACT_NOT_ALLOWED!>contract<!> {
returns(true) implies (value_1 != null)
}.toString())
}
@@ -69,7 +69,7 @@ fun case_7(value_1: Int?) {
for (i in 0..10) {
println(i)
}
return contract {
return <!CONTRACT_NOT_ALLOWED!>contract<!> {
returns(true) implies (value_1 != null)
}
}
@@ -80,7 +80,7 @@ fun case_7(value_1: Int?) {
*/
fun case_8(value_1: Int?) {
val f = 10 - 20
val g = contract {
val g = <!CONTRACT_NOT_ALLOWED!>contract<!> {
returns(true) implies (value_1 != null)
}
}
@@ -91,7 +91,7 @@ fun case_8(value_1: Int?) {
*/
fun case_9(number: Int?): Boolean {
val value_1 = number != null
contract {
<!CONTRACT_NOT_ALLOWED!>contract<!> {
returns(false) implies (value_1)
} <!CAST_NEVER_SUCCEEDS!>as<!> ContractBuilder
return number == null
@@ -5,17 +5,17 @@ import kotlin.contracts.*
// TESTCASE NUMBER: 1
inline fun case_1(block: () -> Unit) {
return contract {
return <!CONTRACT_NOT_ALLOWED!>contract<!> {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}
}
// TESTCASE NUMBER: 2
fun case_2() = contract { }
fun case_2() = <!CONTRACT_NOT_ALLOWED!>contract<!> { }
// TESTCASE NUMBER: 3
inline fun case_3(block: () -> Unit) {
val value_1 = contract {
val value_1 = <!CONTRACT_NOT_ALLOWED!>contract<!> {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}
block()
@@ -39,14 +39,14 @@ inline fun case_5(block: () -> Unit) {
// TESTCASE NUMBER: 6
inline fun case_6(block: () -> Unit) {
throw Exception(contract {
throw Exception(<!CONTRACT_NOT_ALLOWED!>contract<!> {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}.toString())
}
// TESTCASE NUMBER: 7
inline fun case_7(block: () -> Unit) {
funWithAnyArg(contract {
funWithAnyArg(<!CONTRACT_NOT_ALLOWED!>contract<!> {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
})
}
@@ -1,47 +0,0 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
// !OPT_IN: kotlin.contracts.ExperimentalContracts
import kotlin.contracts.*
// TESTCASE NUMBER: 1
fun case_1(value_1: Int?) {
println("!")
contract {
returns(true) implies (value_1 != null)
} <!CAST_NEVER_SUCCEEDS!>as<!> ContractBuilder
}
// TESTCASE NUMBER: 2
fun case_2(value_1: Int?) {
100 + 10
throw Exception(contract {
returns(true) implies (value_1 != null)
}.toString())
}
// TESTCASE NUMBER: 3
fun case_3(value_1: Int?) {
for (i in 0..10) {
println(i)
}
return contract {
returns(true) implies (value_1 != null)
}
}
// TESTCASE NUMBER: 4
fun case_4(value_1: Int?) {
val f = 10 - 20
val g = contract {
returns(true) implies (value_1 != null)
}
}
// TESTCASE NUMBER: 5
fun case_5(number: Int?): Boolean {
val value_1 = number != null
contract {
returns(false) implies (value_1)
} <!CAST_NEVER_SUCCEEDS!>as<!> ContractBuilder
return number == null
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_VARIABLE
// !OPT_IN: kotlin.contracts.ExperimentalContracts
@@ -38,7 +38,7 @@ fun case_5(): Boolean? {
// TESTCASE NUMBER: 6
fun case_6(value_1: Boolean): Boolean? {
contract { <!ERROR_IN_CONTRACT_DESCRIPTION!>returns(null) implies <!ARGUMENT_TYPE_MISMATCH!>contract { returns(null) implies (!value_1) }<!><!> }
contract { <!ERROR_IN_CONTRACT_DESCRIPTION!>returns(null) implies <!ARGUMENT_TYPE_MISMATCH!><!CONTRACT_NOT_ALLOWED!>contract<!> { returns(null) implies (!value_1) }<!><!> }
return null
}
@@ -36,7 +36,7 @@ class case_2(value_5: Boolean, val value_1: Boolean) {
init {
fun case_2_1(): Boolean {
contract { returns(false) implies (value_5) }
<!CONTRACT_NOT_ALLOWED!>contract<!> { <!ERROR_IN_CONTRACT_DESCRIPTION!>returns(false) implies (value_5)<!> }
return !(value_5)
}
}
@@ -6,7 +6,7 @@ import kotlin.contracts.*
// TESTCASE NUMBER: 1
fun <T> T?.case_1() {
fun <K> K?.case_1_1(): Boolean {
contract { returns(true) implies (this@case_1 != null) }
<!CONTRACT_NOT_ALLOWED!>contract<!> { <!ERROR_IN_CONTRACT_DESCRIPTION!>returns(true) implies (this@case_1 != null)<!> }
return this@case_1 != null
}
}
@@ -5,7 +5,7 @@ import kotlin.contracts.*
// TESTCASE NUMBER: 1
inline fun case_1(block: () -> Unit) = {
contract {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
<!CONTRACT_NOT_ALLOWED!>contract<!> {
<!ERROR_IN_CONTRACT_DESCRIPTION!>callsInPlace(block, InvocationKind.EXACTLY_ONCE)<!>
}
}
@@ -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)
}