From 1869ed09bc45694acc191eb165fc6a967caa2ae9 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 21 Sep 2018 14:55:19 +0300 Subject: [PATCH] Fix companion field access from inline class #KT-26858 --- .../kotlin/codegen/JvmCodegenUtil.java | 4 ++-- .../membersAccess/toPrivateCompanionVal.kt | 12 ++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 18 ++++++++++++++++++ .../LightAnalysisModeTestGenerated.java | 18 ++++++++++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 18 ++++++++++++++++++ .../semantics/IrJsCodegenBoxTestGenerated.java | 18 ++++++++++++++++++ .../semantics/JsCodegenBoxTestGenerated.java | 18 ++++++++++++++++++ 7 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/membersAccess/toPrivateCompanionVal.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java index 47b37769dbb..190ad464c04 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java @@ -197,8 +197,8 @@ public class JvmCodegenUtil { if (KotlinTypeMapper.isAccessor(property)) return false; CodegenContext context = contextBeforeInline.getFirstCrossInlineOrNonInlineContext(); - // Inline functions or inline classes can't use direct access because a field may not be visible at the call site - if (context.isInlineMethodContext() || (context.getEnclosingClass() != null && context.getEnclosingClass().isInline())) { + // Inline functions can't use direct access because a field may not be visible at the call site + if (context.isInlineMethodContext()) { return false; } diff --git a/compiler/testData/codegen/box/inlineClasses/membersAccess/toPrivateCompanionVal.kt b/compiler/testData/codegen/box/inlineClasses/membersAccess/toPrivateCompanionVal.kt new file mode 100644 index 00000000000..eab13463a1b --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/membersAccess/toPrivateCompanionVal.kt @@ -0,0 +1,12 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JVM_IR + +inline class R(private val r: Int) { + fun test() = pv + + companion object { + private val pv = "OK" + } +} + +fun box() = R(0).test() \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index b2311427bdc..55c4bc081f1 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -12107,6 +12107,24 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/overriddenDefaultInterfaceMethodCall.kt"); } } + + @TestMetadata("compiler/testData/codegen/box/inlineClasses/membersAccess") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class MembersAccess extends AbstractBlackBoxCodegenTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath); + } + + public void testAllFilesPresentInMembersAccess() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/membersAccess"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); + } + + @TestMetadata("toPrivateCompanionVal.kt") + public void testToPrivateCompanionVal() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/membersAccess/toPrivateCompanionVal.kt"); + } + } } @TestMetadata("compiler/testData/codegen/box/innerNested") diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 484e801bf89..0f934417c34 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12107,6 +12107,24 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/overriddenDefaultInterfaceMethodCall.kt"); } } + + @TestMetadata("compiler/testData/codegen/box/inlineClasses/membersAccess") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class MembersAccess extends AbstractLightAnalysisModeTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath); + } + + public void testAllFilesPresentInMembersAccess() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/membersAccess"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); + } + + @TestMetadata("toPrivateCompanionVal.kt") + public void testToPrivateCompanionVal() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/membersAccess/toPrivateCompanionVal.kt"); + } + } } @TestMetadata("compiler/testData/codegen/box/innerNested") diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index ade0e97aa5c..723c153537a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -12112,6 +12112,24 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/overriddenDefaultInterfaceMethodCall.kt"); } } + + @TestMetadata("compiler/testData/codegen/box/inlineClasses/membersAccess") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class MembersAccess extends AbstractIrBlackBoxCodegenTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM_IR, testDataFilePath); + } + + public void testAllFilesPresentInMembersAccess() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/membersAccess"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM_IR, true); + } + + @TestMetadata("toPrivateCompanionVal.kt") + public void testToPrivateCompanionVal() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/membersAccess/toPrivateCompanionVal.kt"); + } + } } @TestMetadata("compiler/testData/codegen/box/innerNested") diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java index f207c03f345..83e2317b80d 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java @@ -10647,6 +10647,24 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/overriddenDefaultInterfaceMethodCall.kt"); } } + + @TestMetadata("compiler/testData/codegen/box/inlineClasses/membersAccess") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class MembersAccess extends AbstractIrJsCodegenBoxTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest0(this::doTest, TargetBackend.JS_IR, testDataFilePath); + } + + public void testAllFilesPresentInMembersAccess() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/membersAccess"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS_IR, true); + } + + @TestMetadata("toPrivateCompanionVal.kt") + public void testToPrivateCompanionVal() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/membersAccess/toPrivateCompanionVal.kt"); + } + } } @TestMetadata("compiler/testData/codegen/box/innerNested") diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 8b57d2308d0..9fab1a980fb 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -11692,6 +11692,24 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/interfaceMethodCalls/overriddenDefaultInterfaceMethodCall.kt"); } } + + @TestMetadata("compiler/testData/codegen/box/inlineClasses/membersAccess") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class MembersAccess extends AbstractJsCodegenBoxTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest0(this::doTest, TargetBackend.JS, testDataFilePath); + } + + public void testAllFilesPresentInMembersAccess() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses/membersAccess"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS, true); + } + + @TestMetadata("toPrivateCompanionVal.kt") + public void testToPrivateCompanionVal() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/membersAccess/toPrivateCompanionVal.kt"); + } + } } @TestMetadata("compiler/testData/codegen/box/innerNested")