Youssef Shoaib [MOD]
07/27/2022, 11:39 PMvalue is ValueClass checks and eliminates any branches that will never run as a result. This happens even in inline functions when value is of some type argument T. Is this optimization documented somewhere? because any other constant conditions never cause code to collapse like that. E.g.:
public inline fun <T : Any> printlnWithoutBoxing(value: T) {
// This `is` check gets inlined by the compiler if `value` is statically known to be Result
println(if(value is Result<*>) (value as Result<*>).toString() else value)
}
public fun test(){
val myResult = Result.success(42)
val myResultAny: Any = myResult
println(myResult)
println(myResultAny)
}
public fun test2(){
val myResult = Result.success(42)
val myResultAny: Any = myResult
printlnWithoutBoxing(myResult)
printlnWithoutBoxing(myResultAny)
}
The else branch disappears for the calls in test2, even in the myResultAny case! In fact, I have to use myResultAny as a "real" Any (i.e. pass it to a non-inline function that expects Any or a generic T, or pass it to an inline function that uses that argument as a "real" Any from the aforementioned criteria). The behavior is surprising, but it is useful. Is this how the compiler is expected to behave? (Decompilation of example in 🧵 )