diff --git a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt index 9561cde2322..1a1360dd619 100644 --- a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt +++ b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt @@ -106,7 +106,9 @@ object CodegenUtil { if (declaration !is CallableMemberDescriptor) continue val traitMember = findInterfaceImplementation(declaration) - if (traitMember == null || Visibilities.isPrivate(traitMember.visibility)) continue + if (traitMember == null || + Visibilities.isPrivate(traitMember.visibility) || + traitMember.visibility == Visibilities.INVISIBLE_FAKE) continue assert(traitMember.modality !== Modality.ABSTRACT) { "Cannot delegate to abstract trait method: $declaration" } diff --git a/compiler/testData/codegen/box/regressions/kt13381.kt b/compiler/testData/codegen/box/regressions/kt13381.kt new file mode 100644 index 00000000000..b424d596455 --- /dev/null +++ b/compiler/testData/codegen/box/regressions/kt13381.kt @@ -0,0 +1,12 @@ +interface A { + // There must be no delegation methods for 'log' and 'bar' in C as they are private + private val log: String get() = "O" + private fun bar() = "K" + + fun foo() = log + bar() +} + +interface B : A +class C : B + +fun box() = C().foo() diff --git a/compiler/testData/codegen/bytecodeListing/noDelegationsToPrivateInterfaceMembers.kt b/compiler/testData/codegen/bytecodeListing/noDelegationsToPrivateInterfaceMembers.kt new file mode 100644 index 00000000000..bf0f476fe00 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/noDelegationsToPrivateInterfaceMembers.kt @@ -0,0 +1,10 @@ +interface A { + // There must be no delegation methods for 'log' and 'bar' in C as they are private + private val log: String get() = "O" + private fun bar() = "K" + + fun foo() = log + bar() +} + +interface B : A +class C : B diff --git a/compiler/testData/codegen/bytecodeListing/noDelegationsToPrivateInterfaceMembers.txt b/compiler/testData/codegen/bytecodeListing/noDelegationsToPrivateInterfaceMembers.txt new file mode 100644 index 00000000000..16414504790 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/noDelegationsToPrivateInterfaceMembers.txt @@ -0,0 +1,30 @@ +@kotlin.Metadata +public final class A$DefaultImpls { + inner class A$DefaultImpls + private static method bar(p0: A): java.lang.String + public static @org.jetbrains.annotations.NotNull method foo(p0: A): java.lang.String + private static method getLog(p0: A): java.lang.String +} + +@kotlin.Metadata +public interface A { + inner class A$DefaultImpls + public abstract @org.jetbrains.annotations.NotNull method foo(): java.lang.String +} + +@kotlin.Metadata +public final class B$DefaultImpls { + inner class B$DefaultImpls + public static @org.jetbrains.annotations.NotNull method foo(p0: B): java.lang.String +} + +@kotlin.Metadata +public interface B { + inner class B$DefaultImpls +} + +@kotlin.Metadata +public final class C { + public method (): void + public @org.jetbrains.annotations.NotNull method foo(): java.lang.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 7ca15394dca..da489e48b10 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -13666,6 +13666,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("kt13381.kt") + public void testKt13381() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/regressions/kt13381.kt"); + doTest(fileName); + } + @TestMetadata("kt1406.kt") public void testKt1406() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/regressions/kt1406.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java index 449cd3891bf..93158279d8d 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java @@ -77,6 +77,12 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest { doTest(fileName); } + @TestMetadata("noDelegationsToPrivateInterfaceMembers.kt") + public void testNoDelegationsToPrivateInterfaceMembers() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/noDelegationsToPrivateInterfaceMembers.kt"); + doTest(fileName); + } + @TestMetadata("samAdapterAndInlinedOne.kt") public void testSamAdapterAndInlinedOne() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/samAdapterAndInlinedOne.kt");