8dee3c1ca0
This is already the case for straightline code such as
```
inline fun <R> f(size: Int, block: () -> R): R {
var result: R
result = block()
return result
}
```
However, if the local variable introduction happens at a merge
point as in the following example, we allow the unboxing but
only do it halfway. The initialization of the local is still
done with a null value.
```
inline fun <R> f(size: Int, block: () -> R): R {
var result: R
while (true) {
result = block()
if (size == 0) break
}
return result
}
```
This change disallows unboxing for this move complicated
case as well by bailing out if a local use is with a
TaintedBoxedValue (merge of Object and Integer).
^KT-48394 Fixed.
15 lines
275 B
Kotlin
Vendored
15 lines
275 B
Kotlin
Vendored
inline fun <R> f(size: Int, block: () -> R): R {
|
|
var result: R
|
|
while (true) {
|
|
result = block()
|
|
if (size == 0) break
|
|
}
|
|
return result
|
|
}
|
|
|
|
fun computeResult(size: Int) = f(size) {
|
|
42
|
|
}
|
|
|
|
fun box() = if (computeResult(0) == 42) "OK" else "FAIL"
|