Fix function invocation mangling rule
Mangle invocations of functions with value classes in signature which override (directly or indirectly) a method declared in Kotlin code. Otherwise, NoSuchMethodError is being thrown. ^KT-55945: Fixed
This commit is contained in:
committed by
Space Team
parent
f80ed4592d
commit
457837a255
Vendored
+35
@@ -0,0 +1,35 @@
|
||||
// WITH_STDLIB
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// LANGUAGE: +ValueClasses
|
||||
|
||||
// FILE: Point.kt
|
||||
|
||||
@JvmInline
|
||||
value class Point(val x: Int, val y: Int)
|
||||
|
||||
// FILE: JavaBase.java
|
||||
|
||||
public class JavaBase {
|
||||
public int foo(Point x)
|
||||
{
|
||||
return 42;
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: JavaChild.java
|
||||
|
||||
public class JavaChild extends JavaBase {}
|
||||
|
||||
// FILE: KotlinChild.kt
|
||||
|
||||
class KotlinChild : JavaChild()
|
||||
|
||||
// FILE: box.kt
|
||||
|
||||
fun box(): String {
|
||||
if (JavaBase().foo(Point(0, 0)) != 42) return "Fail 1"
|
||||
if (JavaChild().foo(Point(0, 0)) != 42) return "Fail 2"
|
||||
if (KotlinChild().foo(Point(0, 0)) != 42) return "Fail 3"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
// WITH_STDLIB
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// LANGUAGE: +ValueClasses
|
||||
|
||||
// FILE: Point.kt
|
||||
|
||||
@JvmInline
|
||||
value class Point(val x: Int, val y: Int)
|
||||
|
||||
// FILE: JavaBase.java
|
||||
|
||||
public class JavaBase {
|
||||
public int foo(Point x)
|
||||
{
|
||||
return 42;
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: JavaChild.java
|
||||
|
||||
public class JavaChild extends JavaBase {}
|
||||
|
||||
// FILE: KotlinChild.kt
|
||||
|
||||
class KotlinChild : JavaChild() {
|
||||
override fun foo(x : Point) = 24
|
||||
}
|
||||
|
||||
// FILE: box.kt
|
||||
|
||||
fun box(): String {
|
||||
if (JavaBase().foo(Point(0, 0)) != 42) return "Fail 1"
|
||||
if (JavaChild().foo(Point(0, 0)) != 42) return "Fail 2"
|
||||
if (KotlinChild().foo(Point(0, 0)) != 24) return "Fail 3"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
// WITH_STDLIB
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// LANGUAGE: +ValueClasses
|
||||
|
||||
// FILE: Point.kt
|
||||
|
||||
@JvmInline
|
||||
value class Point(val x: Int, val y: Int)
|
||||
|
||||
// FILE: KotlinInterface.kt
|
||||
|
||||
public interface KotlinInterface {
|
||||
fun foo(x: Point): Int
|
||||
}
|
||||
|
||||
// FILE: JavaInterface.java
|
||||
|
||||
public interface JavaInterface {
|
||||
int foo(Point x);
|
||||
}
|
||||
|
||||
// FILE: JavaInterfaceChildOfKotlin.java
|
||||
|
||||
public interface JavaInterfaceChildOfKotlin extends KotlinInterface {}
|
||||
|
||||
// FILE: KotlinChild.kt
|
||||
|
||||
class KotlinChild : JavaInterface, JavaInterfaceChildOfKotlin {
|
||||
override fun foo(x: Point) = 42
|
||||
}
|
||||
|
||||
// FILE: box.kt
|
||||
|
||||
fun box(): String {
|
||||
if (KotlinChild().foo(Point(0, 0)) != 42) return "Fail"
|
||||
return "OK"
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
// WITH_STDLIB
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// LANGUAGE: +ValueClasses
|
||||
|
||||
// FILE: Point.kt
|
||||
|
||||
@JvmInline
|
||||
value class Point(val x: Int, val y: Int)
|
||||
|
||||
// FILE: KotlinBase.kt
|
||||
|
||||
open class KotlinBase {
|
||||
open fun foo(x : Point) = 42
|
||||
}
|
||||
|
||||
// FILE: JavaChild.java
|
||||
|
||||
public class JavaChild extends KotlinBase {}
|
||||
|
||||
// FILE: KotlinChild.kt
|
||||
|
||||
class KotlinChild : JavaChild() {
|
||||
override fun foo(x : Point) = 24
|
||||
}
|
||||
|
||||
// FILE: box.kt
|
||||
|
||||
fun box(): String {
|
||||
if (KotlinBase().foo(Point(0, 0)) != 42) return "Fail 1"
|
||||
if (JavaChild().foo(Point(0, 0)) != 42) return "Fail 2"
|
||||
if (KotlinChild().foo(Point(0, 0)) != 24) return "Fail 3"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user