456469eb3b
In general, `InliningContext.findAnonymousTransformationInfo` was not reliable because it mapped each type to *some* info for that type, preferring ones with `shouldRegenerate == true` if those exist. Thus, it returned incorrect results if one type was regenerated multiple times, e.g. in a nested inlining context or because of a `finally` (which duplicates anonymous objects). The solution is to avoid a global map and attach the current transformation info directly to the current inlining context.
28 lines
630 B
Kotlin
Vendored
28 lines
630 B
Kotlin
Vendored
// WITH_RUNTIME
|
|
// WITH_COROUTINES
|
|
// NO_CHECK_LAMBDA_INLINING
|
|
// FILE: 1.kt
|
|
package test
|
|
|
|
inline fun foo(crossinline x: () -> Unit) = suspend {
|
|
try { } finally {
|
|
// This object is regenerated twice (normal return & "catch Throwable, execute finally, and rethrow")
|
|
// It doesn't *need* to be, but this should work regardless.
|
|
{ x() }()
|
|
}
|
|
}
|
|
|
|
// FILE: 2.kt
|
|
import helpers.*
|
|
import kotlin.coroutines.*
|
|
import kotlin.coroutines.intrinsics.*
|
|
import test.*
|
|
|
|
var result = "fail"
|
|
fun box(): String {
|
|
suspend {
|
|
foo { result = "OK" }()
|
|
}.startCoroutine(EmptyContinuation)
|
|
return result
|
|
}
|