From 421ff68cd6f40e774bc6b9f741bf9001b3e1de00 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Tue, 15 Jun 2021 13:50:21 +0500 Subject: [PATCH] [K/N][codegen] Fix for https://youtrack.jetbrains.com/issue/KT-47183 --- .../konan/descriptors/ClassLayoutBuilder.kt | 2 +- .../backend.native/tests/build.gradle | 4 +++ .../codegen/interfaceCallsNCasts/diamond.kt | 33 +++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 kotlin-native/backend.native/tests/codegen/interfaceCallsNCasts/diamond.kt diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt index 50fb765731d..902cdb32904 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/ClassLayoutBuilder.kt @@ -352,7 +352,7 @@ internal class ClassLayoutBuilder(val irClass: IrClass, val context: Context, va val interfaceVTableEntries: List by lazy { require(irClass.isInterface) irClass.overridableOrOverridingMethods - .filter { f -> f.isReal || f.overriddenSymbols.any { OverriddenFunctionInfo(f, it.owner).needBridge } } + .filter { f -> f.isReal || f.overriddenSymbols.any { f.needBridgeTo(it.owner) } } .sortedBy { it.uniqueName } } diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index 8ba56a7a9ae..29ac06d0804 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -2618,6 +2618,10 @@ task interfaceCallsNCasts_functionNameClash(type: KonanLocalTest) { source = "codegen/interfaceCallsNCasts/functionNameClash.kt" } +task interfaceCallsNCasts_diamond(type: KonanLocalTest) { + source = "codegen/interfaceCallsNCasts/diamond.kt" +} + standaloneTest("multiargs") { arguments = ["AAA", "BB", "C"] multiRuns = true diff --git a/kotlin-native/backend.native/tests/codegen/interfaceCallsNCasts/diamond.kt b/kotlin-native/backend.native/tests/codegen/interfaceCallsNCasts/diamond.kt new file mode 100644 index 00000000000..76d41fa29bb --- /dev/null +++ b/kotlin-native/backend.native/tests/codegen/interfaceCallsNCasts/diamond.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the LICENSE file. + */ + +package codegen.interfaceCallsNCasts.diamond + +import kotlin.test.* + +interface A { + fun foo(t: T, u: U) = "A" +} + +interface B : A + +interface C : A + +class Z : B, C { + override fun foo(t: String, u: Int) = "Z" +} + +@Test +fun runTest() { + val z = Z() + val c: C = z + val b: B = z + val a: A = z + + assertEquals("Z", z.foo("", 0)) + assertEquals("Z", c.foo("", 0)) + assertEquals("Z", b.foo("", 0)) + assertEquals("Z", a.foo("", 0)) +} \ No newline at end of file