Files
kotlin-fork/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/throwsEffect.fir.kt
T
Jinseong Jeon 8e10b5fdec FIR: introduce FirExpressionWithSmartcastToNull
This new kind of expression encompasses the nullability of the original
expression after null check (or equivalent `is Nothing?` check).

Unlike FirExpressionWithSmartcast, this expression won't be materialized
during conversion to backend IR. Also, Nothing? is discarded when
computing the intersection of possible types from smartcast info.
In that way, Nothing? is not used during resolution, while such
smartcast info is stored in it (and the expression kind itself).
2021-05-11 21:28:44 +03:00

67 lines
1.3 KiB
Kotlin
Vendored

// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect
// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
import kotlin.contracts.*
fun myAssert(condition: Boolean) {
contract {
returns() implies (condition)
}
if (!condition) throw kotlin.IllegalArgumentException("Assertion failed")
}
fun testAssertSmartcast(x: Any?) {
myAssert(x is String)
x.length
}
fun testInvertedAssert(x: Any?) {
myAssert(x !is String)
x.<!UNRESOLVED_REFERENCE!>length<!>
}
fun testSpilling(x: Any?) {
if (x != null) {
myAssert(x is String)
x.length
}
x<!UNSAFE_CALL!>.<!>length
}
fun testAssertInIf(x: Any?) {
if (myAssert(x is String) == Unit) {
x.length
}
else {
x.length
}
}
fun testTryCatch(x: Any?) {
try {
myAssert(x is String)
x.length
} catch (e: kotlin.IllegalArgumentException) {
}
x.<!UNRESOLVED_REFERENCE!>length<!>
}
fun testUncertainFlow(x: Any?) {
repeat(x.toString().length) {
myAssert(x is String)
x.length
}
x.<!UNRESOLVED_REFERENCE!>length<!>
}
fun testAtLeastOnceFlow(x: Any?) {
do {
myAssert(x is String)
x.length
} while (x != null)
x.length
}