Properly find invoke method on default lambda inlining

In general case parameter type could differ from actual default lambda type.
  E.g.: fun inlineFun(s: (Child) -> Base = { a: Base -> a as Child}),
  where type of default lambda is '(Base) -> Child'.
  In such case we should find somehow actual invoke method in bytecode knowing
  only name, number of parameters and that's actual invoke is non-synthetic
  regardless of bridge one.

  #KT-21946 Fixed
This commit is contained in:
Mikhael Bogdanov
2018-12-27 15:03:40 +01:00
parent 3040a2b145
commit 6bf70a5dd2
14 changed files with 332 additions and 18 deletions
@@ -0,0 +1,22 @@
// IGNORE_BACKEND: JVM_IR
// FILE: 1.kt
// SKIP_INLINE_CHECK_IN: inlineFun$default
package test
open class Base
class Child(val value: String) : Base()
fun foo(a: Base): Child = a as Child
inline fun inlineFun(s: (Child) -> Base = ::foo): Base {
return s(Child("OK"))
}
// FILE: 2.kt
import test.*
fun box(): String {
return (inlineFun() as Child).value
}
@@ -0,0 +1,17 @@
// IGNORE_BACKEND: JVM_IR
// FILE: 1.kt
// SKIP_INLINE_CHECK_IN: inlineFun$default
package test
fun foo(a: Number): String = "OK"
inline fun inlineFun(s: (Double) -> String = ::foo): String {
return s(1.0)
}
// FILE: 2.kt
import test.*
fun box(): String {
return inlineFun()
}