FIR CFG: do not assume all arguments to inline funs are called in place

Only values for non-noinline, non-crossinline, functional type
parameters qualify.
This commit is contained in:
pyos
2022-11-23 16:02:11 +01:00
committed by teamcity
parent 39f88b9e87
commit d66be3f82d
17 changed files with 165 additions and 112 deletions
@@ -0,0 +1,38 @@
inline fun callsInPlaceInline(x: () -> Unit) = x()
<!NOTHING_TO_INLINE!>inline<!> fun <T> any(x: T) = x
<!NOTHING_TO_INLINE!>inline<!> fun noinline(noinline x: () -> Unit) = x
inline fun crossinline(crossinline x: () -> Unit) = { x() }
fun testInline() {
var x: String? = null
callsInPlaceInline { x = null }
x = ""
x.length // ok
}
fun testGeneric() {
var x: String? = ""
val lambda = any { x = null }
x = ""
lambda()
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
fun testNoinline() {
var x: String? = ""
val lambda = noinline { x = null }
x = ""
lambda()
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
fun testCrossinline() {
var x: String? = ""
val lambda = crossinline { x = null }
x = ""
lambda()
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}