From ec4b85b11134714d007f91466e59ac194651b860 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Thu, 15 Sep 2022 10:43:23 +0200 Subject: [PATCH] [IR][tests] Add cases to visibility-related tests where a visibility of an open callable in super class is narrowed ^KT-53608 --- .../changeFunctionVisibility/lib1/l1.kt | 8 ++++ .../changeFunctionVisibility/lib1/l1.kt.1 | 8 ++++ .../changeFunctionVisibility/lib2/l2.kt | 14 +++++++ .../changeFunctionVisibility/main/m.kt | 6 +++ .../changePropertyVisibility/lib1/l1.kt | 26 ++++++++++++ .../changePropertyVisibility/lib1/l1.kt.1 | 26 ++++++++++++ .../changePropertyVisibility/lib2/l2.kt | 41 +++++++++++++++++++ .../changePropertyVisibility/main/m.kt | 24 +++++++++++ 8 files changed, 153 insertions(+) diff --git a/compiler/testData/klibABI/changeFunctionVisibility/lib1/l1.kt b/compiler/testData/klibABI/changeFunctionVisibility/lib1/l1.kt index def626362bc..12425d8bc7f 100644 --- a/compiler/testData/klibABI/changeFunctionVisibility/lib1/l1.kt +++ b/compiler/testData/klibABI/changeFunctionVisibility/lib1/l1.kt @@ -9,4 +9,12 @@ open class Container { protected fun protectedToPublicFunction() = "Container.protectedToPublicFunction.v1" protected fun protectedToInternalFunction() = "Container.protectedToInternalFunction.v1" protected fun protectedToPrivateFunction() = "Container.protectedToPrivateFunction.v1" + + public open fun publicToProtectedOverriddenFunction() = "Container.publicToProtectedOverriddenFunction.v1" + public open fun publicToInternalOverriddenFunction() = "Container.publicToInternalOverriddenFunction.v1" + public open fun publicToPrivateOverriddenFunction() = "Container.publicToPrivateOverriddenFunction.v1" + + protected open fun protectedToPublicOverriddenFunction() = "Container.protectedToPublicOverriddenFunction.v1" + protected open fun protectedToInternalOverriddenFunction() = "Container.protectedToInternalOverriddenFunction.v1" + protected open fun protectedToPrivateOverriddenFunction() = "Container.protectedToPrivateOverriddenFunction.v1" } diff --git a/compiler/testData/klibABI/changeFunctionVisibility/lib1/l1.kt.1 b/compiler/testData/klibABI/changeFunctionVisibility/lib1/l1.kt.1 index d5523a04133..838684e579b 100644 --- a/compiler/testData/klibABI/changeFunctionVisibility/lib1/l1.kt.1 +++ b/compiler/testData/klibABI/changeFunctionVisibility/lib1/l1.kt.1 @@ -9,4 +9,12 @@ open class Container { public fun protectedToPublicFunction() = "Container.protectedToPublicFunction.v2" internal fun protectedToInternalFunction() = "Container.protectedToInternalFunction.v2" private fun protectedToPrivateFunction() = "Container.protectedToPrivateFunction.v2" + + protected open fun publicToProtectedOverriddenFunction() = "Container.publicToProtectedOverriddenFunction.v2" + internal open fun publicToInternalOverriddenFunction() = "Container.publicToInternalOverriddenFunction.v2" + private /*open*/ fun publicToPrivateOverriddenFunction() = "Container.publicToPrivateOverriddenFunction.v2" + + public open fun protectedToPublicOverriddenFunction() = "Container.protectedToPublicOverriddenFunction.v2" + internal open fun protectedToInternalOverriddenFunction() = "Container.protectedToInternalOverriddenFunction.v2" + private /*open*/ fun protectedToPrivateOverriddenFunction() = "Container.protectedToPrivateOverriddenFunction.v2" } diff --git a/compiler/testData/klibABI/changeFunctionVisibility/lib2/l2.kt b/compiler/testData/klibABI/changeFunctionVisibility/lib2/l2.kt index 4b24ade7d72..ed7e88e6891 100644 --- a/compiler/testData/klibABI/changeFunctionVisibility/lib2/l2.kt +++ b/compiler/testData/klibABI/changeFunctionVisibility/lib2/l2.kt @@ -8,4 +8,18 @@ class ContainerImpl : Container() { fun protectedToPublicFunctionAccess() = protectedToPublicFunction() fun protectedToInternalFunctionAccess() = protectedToInternalFunction() fun protectedToPrivateFunctionAccess() = protectedToPrivateFunction() + + // Overridden functions with changed visibility: + override fun publicToProtectedOverriddenFunction() = "ContainerImpl.publicToProtectedOverriddenFunction" + override fun publicToInternalOverriddenFunction() = "ContainerImpl.publicToInternalOverriddenFunction" + override fun publicToPrivateOverriddenFunction() = "ContainerImpl.publicToPrivateOverriddenFunction" + + override fun protectedToPublicOverriddenFunction() = "ContainerImpl.protectedToPublicOverriddenFunction" + override fun protectedToInternalOverriddenFunction() = "ContainerImpl.protectedToInternalOverriddenFunction" + override fun protectedToPrivateOverriddenFunction() = "ContainerImpl.protectedToPrivateOverriddenFunction" + + // As far as protected members can't be accessed outside of the class hierarchy, we need special accessors. + fun protectedToPublicOverriddenFunctionAccess() = protectedToPublicOverriddenFunction() + fun protectedToInternalOverriddenFunctionAccess() = protectedToInternalOverriddenFunction() + fun protectedToPrivateOverriddenFunctionAccess() = protectedToPrivateOverriddenFunction() } diff --git a/compiler/testData/klibABI/changeFunctionVisibility/main/m.kt b/compiler/testData/klibABI/changeFunctionVisibility/main/m.kt index 2b8c036fd4d..ea060990c94 100644 --- a/compiler/testData/klibABI/changeFunctionVisibility/main/m.kt +++ b/compiler/testData/klibABI/changeFunctionVisibility/main/m.kt @@ -13,4 +13,10 @@ fun box() = abiTest { expectSuccess("Container.protectedToPublicFunction.v2") { c.protectedToPublicFunctionAccess() } expectFailure(prefixed("function protectedToInternalFunction can not be called")) { c.protectedToInternalFunctionAccess() } expectFailure(prefixed("function protectedToPrivateFunction can not be called")) { c.protectedToPrivateFunctionAccess() } + expectSuccess("ContainerImpl.publicToProtectedOverriddenFunction") { c.publicToProtectedOverriddenFunction() } + expectSuccess("ContainerImpl.publicToInternalOverriddenFunction") { c.publicToInternalOverriddenFunction() } + expectSuccess("ContainerImpl.publicToPrivateOverriddenFunction") { c.publicToPrivateOverriddenFunction() } + expectSuccess("ContainerImpl.protectedToPublicOverriddenFunction") { c.protectedToPublicOverriddenFunctionAccess() } + expectSuccess("ContainerImpl.protectedToInternalOverriddenFunction") { c.protectedToInternalOverriddenFunctionAccess() } + expectSuccess("ContainerImpl.protectedToPrivateOverriddenFunction") { c.protectedToPrivateOverriddenFunctionAccess() } } diff --git a/compiler/testData/klibABI/changePropertyVisibility/lib1/l1.kt b/compiler/testData/klibABI/changePropertyVisibility/lib1/l1.kt index b77940d4d3d..4dca985ae42 100644 --- a/compiler/testData/klibABI/changePropertyVisibility/lib1/l1.kt +++ b/compiler/testData/klibABI/changePropertyVisibility/lib1/l1.kt @@ -17,4 +17,30 @@ open class Container { protected val protectedToInternalProperty2 get() = "Container.protectedToInternalProperty2.v1" protected val protectedToPrivateProperty1 = "Container.protectedToPrivateProperty1.v1" protected val protectedToPrivateProperty2 get() = "Container.protectedToPrivateProperty2.v1" + + public open val publicToProtectedOverriddenProperty1 = "Container.publicToProtectedOverriddenProperty1.v1" + public open val publicToProtectedOverriddenProperty2 get() = "Container.publicToProtectedOverriddenProperty2.v1" + public open val publicToProtectedOverriddenProperty3 = "Container.publicToProtectedOverriddenProperty3.v1" + public open val publicToProtectedOverriddenProperty4 get() = "Container.publicToProtectedOverriddenProperty4.v1" + public open val publicToInternalOverriddenProperty1 = "Container.publicToInternalOverriddenProperty1.v1" + public open val publicToInternalOverriddenProperty2 get() = "Container.publicToInternalOverriddenProperty2.v1" + public open val publicToInternalOverriddenProperty3 = "Container.publicToInternalOverriddenProperty3.v1" + public open val publicToInternalOverriddenProperty4 get() = "Container.publicToInternalOverriddenProperty4.v1" + public open val publicToPrivateOverriddenProperty1 = "Container.publicToPrivateOverriddenProperty1.v1" + public open val publicToPrivateOverriddenProperty2 get() = "Container.publicToPrivateOverriddenProperty2.v1" + public open val publicToPrivateOverriddenProperty3 = "Container.publicToPrivateOverriddenProperty3.v1" + public open val publicToPrivateOverriddenProperty4 get() = "Container.publicToPrivateOverriddenProperty4.v1" + + protected open val protectedToPublicOverriddenProperty1 = "Container.protectedToPublicOverriddenProperty1.v1" + protected open val protectedToPublicOverriddenProperty2 get() = "Container.protectedToPublicOverriddenProperty2.v1" + protected open val protectedToPublicOverriddenProperty3 = "Container.protectedToPublicOverriddenProperty3.v1" + protected open val protectedToPublicOverriddenProperty4 get() = "Container.protectedToPublicOverriddenProperty4.v1" + protected open val protectedToInternalOverriddenProperty1 = "Container.protectedToInternalOverriddenProperty1.v1" + protected open val protectedToInternalOverriddenProperty2 get() = "Container.protectedToInternalOverriddenProperty2.v1" + protected open val protectedToInternalOverriddenProperty3 = "Container.protectedToInternalOverriddenProperty3.v1" + protected open val protectedToInternalOverriddenProperty4 get() = "Container.protectedToInternalOverriddenProperty4.v1" + protected open val protectedToPrivateOverriddenProperty1 = "Container.protectedToPrivateOverriddenProperty1.v1" + protected open val protectedToPrivateOverriddenProperty2 get() = "Container.protectedToPrivateOverriddenProperty2.v1" + protected open val protectedToPrivateOverriddenProperty3 = "Container.protectedToPrivateOverriddenProperty3.v1" + protected open val protectedToPrivateOverriddenProperty4 get() = "Container.protectedToPrivateOverriddenProperty4.v1" } diff --git a/compiler/testData/klibABI/changePropertyVisibility/lib1/l1.kt.1 b/compiler/testData/klibABI/changePropertyVisibility/lib1/l1.kt.1 index 076cd2f424c..e30d69b9087 100644 --- a/compiler/testData/klibABI/changePropertyVisibility/lib1/l1.kt.1 +++ b/compiler/testData/klibABI/changePropertyVisibility/lib1/l1.kt.1 @@ -17,4 +17,30 @@ open class Container { internal val protectedToInternalProperty2 get() = "Container.protectedToInternalProperty2.v2" private val protectedToPrivateProperty1 = "Container.protectedToPrivateProperty1.v2" private val protectedToPrivateProperty2 get() = "Container.protectedToPrivateProperty2.v2" + + protected open val publicToProtectedOverriddenProperty1 = "Container.publicToProtectedOverriddenProperty1.v2" + protected open val publicToProtectedOverriddenProperty2 get() = "Container.publicToProtectedOverriddenProperty2.v2" + protected open val publicToProtectedOverriddenProperty3 get() = "Container.publicToProtectedOverriddenProperty3.v2" + protected open val publicToProtectedOverriddenProperty4 = "Container.publicToProtectedOverriddenProperty4.v2" + internal open val publicToInternalOverriddenProperty1 = "Container.publicToInternalOverriddenProperty1.v2" + internal open val publicToInternalOverriddenProperty2 get() = "Container.publicToInternalOverriddenProperty2.v2" + internal open val publicToInternalOverriddenProperty3 get() = "Container.publicToInternalOverriddenProperty3.v2" + internal open val publicToInternalOverriddenProperty4 = "Container.publicToInternalOverriddenProperty4.v2" + private /*open*/ val publicToPrivateOverriddenProperty1 = "Container.publicToPrivateOverriddenProperty1.v2" + private /*open*/ val publicToPrivateOverriddenProperty2 get() = "Container.publicToPrivateOverriddenProperty2.v2" + private /*open*/ val publicToPrivateOverriddenProperty3 get() = "Container.publicToPrivateOverriddenProperty3.v2" + private /*open*/ val publicToPrivateOverriddenProperty4 = "Container.publicToPrivateOverriddenProperty4.v2" + + public open val protectedToPublicOverriddenProperty1 = "Container.protectedToPublicOverriddenProperty1.v2" + public open val protectedToPublicOverriddenProperty2 get() = "Container.protectedToPublicOverriddenProperty2.v2" + public open val protectedToPublicOverriddenProperty3 get() = "Container.protectedToPublicOverriddenProperty3.v2" + public open val protectedToPublicOverriddenProperty4 = "Container.protectedToPublicOverriddenProperty4.v2" + internal open val protectedToInternalOverriddenProperty1 = "Container.protectedToInternalOverriddenProperty1.v2" + internal open val protectedToInternalOverriddenProperty2 get() = "Container.protectedToInternalOverriddenProperty2.v2" + internal open val protectedToInternalOverriddenProperty3 get() = "Container.protectedToInternalOverriddenProperty3.v2" + internal open val protectedToInternalOverriddenProperty4 = "Container.protectedToInternalOverriddenProperty4.v2" + private /*open*/ val protectedToPrivateOverriddenProperty1 = "Container.protectedToPrivateOverriddenProperty1.v2" + private /*open*/ val protectedToPrivateOverriddenProperty2 get() = "Container.protectedToPrivateOverriddenProperty2.v2" + private /*open*/ val protectedToPrivateOverriddenProperty3 get() = "Container.protectedToPrivateOverriddenProperty3.v2" + private /*open*/ val protectedToPrivateOverriddenProperty4 = "Container.protectedToPrivateOverriddenProperty4.v2" } diff --git a/compiler/testData/klibABI/changePropertyVisibility/lib2/l2.kt b/compiler/testData/klibABI/changePropertyVisibility/lib2/l2.kt index 1eac7b1eb86..56ac63522e8 100644 --- a/compiler/testData/klibABI/changePropertyVisibility/lib2/l2.kt +++ b/compiler/testData/klibABI/changePropertyVisibility/lib2/l2.kt @@ -14,4 +14,45 @@ class ContainerImpl : Container() { fun protectedToInternalProperty2Access() = protectedToInternalProperty2 fun protectedToPrivateProperty1Access() = protectedToPrivateProperty1 fun protectedToPrivateProperty2Access() = protectedToPrivateProperty2 + + // Overridden properties with changed visibility: + override val publicToProtectedOverriddenProperty1 = "ContainerImpl.publicToProtectedOverriddenProperty1" + override val publicToProtectedOverriddenProperty2 get() = "ContainerImpl.publicToProtectedOverriddenProperty2" + override val publicToProtectedOverriddenProperty3 get() = "ContainerImpl.publicToProtectedOverriddenProperty3" + override val publicToProtectedOverriddenProperty4 = "ContainerImpl.publicToProtectedOverriddenProperty4" + override val publicToInternalOverriddenProperty1 = "ContainerImpl.publicToInternalOverriddenProperty1" + override val publicToInternalOverriddenProperty2 get() = "ContainerImpl.publicToInternalOverriddenProperty2" + override val publicToInternalOverriddenProperty3 get() = "ContainerImpl.publicToInternalOverriddenProperty3" + override val publicToInternalOverriddenProperty4 = "ContainerImpl.publicToInternalOverriddenProperty4" + override val publicToPrivateOverriddenProperty1 = "ContainerImpl.publicToPrivateOverriddenProperty1" + override val publicToPrivateOverriddenProperty2 get() = "ContainerImpl.publicToPrivateOverriddenProperty2" + override val publicToPrivateOverriddenProperty3 get() = "ContainerImpl.publicToPrivateOverriddenProperty3" + override val publicToPrivateOverriddenProperty4 = "ContainerImpl.publicToPrivateOverriddenProperty4" + + override val protectedToPublicOverriddenProperty1 = "ContainerImpl.protectedToPublicOverriddenProperty1" + override val protectedToPublicOverriddenProperty2 get() = "ContainerImpl.protectedToPublicOverriddenProperty2" + override val protectedToPublicOverriddenProperty3 get() = "ContainerImpl.protectedToPublicOverriddenProperty3" + override val protectedToPublicOverriddenProperty4 = "ContainerImpl.protectedToPublicOverriddenProperty4" + override val protectedToInternalOverriddenProperty1 = "ContainerImpl.protectedToInternalOverriddenProperty1" + override val protectedToInternalOverriddenProperty2 get() = "ContainerImpl.protectedToInternalOverriddenProperty2" + override val protectedToInternalOverriddenProperty3 get() = "ContainerImpl.protectedToInternalOverriddenProperty3" + override val protectedToInternalOverriddenProperty4 = "ContainerImpl.protectedToInternalOverriddenProperty4" + override val protectedToPrivateOverriddenProperty1 = "ContainerImpl.protectedToPrivateOverriddenProperty1" + override val protectedToPrivateOverriddenProperty2 get() = "ContainerImpl.protectedToPrivateOverriddenProperty2" + override val protectedToPrivateOverriddenProperty3 get() = "ContainerImpl.protectedToPrivateOverriddenProperty3" + override val protectedToPrivateOverriddenProperty4 = "ContainerImpl.protectedToPrivateOverriddenProperty4" + + // As far as protected members can't be accessed outside of the class hierarchy, we need special accessors. + fun protectedToPublicOverriddenProperty1Access() = protectedToPublicOverriddenProperty1 + fun protectedToPublicOverriddenProperty2Access() = protectedToPublicOverriddenProperty2 + fun protectedToPublicOverriddenProperty3Access() = protectedToPublicOverriddenProperty3 + fun protectedToPublicOverriddenProperty4Access() = protectedToPublicOverriddenProperty4 + fun protectedToInternalOverriddenProperty1Access() = protectedToInternalOverriddenProperty1 + fun protectedToInternalOverriddenProperty2Access() = protectedToInternalOverriddenProperty2 + fun protectedToInternalOverriddenProperty3Access() = protectedToInternalOverriddenProperty3 + fun protectedToInternalOverriddenProperty4Access() = protectedToInternalOverriddenProperty4 + fun protectedToPrivateOverriddenProperty1Access() = protectedToPrivateOverriddenProperty1 + fun protectedToPrivateOverriddenProperty2Access() = protectedToPrivateOverriddenProperty2 + fun protectedToPrivateOverriddenProperty3Access() = protectedToPrivateOverriddenProperty3 + fun protectedToPrivateOverriddenProperty4Access() = protectedToPrivateOverriddenProperty4 } diff --git a/compiler/testData/klibABI/changePropertyVisibility/main/m.kt b/compiler/testData/klibABI/changePropertyVisibility/main/m.kt index bd74582acca..3f7c2c4b395 100644 --- a/compiler/testData/klibABI/changePropertyVisibility/main/m.kt +++ b/compiler/testData/klibABI/changePropertyVisibility/main/m.kt @@ -24,4 +24,28 @@ fun box() = abiTest { expectFailure(prefixed("property accessor protectedToInternalProperty2. can not be called")) { c.protectedToInternalProperty2Access() } expectFailure(prefixed("property accessor protectedToPrivateProperty1. can not be called")) { c.protectedToPrivateProperty1Access() } expectFailure(prefixed("property accessor protectedToPrivateProperty2. can not be called")) { c.protectedToPrivateProperty2Access() } + expectSuccess("ContainerImpl.publicToProtectedOverriddenProperty1") { c.publicToProtectedOverriddenProperty1 } + expectSuccess("ContainerImpl.publicToProtectedOverriddenProperty2") { c.publicToProtectedOverriddenProperty2 } + expectSuccess("ContainerImpl.publicToProtectedOverriddenProperty3") { c.publicToProtectedOverriddenProperty3 } + expectSuccess("ContainerImpl.publicToProtectedOverriddenProperty4") { c.publicToProtectedOverriddenProperty4 } + expectSuccess("ContainerImpl.publicToInternalOverriddenProperty1") { c.publicToInternalOverriddenProperty1 } + expectSuccess("ContainerImpl.publicToInternalOverriddenProperty2") { c.publicToInternalOverriddenProperty2 } + expectSuccess("ContainerImpl.publicToInternalOverriddenProperty3") { c.publicToInternalOverriddenProperty3 } + expectSuccess("ContainerImpl.publicToInternalOverriddenProperty4") { c.publicToInternalOverriddenProperty4 } + expectSuccess("ContainerImpl.publicToPrivateOverriddenProperty1") { c.publicToPrivateOverriddenProperty1 } + expectSuccess("ContainerImpl.publicToPrivateOverriddenProperty2") { c.publicToPrivateOverriddenProperty2 } + expectSuccess("ContainerImpl.publicToPrivateOverriddenProperty3") { c.publicToPrivateOverriddenProperty3 } + expectSuccess("ContainerImpl.publicToPrivateOverriddenProperty4") { c.publicToPrivateOverriddenProperty4 } + expectSuccess("ContainerImpl.protectedToPublicOverriddenProperty1") { c.protectedToPublicOverriddenProperty1Access() } + expectSuccess("ContainerImpl.protectedToPublicOverriddenProperty2") { c.protectedToPublicOverriddenProperty2Access() } + expectSuccess("ContainerImpl.protectedToPublicOverriddenProperty3") { c.protectedToPublicOverriddenProperty3Access() } + expectSuccess("ContainerImpl.protectedToPublicOverriddenProperty4") { c.protectedToPublicOverriddenProperty4Access() } + expectSuccess("ContainerImpl.protectedToInternalOverriddenProperty1") { c.protectedToInternalOverriddenProperty1Access() } + expectSuccess("ContainerImpl.protectedToInternalOverriddenProperty2") { c.protectedToInternalOverriddenProperty2Access() } + expectSuccess("ContainerImpl.protectedToInternalOverriddenProperty3") { c.protectedToInternalOverriddenProperty3Access() } + expectSuccess("ContainerImpl.protectedToInternalOverriddenProperty4") { c.protectedToInternalOverriddenProperty4Access() } + expectSuccess("ContainerImpl.protectedToPrivateOverriddenProperty1") { c.protectedToPrivateOverriddenProperty1Access() } + expectSuccess("ContainerImpl.protectedToPrivateOverriddenProperty2") { c.protectedToPrivateOverriddenProperty2Access() } + expectSuccess("ContainerImpl.protectedToPrivateOverriddenProperty3") { c.protectedToPrivateOverriddenProperty3Access() } + expectSuccess("ContainerImpl.protectedToPrivateOverriddenProperty4") { c.protectedToPrivateOverriddenProperty4Access() } }