From b26155dd9e3d401ce70cc7dedc3d93a6d9de3784 Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Wed, 13 Jul 2022 13:08:59 +0200 Subject: [PATCH] KT-53007 Fix accessibility checks when calling a protected member via super@Outer --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../jvm/lower/SyntheticAccessorLowering.kt | 2 +- .../testData/codegen/box/classes/kt53007.kt | 18 ++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ 6 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/classes/kt53007.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index eea13f859c2..68ba7e11891 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -5781,6 +5781,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/classes/kt508.kt"); } + @Test + @TestMetadata("kt53007.kt") + public void testKt53007() throws Exception { + runTest("compiler/testData/codegen/box/classes/kt53007.kt"); + } + @Test @TestMetadata("kt5347.kt") public void testKt5347() throws Exception { diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt index d4234755321..883ee516ddf 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt @@ -91,8 +91,8 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : FileL val scopeClassOrPackage = inlineScopeResolver.findContainer(currentScope!!.irElement) ?: return false val samePackage = ownerClass.getPackageFragment().fqName == scopeClassOrPackage.getPackageFragment()?.fqName return when { - jvmVisibility == 0 /* package only */ -> samePackage jvmVisibility == Opcodes.ACC_PRIVATE -> ownerClass == scopeClassOrPackage + !withSuper && samePackage && jvmVisibility == 0 /* package only */ -> true // JVM `protected`, unlike Kotlin `protected`, permits accesses from the same package, // provided the call is not across class loader boundaries. !withSuper && samePackage && !fromOtherClassLoader -> true diff --git a/compiler/testData/codegen/box/classes/kt53007.kt b/compiler/testData/codegen/box/classes/kt53007.kt new file mode 100644 index 00000000000..671877b592a --- /dev/null +++ b/compiler/testData/codegen/box/classes/kt53007.kt @@ -0,0 +1,18 @@ +// TARGET_BACKEND: JVM + +// FILE: SubClass.kt + +class SubClass: BaseClass() { + inner class InnerClass { + fun foo() = super@SubClass.foo() + } +} + +fun box() = SubClass().InnerClass().foo() + +// FILE: BaseClass.java +public class BaseClass { + String foo() { + return "OK"; + } +} \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 71ea565c94c..c1f9c644da0 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -5667,6 +5667,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/classes/kt508.kt"); } + @Test + @TestMetadata("kt53007.kt") + public void testKt53007() throws Exception { + runTest("compiler/testData/codegen/box/classes/kt53007.kt"); + } + @Test @TestMetadata("kt5347.kt") public void testKt5347() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index b35b57d76c9..28d1e66ad84 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -5781,6 +5781,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/classes/kt508.kt"); } + @Test + @TestMetadata("kt53007.kt") + public void testKt53007() throws Exception { + runTest("compiler/testData/codegen/box/classes/kt53007.kt"); + } + @Test @TestMetadata("kt5347.kt") public void testKt5347() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 846538460e3..e732d01ea26 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -4951,6 +4951,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/classes/kt508.kt"); } + @TestMetadata("kt53007.kt") + public void testKt53007() throws Exception { + runTest("compiler/testData/codegen/box/classes/kt53007.kt"); + } + @TestMetadata("kt5347.kt") public void testKt5347() throws Exception { runTest("compiler/testData/codegen/box/classes/kt5347.kt");