Files
kotlin-fork/compiler/testData/diagnostics/tests/smartCasts/variables/capturedLoopVariable.kt
T
Brian Norman e3ddeff230 [FIR] Track local variable assigned types for smartcast stability
When a lambda captures a local variable without a contract, future
assignments can impact the smartcast stability for that variable within
the lambda. Because future assignments can appear in both resolved and
unresolved code, track each assignment as encountered. To determine if
a smartcast can be considered stable, check that all future assignments
are resolved and do not revert variable to a super type.

^KT-58191 Fixed
2024-02-14 17:44:53 +00:00

112 lines
2.6 KiB
Kotlin
Vendored

// SKIP_TXT
// ISSUE: KT-55338
fun test_1() {
var s: String? = null
for (i in 1..10) {
if (s == null) {
s = "hello"
}
<!DEBUG_INFO_SMARTCAST!>s<!>.length // smartcast in K1 and K2
noInlineRun { <!DEBUG_INFO_SMARTCAST!>s<!>.length } // smartcast in K1 and K2
}
}
fun test_2_1() {
var s: String? = null
for (i in 1..10) {
if (s == null) {
s = "hello"
}
<!DEBUG_INFO_SMARTCAST!>s<!>.length // smartcast in K1 and K2
noInlineRun { <!SMARTCAST_IMPOSSIBLE!>s<!>.length } // unsafe call in K1 and K2
s = ""
}
}
fun test_2_2() {
var s: String? = null
for (i in 1..10) {
if (s == null) {
s = "hello"
}
<!DEBUG_INFO_SMARTCAST!>s<!>.length // smartcast in K1 and K2
noInlineRun { <!SMARTCAST_IMPOSSIBLE!>s<!>.length } // unsafe call in K1 and K2
s = null
}
}
fun test_3_1() {
var s: String? = null
for (i in 1..10) {
if (s == null) {
s = "hello"
} else {
s = null
}
s<!UNSAFE_CALL!>.<!>length // unsafe call in K1 and K2
noInlineRun { s<!UNSAFE_CALL!>.<!>length } // unsafe call in K1 and K2
}
}
fun test_3_2() {
var s: String? = null
for (i in 1..10) {
if (s == null) {
s = "hello"
} else {
s = "world"
}
<!DEBUG_INFO_SMARTCAST!>s<!>.length // smartcast in K1 and K2
noInlineRun { <!DEBUG_INFO_SMARTCAST!>s<!>.length } // smartcast in K1 and K2
}
}
fun test_4_1() {
var s: String? = null
for (i in 1..10) {
if (s == null) {
s = getString()
} else {
s = getNullableString()
}
s<!UNSAFE_CALL!>.<!>length // unsafe call in K1 and K2
noInlineRun { s<!UNSAFE_CALL!>.<!>length } // unsafe call in K1 and K2
}
}
fun test_4_2() {
var s: String? = null
for (i in 1..10) {
if (s == null) {
s = getString()
} else {
s = getString()
}
<!DEBUG_INFO_SMARTCAST!>s<!>.length // smartcast in K1 and K2
noInlineRun { <!DEBUG_INFO_SMARTCAST!>s<!>.length } // smartcast in K1 and K2
}
}
fun test_5() {
var s: String? = <!VARIABLE_WITH_REDUNDANT_INITIALIZER!>null<!>
for (i in 1..10) {
s = null
s = getString()
<!DEBUG_INFO_SMARTCAST!>s<!>.length // smartcast in K1 and K2
noInlineRun { <!DEBUG_INFO_SMARTCAST!>s<!>.length } // smartcast in K1, unsafe call in K2
}
}
fun getNullableString(): String? = null
fun getString(): String = "hello"
fun noInlineRun(block: () -> Unit) {}