| // WITH_STDLIB |
| // WORKS_WHEN_VALUE_CLASS |
| |
| OPTIONAL_JVM_INLINE_ANNOTATION |
| value class WrapperA(val s: String) |
| |
| OPTIONAL_JVM_INLINE_ANNOTATION |
| value class WrapperB(val s: String) |
| |
| OPTIONAL_JVM_INLINE_ANNOTATION |
| value class WrapInt1(val n: Int) |
| |
| OPTIONAL_JVM_INLINE_ANNOTATION |
| value class WrapInt2(val n: Int) |
| |
| fun lambdaA(a: WrapperA): () -> String = { a.s } |
| fun lambdaB(b: WrapperB): () -> String = { b.s } |
| fun lambdaC(c: WrapInt1): () -> Int = { c.n } |
| fun lambdaD(d: WrapInt2): () -> Int = { d.n } |
| |
| // Generic lambdas with different type parameter names but same upper bound (Any?) should |
| // erase to the same type and be merged into a single callable reference class. |
| fun <T> lambdaT(t: T): () -> T = { t } |
| fun <U> lambdaU(u: U): () -> U = { u } |
| |
| fun box(): String { |
| val a = lambdaA(WrapperA("hello")) |
| val b = lambdaB(WrapperB("world")) |
| val c = lambdaC(WrapInt1(1)) |
| val d = lambdaD(WrapInt2(2)) |
| if (a() != "hello") return "FAIL a: ${a()}" |
| if (b() != "world") return "FAIL b: ${b()}" |
| if (c() != 1) return "FAIL c: ${c()}" |
| if (d() != 2) return "FAIL d: ${d()}" |
| val t = lambdaT("generic") |
| val u = lambdaU("also generic") |
| if (t() != "generic") return "FAIL t: ${t()}" |
| if (u() != "also generic") return "FAIL u: ${u()}" |
| return "OK" |
| } |