From 0f17191e0eebef91c2dde6a9714994fd2efb7228 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Wed, 22 Mar 2023 22:05:20 +0100 Subject: [PATCH] [PL] Fix: Allow IrEnumConstructorCall with constructed class with kind=ENUM_ENTRY --- .../partial/PartiallyLinkedIrTreePatcher.kt | 3 ++- .../klibABI/classTransformations/lib2/l2.kt | 22 +++++++++++++++++++ .../klibABI/classTransformations/main/m.kt | 3 +++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/linkage/partial/PartiallyLinkedIrTreePatcher.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/linkage/partial/PartiallyLinkedIrTreePatcher.kt index b4e22ba408e..41caac18cd3 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/linkage/partial/PartiallyLinkedIrTreePatcher.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/linkage/partial/PartiallyLinkedIrTreePatcher.kt @@ -519,7 +519,8 @@ internal class PartiallyLinkedIrTreePatcher( checkReferencedDeclaration(symbol) ?: checkExpressionTypeArguments() ?: checkReferencedDeclarationType(expression.symbol.owner.parentAsClass, "enum class") { constructedClass -> - constructedClass.kind == ClassKind.ENUM_CLASS || constructedClass.symbol == builtIns.enumClass + constructedClass.kind == ClassKind.ENUM_CLASS || constructedClass.kind == ClassKind.ENUM_ENTRY + || constructedClass.symbol == builtIns.enumClass } ?: checkArgumentsAndValueParameters(symbol.owner) } diff --git a/compiler/testData/klibABI/classTransformations/lib2/l2.kt b/compiler/testData/klibABI/classTransformations/lib2/l2.kt index 3f678f017ad..b6607b3bda3 100644 --- a/compiler/testData/klibABI/classTransformations/lib2/l2.kt +++ b/compiler/testData/klibABI/classTransformations/lib2/l2.kt @@ -220,3 +220,25 @@ fun instantiationOfAbstractClass() { // abstract classes except for from their direct inheritors. ClassToAbstractClass().getGreeting() } + +// This is required to check that enum entry classes are correctly handled in partial linkage. +enum class StableEnum { + FOO { + val x = "OK" + + inner class Inner { + val y = x + } + + val z = Inner() + + override val test: String + get() = z.y + }, + BAR { + override val test = "OK" + }; + + abstract val test: String +} + diff --git a/compiler/testData/klibABI/classTransformations/main/m.kt b/compiler/testData/klibABI/classTransformations/main/m.kt index 7e039d023a5..35946b1a184 100644 --- a/compiler/testData/klibABI/classTransformations/main/m.kt +++ b/compiler/testData/klibABI/classTransformations/main/m.kt @@ -207,4 +207,7 @@ fun box() = abiTest { expectSuccess { getFunctionalInterfaceToInterface(); "OK" } expectFailure(linkage("Constructor 'ClassToAbstractClass.' can not be called: Can not instantiate abstract class 'ClassToAbstractClass'")) { instantiationOfAbstractClass() } + + expectSuccess { StableEnum.FOO.test } + expectSuccess { StableEnum.BAR.test } }