[FIR] Fix Disappeared CONTRACT_NOT_ALLOWED

https://youtrack.jetbrains.com/issue/KT-60004/K2-Disappeared-CONTRACTNOTALLOWED

Merge-request: KT-MR-12613
Merged-by: Vladimir Sukharev <Vladimir.Sukharev@jetbrains.com>
This commit is contained in:
Vladimir Sukharev
2023-11-02 20:47:05 +00:00
committed by Space Team
parent 834927a901
commit 0fb853a995
25 changed files with 564 additions and 9 deletions
@@ -0,0 +1,23 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
// !OPT_IN: kotlin.contracts.ExperimentalContracts
/*
* ADDITION TO `KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (NEGATIVE)`
*
* SECTIONS: contracts, declarations, contractBuilder, common
* NUMBER: 14
* DESCRIPTION: Contract is first statement in control flow terms, but not in tokens order terms.
* ISSUES: KT-26153
* HELPERS: functions
*/
import kotlin.contracts.*
// TESTCASE NUMBER: 8
val myProp = 8
inline fun case_8(block: () -> Unit) {
myProp
<!CONTRACT_NOT_ALLOWED!>contract<!> {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}
}
+23
View File
@@ -0,0 +1,23 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
// !OPT_IN: kotlin.contracts.ExperimentalContracts
/*
* ADDITION TO `KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (NEGATIVE)`
*
* SECTIONS: contracts, declarations, contractBuilder, common
* NUMBER: 14
* DESCRIPTION: Contract is first statement in control flow terms, but not in tokens order terms.
* ISSUES: KT-26153
* HELPERS: functions
*/
import kotlin.contracts.*
// TESTCASE NUMBER: 8
val myProp = 8
inline fun case_8(block: () -> Unit) {
myProp
<!CONTRACT_NOT_ALLOWED!>contract<!> {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
}
+20
View File
@@ -0,0 +1,20 @@
// FIR_IDENTICAL
// !OPT_IN: kotlin.contracts.ExperimentalContracts
/*
* ADDITION TO `KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (POSITIVE)`
*
* SECTIONS: contracts, declarations, contractBuilder, common
* NUMBER: 1
* DESCRIPTION: Functions with simple contracts.
*/
import kotlin.contracts.*
// The following is an useful addition to testcases in compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractBuilder/common/pos/1.kt
// TESTCASE NUMBER: 4
inline fun case_4(block: () -> Unit) {
kotlin.contracts.contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }
return block()
}
@@ -0,0 +1,82 @@
// KT-60004: Ensure diagnostics for `kotlin.contracts.contract()` are not raised for user-defined fun `contract()`
// !DIAGNOSTICS: -UNUSED_VARIABLE
// !OPT_IN: kotlin.contracts.ExperimentalContracts
/*
* POSITIVE ADDITION TO `KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (NEGATIVE)`
*
* SECTIONS: contracts, declarations, contractBuilder, common
* NUMBER: 14UserDefined
* DESCRIPTION: Invocation of user-defined fun `contract()` is first statement in control flow terms, but not in tokens order terms.
* ISSUES: KT-60004
* HELPERS: functions
*/
import kotlin.contracts.ContractBuilder
import kotlin.contracts.InvocationKind
// User-defined fun `contract()` must not be mixed up with `kotlin.contracts.contract()`
inline fun contract(builder: ContractBuilder.() -> Unit) {}
// TESTCASE NUMBER: 1
inline fun case_1(block: () -> Unit) {
return contract {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}
}
// TESTCASE NUMBER: 2
fun case_2() = contract { }
// TESTCASE NUMBER: 3
inline fun case_3(block: () -> Unit) {
val value_1 = contract {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}
block()
}
// TESTCASE NUMBER: 4
inline fun case_4(block: () -> Unit) {
(contract {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
})
return block()
}
// TESTCASE NUMBER: 5
inline fun case_5(block: () -> Unit) {
test@ contract {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}
return block()
}
// TESTCASE NUMBER: 6
inline fun case_6(block: () -> Unit) {
throw Exception(contract {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}.toString())
}
// TESTCASE NUMBER: 7
inline fun case_7(block: () -> Unit) {
funWithAnyArg(contract {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
})
}
// TESTCASE NUMBER: 8
val myProp = 8
inline fun case_8(block: () -> Unit) {
myProp
contract {
callsInPlace(<!USAGE_IS_NOT_INLINABLE!>block<!>, InvocationKind.EXACTLY_ONCE)
}
}
// Copy-pasted from compiler/tests-spec/testData/diagnostics/helpers/functions.kt
fun funWithAnyArg(value_1: Any): Int {
return value_1.hashCode()
}
@@ -0,0 +1,82 @@
// KT-60004: Ensure diagnostics for `kotlin.contracts.contract()` are not raised for user-defined fun `contract()`
// !DIAGNOSTICS: -UNUSED_VARIABLE
// !OPT_IN: kotlin.contracts.ExperimentalContracts
/*
* POSITIVE ADDITION TO `KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (NEGATIVE)`
*
* SECTIONS: contracts, declarations, contractBuilder, common
* NUMBER: 14UserDefined
* DESCRIPTION: Invocation of user-defined fun `contract()` is first statement in control flow terms, but not in tokens order terms.
* ISSUES: KT-60004
* HELPERS: functions
*/
import kotlin.contracts.ContractBuilder
import kotlin.contracts.InvocationKind
// User-defined fun `contract()` must not be mixed up with `kotlin.contracts.contract()`
inline fun contract(builder: ContractBuilder.() -> Unit) {}
// TESTCASE NUMBER: 1
inline fun case_1(block: () -> Unit) {
return contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
}
// TESTCASE NUMBER: 2
fun case_2() = contract { }
// TESTCASE NUMBER: 3
inline fun case_3(block: () -> Unit) {
val value_1 = contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
}
// TESTCASE NUMBER: 4
inline fun case_4(block: () -> Unit) {
(contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
})
return block()
}
// TESTCASE NUMBER: 5
inline fun case_5(block: () -> Unit) {
<!REDUNDANT_LABEL_WARNING!>test@<!> contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
// TESTCASE NUMBER: 6
inline fun case_6(block: () -> Unit) {
throw Exception(contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}.toString())
}
// TESTCASE NUMBER: 7
inline fun case_7(block: () -> Unit) {
funWithAnyArg(contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
})
}
// TESTCASE NUMBER: 8
val myProp = 8
inline fun case_8(block: () -> Unit) {
myProp
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
}
// Copy-pasted from compiler/tests-spec/testData/diagnostics/helpers/functions.kt
fun funWithAnyArg(value_1: Any): Int {
return value_1.hashCode()
}