KT-11499 Normalize stacks on return from an inline function when the function is inlined at call site.

This commit is contained in:
Dmitry Petrov
2016-04-07 20:00:12 +03:00
parent a6044c81ff
commit aca7050656
19 changed files with 502 additions and 87 deletions
@@ -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"