JVM_IR indy-lambdas: minor updates and fixes

KT-44278 KT-26060 KT-42621
This commit is contained in:
Dmitry Petrov
2021-01-29 19:14:45 +03:00
committed by TeamCityServer
parent 088448043a
commit ab20a8ffff
40 changed files with 1209 additions and 324 deletions
@@ -0,0 +1,16 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// LAMBDAS: INDY
// FILE: 1.kt
inline fun cross(crossinline fn: () -> String) : Any =
object {
override fun toString(): String = fn()
}
fun foo(fn: () -> String) = fn()
// FILE: 2.kt
fun box() =
cross {
foo { "OK" }
}.toString()
@@ -0,0 +1,22 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// LAMBDAS: INDY
// FILE: 1.kt
class C {
fun test() =
cross {
foo { "OK" }
}.toString()
}
inline fun cross(crossinline fn: () -> String) : Any =
object {
override fun toString(): String = fn()
}
fun foo(fn: () -> String) = fn()
// FILE: 2.kt
fun box() =
C().test()
@@ -0,0 +1,16 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// LAMBDAS: INDY
// WITH_RUNTIME
// FILE: 1.kt
package a
fun fooK(fn: (String) -> String) = fn("K")
inline fun test(crossinline lambda: (String) -> String) =
fooK { k -> lambda(k) }
// FILE: 2.kt
import a.*
fun box() = test { k -> "O" + k }
@@ -0,0 +1,25 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// LAMBDAS: INDY
// WITH_RUNTIME
// NO_CHECK_LAMBDA_INLINING
// FILE: 1.kt
fun foo(fn: () -> Unit) = fn()
inline fun twice(fn: () -> Unit) {
fn()
fn()
}
// FILE: 2.kt
fun box(): String {
var test = 0
twice {
foo { test += 1 }
}
if (test != 2)
return "Failed: test=$test"
return "OK"
}
@@ -0,0 +1,20 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// FILE: 1.kt
inline fun cross(crossinline fn: () -> String) : Any =
object {
override fun toString(): String = fn()
}
fun interface IFoo {
fun foo(): String
}
fun foo(iFoo: IFoo) = iFoo.foo()
// FILE: 2.kt
fun box() =
cross {
foo { "OK" }
}.toString()
@@ -0,0 +1,26 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// FILE: 1.kt
class C {
fun test() =
cross {
foo { "OK" }
}.toString()
}
inline fun cross(crossinline fn: () -> String) : Any =
object {
override fun toString(): String = fn()
}
fun interface IFoo {
fun foo(): String
}
fun foo(iFoo: IFoo) = iFoo.foo()
// FILE: 2.kt
fun box() =
C().test()
@@ -0,0 +1,20 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// WITH_RUNTIME
// FILE: 1.kt
package a
fun interface IFoo {
fun foo(k: String): String
}
fun fooK(iFoo: IFoo) = iFoo.foo("K")
inline fun test(crossinline lambda: (String) -> String) =
fooK { k -> lambda(k) }
// FILE: 2.kt
import a.*
fun box() = test { k -> "O" + k }
@@ -0,0 +1,28 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// WITH_RUNTIME
// NO_CHECK_LAMBDA_INLINING
// FILE: 1.kt
fun interface IFoo {
fun foo()
}
fun foo(iFoo: IFoo) = iFoo.foo()
inline fun twice(fn: () -> Unit) {
fn()
fn()
}
// FILE: 2.kt
fun box(): String {
var test = 0
twice {
foo { test += 1 }
}
if (test != 2)
return "Failed: test=$test"
return "OK"
}