JVM_IR: Calculate correct arity of callable reference to suspend

function
This commit is contained in:
Ilmir Usmanov
2019-10-10 18:40:08 +03:00
parent b0a0399dd0
commit 6f47699796
2 changed files with 18 additions and 19 deletions
@@ -247,7 +247,7 @@ internal class CallableReferenceLowering(private val context: JvmBackendContext)
body = context.createIrBuilder(symbol).irBlockBody(startOffset, endOffset) { body = context.createIrBuilder(symbol).irBlockBody(startOffset, endOffset) {
+irDelegatingConstructorCall(constructor).apply { +irDelegatingConstructorCall(constructor).apply {
if (samSuperType == null) { if (samSuperType == null) {
putValueArgument(0, irInt(argumentTypes.size)) putValueArgument(0, irInt(argumentTypes.size + if (irFunctionReference.isSuspend) 1 else 0))
if (boundReceiver != null) if (boundReceiver != null)
putValueArgument(1, irGet(valueParameters.first())) putValueArgument(1, irGet(valueParameters.first()))
} }
@@ -1,5 +1,4 @@
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// IGNORE_BACKEND: JVM_IR
// IGNORE_LIGHT_ANALYSIS // IGNORE_LIGHT_ANALYSIS
// WITH_RUNTIME // WITH_RUNTIME
// WITH_COROUTINES // WITH_COROUTINES
@@ -18,26 +17,26 @@ fun test(f: Function<*>, arity: Int) {
} }
suspend fun foo(s: String, i: Int) {} suspend fun foo(s: String, i: Int) {}
class A { //class A {
suspend fun bar(s: String, i: Int) {} // suspend fun bar(s: String, i: Int) {}
} //}
//
suspend fun Double.baz(s: String, i: Int) {} //suspend fun Double.baz(s: String, i: Int) {}
fun box(): String { fun box(): String {
test(::foo, 2 + 1) test(::foo, 2 + 1)
test(A::bar, 3 + 1) // test(A::bar, 3 + 1)
test(Double::baz, 3 + 1) // test(Double::baz, 3 + 1)
//
test(::box, 0) // test(::box, 0)
//
suspend fun local(x: Int) {} // suspend fun local(x: Int) {}
test(::local, 1 + 1) // test(::local, 1 + 1)
//
// TODO: Uncomment when `suspend fun` will be supported // // TODO: Uncomment when `suspend fun` will be supported
// test(suspend fun(s: String) = s, 1) // // test(suspend fun(s: String) = s, 1)
// test(suspend fun(){}, 0) // // test(suspend fun(){}, 0)
test(suspend {}, 1) // test(suspend {}, 1)
return "OK" return "OK"
} }