JVM_IR indy-SAM: KT-45069 box lambda 'Unit' return type if needed

This commit is contained in:
Dmitry Petrov
2021-02-20 11:07:48 +03:00
parent 187d4998fa
commit 387d84f826
19 changed files with 561 additions and 3 deletions
@@ -0,0 +1,16 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// FILE: intReturnTypeAsNumber.kt
fun box(): String {
val num = Sam { 42 }
if (num.get() != 42)
return "Failed"
return "OK"
}
// FILE: Sam.java
public interface Sam {
Number get();
}
@@ -0,0 +1,25 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// FILE: nothingReturnTypeAsObject.kt
fun interface IFoo<T> {
fun foo(): T
}
fun thr(s: String): Nothing = throw RuntimeException(s)
fun box(): String {
try {
Sam(::thr).get("OK")
} catch (e: RuntimeException) {
return e.message!!
}
return "Failed"
}
// FILE: Sam.java
public interface Sam {
Object get(String s);
}
@@ -0,0 +1,25 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// FILE: nothingReturnTypeAsString.kt
fun interface IFoo<T> {
fun foo(): T
}
fun thr(s: String): Nothing = throw RuntimeException(s)
fun box(): String {
try {
Sam(::thr).get("OK")
} catch (e: RuntimeException) {
return e.message!!
}
return "Failed"
}
// FILE: Sam.java
public interface Sam {
String get(String s);
}
@@ -0,0 +1,28 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// FILE: nullableNothingReturnTypeAsObject.kt
fun interface IFoo<T> {
fun foo(): T
}
var t = "Failed"
fun test(s: String): Nothing? {
t = s
return null
}
fun box(): String {
val q = Sam(::test).get("OK")
if (q != null)
return "Failed: $q"
return t
}
// FILE: Sam.java
public interface Sam {
Object get(String s);
}
@@ -0,0 +1,28 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// FILE: nullableNothingReturnTypeAsString.kt
fun interface IFoo<T> {
fun foo(): T
}
var t = "Failed"
fun test(s: String): Nothing? {
t = s
return null
}
fun box(): String {
val q = Sam(::test).get("OK")
if (q != null)
return "Failed: $q"
return t
}
// FILE: Sam.java
public interface Sam {
String get(String s);
}
@@ -0,0 +1,20 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// FILE: voidReturnTypeAsObject.kt
var t = "Failed"
fun ok(s: String) { t = s }
fun box(): String {
val r = Sam(::ok).get("OK")
if (r != Unit) {
return "Failed: $r"
}
return t
}
// FILE: Sam.java
public interface Sam {
Object get(String s);
}
@@ -0,0 +1,14 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
fun interface INum {
fun get(): Number
}
fun box(): String {
val num = INum { 42 }
if (num.get() != 42)
return "Failed"
return "OK"
}
@@ -0,0 +1,18 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
fun interface Cmp<T> {
fun compare(a: T, b: T): Int
}
fun <T> foo(comparator: Cmp<in T>, a: T, b: T) = comparator.compare(a, b)
fun bar(x: Int, y: Int) = foo({ a, b -> a - b}, x, y)
fun box(): String {
val t = bar(42, 117)
if (t != -75)
return "Failed: t=$t"
return "OK"
}
@@ -0,0 +1,16 @@
// TARGET_BACKEND: JVM
// IGNORE_BACKEND_FIR: JVM_IR
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
fun interface Cmp<T> {
fun compare(a: T, b: T): Int
}
fun cmp(c: Cmp<*>) = c
fun box(): String {
val c = cmp { _, _ -> 0 } as Cmp<Any>
if (c.compare(1, 2) != 0)
return "Failed"
return "OK"
}
@@ -1,7 +1,6 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
// IGNORE_DEXING
fun interface GenericToAny<T> {
fun invoke(x: T): Any
@@ -12,4 +11,4 @@ fun interface GenericCharToAny : GenericToAny<Char>
fun withK(fn: GenericCharToAny) = fn.invoke('K').toString()
fun box(): String =
withK { "O" + it }
withK { "O" + it }
@@ -0,0 +1,18 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
fun interface IFoo<T> {
fun foo(): T
}
fun <T> foo(iFoo: IFoo<T>) = iFoo.foo()
fun box(): String {
try {
foo { throw RuntimeException("OK") }
} catch (e: RuntimeException) {
return e.message!!
}
return "Failed"
}
@@ -0,0 +1,18 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
fun interface IFoo {
fun foo(): String
}
fun foo(iFoo: IFoo) = iFoo.foo()
fun box(): String {
try {
foo { throw RuntimeException("OK") }
} catch (e: RuntimeException) {
return e.message!!
}
return "Failed"
}
@@ -0,0 +1,16 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: INDY
fun interface GenericToAny<T> {
fun invoke(Inner: T): Any
}
fun <T> foo2(t: T, g: GenericToAny<T>): Any = g.invoke(t)
fun box(): String {
foo2<Char>('.') { }
return "OK"
}
@@ -0,0 +1,14 @@
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// SAM_CONVERSIONS: CLASS
fun interface GenericToAny<T> {
fun invoke(Inner: T): Any
}
fun <T> foo2(t: T, g: GenericToAny<T>): Any = g.invoke(t)
fun box(): String {
foo2<Char>('.') { }
return "OK"
}