KT-11499 Normalize stacks on return from an inline function when the function is inlined at call site.
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
// FILE: 1.kt
|
||||
fun foo(x: Any?, y: Any?) = null
|
||||
|
||||
inline fun test(value: Any?): String? {
|
||||
return foo(null, value ?: return null)
|
||||
}
|
||||
|
||||
// FILE: 2.kt
|
||||
fun box(): String =
|
||||
test(null) ?: "OK"
|
||||
@@ -0,0 +1,10 @@
|
||||
// FILE: 1.kt
|
||||
fun foo(x: Any?, y: Any?) = null
|
||||
|
||||
inline fun test(value: Any?): String? {
|
||||
return foo(null, if (value != null) value else return null)
|
||||
}
|
||||
|
||||
// FILE: 2.kt
|
||||
fun box(): String =
|
||||
test(null) ?: "OK"
|
||||
@@ -0,0 +1,12 @@
|
||||
// FILE: 1.kt
|
||||
object CrashMe {
|
||||
fun <T> crash(value: T): T? = null
|
||||
}
|
||||
|
||||
internal inline fun <reified T> crashMe(value: T?): T? {
|
||||
return CrashMe.crash(value ?: return null)
|
||||
}
|
||||
|
||||
// FILE: 2.kt
|
||||
fun box(): String =
|
||||
crashMe<String>(null) ?: "OK"
|
||||
@@ -0,0 +1,10 @@
|
||||
// FILE: 1.kt
|
||||
fun foo1(x: Long, xx: Int, y: Any?) = null
|
||||
|
||||
inline fun test1(value: Any?): String? {
|
||||
return foo1(0L, 0, value ?: return null)
|
||||
}
|
||||
|
||||
// FILE: 2.kt
|
||||
fun box(): String =
|
||||
test1(null) ?: "OK"
|
||||
@@ -0,0 +1,10 @@
|
||||
// FILE: 1.kt
|
||||
fun foo2(x: Int, xx: Long, y: Any?) = null
|
||||
|
||||
inline fun test2(value: Any?): String? {
|
||||
return foo2(0, 0L, value ?: return null)
|
||||
}
|
||||
|
||||
// FILE: 2.kt
|
||||
fun box(): String =
|
||||
test2(null) ?: "OK"
|
||||
@@ -0,0 +1,10 @@
|
||||
// FILE: 1.kt
|
||||
fun foo3(x: Int, xx: Long, xxx: Int, y: Any?) = null
|
||||
|
||||
inline fun test3(value: Any?): String? {
|
||||
return foo3(0, 0L, 0, value ?: return null)
|
||||
}
|
||||
|
||||
// FILE: 2.kt
|
||||
fun box(): String =
|
||||
test3(null) ?: "OK"
|
||||
@@ -0,0 +1,15 @@
|
||||
// FILE: 1.kt
|
||||
inline fun run(f: () -> Unit) = f()
|
||||
inline fun withAny(f: Any.() -> Unit) = Any().f()
|
||||
|
||||
// FILE: 2.kt
|
||||
fun foo(x: Any?, y: Any?) {}
|
||||
|
||||
fun box(): String {
|
||||
run outer@{
|
||||
withAny inner@{
|
||||
foo(null, null ?: return@outer)
|
||||
}
|
||||
}
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
// FILE: 1.kt
|
||||
inline fun run(f: () -> Unit) = f()
|
||||
inline fun withAny(f: Any.() -> Unit) = Any().f()
|
||||
|
||||
// FILE: 2.kt
|
||||
fun foo(x: Any?, y: Any?) {}
|
||||
|
||||
fun box(): String {
|
||||
run outer@{
|
||||
withAny inner@{
|
||||
foo(null, null ?: return@inner)
|
||||
}
|
||||
}
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// FILE: 1.kt
|
||||
inline fun run(f: () -> Unit) = f()
|
||||
inline fun withAny(f: Any.() -> Unit) = Any().f()
|
||||
inline fun foo(x: Any?, y: Any?, f: () -> Unit) = f()
|
||||
|
||||
// FILE: 2.kt
|
||||
|
||||
fun box(): String {
|
||||
run outer@{
|
||||
withAny inner@{
|
||||
foo(null, 0 ?: return@outer) {
|
||||
foo(null, null ?: return@inner) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
// FILE: 1.kt
|
||||
fun foo(x: Any?, y: Any?) = 0L
|
||||
|
||||
inline fun test(value: Any?): Long {
|
||||
return foo(null, value ?: return 1L)
|
||||
}
|
||||
|
||||
// FILE: 2.kt
|
||||
fun box(): String {
|
||||
val t = test(null)
|
||||
return if (t == 1L) "OK" else "fail: t=$t"
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// FILE: 1.kt
|
||||
fun foo(x: Any?, y: Any?) = null
|
||||
|
||||
var finallyFlag = false
|
||||
|
||||
inline fun test(value: Any?): String? {
|
||||
try {
|
||||
return foo(null, value ?: return null)
|
||||
}
|
||||
finally {
|
||||
finallyFlag = true
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: 2.kt
|
||||
fun box(): String =
|
||||
test(null) ?: if (finallyFlag) "OK" else "finallyFlag not set"
|
||||
Reference in New Issue
Block a user