From 5f38c1d5717fa584576cad1e3e2687e1fade2a5a Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Mon, 1 Feb 2016 14:04:24 +0300 Subject: [PATCH] Fix for KT-10729: Accessing private const field in companion object from a function in the same companion generates run-time error --- .../kotlin/codegen/ExpressionCodegen.java | 2 +- .../kotlin/codegen/MemberCodegen.java | 7 ++++--- .../box/properties/companionPrivateField.kt | 10 ++++++++++ .../companionPrivateFieldInsideLambda.kt | 10 ++++++++++ .../codegen/box/properties/kt10729.kt | 20 +++++++++++++++++++ .../boxInline/private/accessorForConst.1.kt | 5 +++++ .../boxInline/private/accessorForConst.2.kt | 14 +++++++++++++ .../BlackBoxCodegenTestGenerated.java | 18 +++++++++++++++++ .../BlackBoxInlineCodegenTestGenerated.java | 6 ++++++ ...otlinAgainstInlineKotlinTestGenerated.java | 6 ++++++ 10 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/box/properties/companionPrivateField.kt create mode 100644 compiler/testData/codegen/box/properties/companionPrivateFieldInsideLambda.kt create mode 100644 compiler/testData/codegen/box/properties/kt10729.kt create mode 100644 compiler/testData/codegen/boxInline/private/accessorForConst.1.kt create mode 100644 compiler/testData/codegen/boxInline/private/accessorForConst.2.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index cddaf7f20bc..b780585cc26 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -2119,7 +2119,7 @@ public class ExpressionCodegen extends KtVisitor impleme FieldAccessorKind fieldAccessorKind = FieldAccessorKind.NORMAL; boolean isBackingFieldInClassCompanion = JvmAbi.isPropertyWithBackingFieldInOuterClass(propertyDescriptor); - if (isBackingFieldInClassCompanion && forceField) { + if (isBackingFieldInClassCompanion && (forceField || propertyDescriptor.isConst() && Visibilities.isPrivate(propertyDescriptor.getVisibility()))) { fieldAccessorKind = FieldAccessorKind.IN_CLASS_COMPANION; } else if (syntheticBackingField && context.getFirstCrossInlineOrNonInlineContext().getParentContext().getContextDescriptor() != containingDeclaration) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index aff0d7f4ca3..6ff9d9758f1 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -601,12 +601,13 @@ public abstract class MemberCodegen