diff --git a/compiler/testData/diagnostics/tests/exposed/exceptionOnFakeInvisible.kt b/compiler/testData/diagnostics/tests/exposed/exceptionOnFakeInvisible.kt new file mode 100644 index 00000000000..6b91def416e --- /dev/null +++ b/compiler/testData/diagnostics/tests/exposed/exceptionOnFakeInvisible.kt @@ -0,0 +1,12 @@ +// KT-14469: SOE during effective visibility evaluation + +abstract class Base(private val v: String) + +fun bar(arg: String) = arg + +class Derived : Base("123") { + + private inline fun foo() { + bar(v) + } +} diff --git a/compiler/testData/diagnostics/tests/exposed/exceptionOnFakeInvisible.txt b/compiler/testData/diagnostics/tests/exposed/exceptionOnFakeInvisible.txt new file mode 100644 index 00000000000..78793a4f643 --- /dev/null +++ b/compiler/testData/diagnostics/tests/exposed/exceptionOnFakeInvisible.txt @@ -0,0 +1,20 @@ +package + +public fun bar(/*0*/ arg: kotlin.String): kotlin.String + +public abstract class Base { + public constructor Base(/*0*/ v: kotlin.String) + private final val v: kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Derived : Base { + public constructor Derived() + invisible_fake final override /*1*/ /*fake_override*/ val v: kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + private final inline fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 1fa0968f327..347921c305b 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -7198,6 +7198,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("exceptionOnFakeInvisible.kt") + public void testExceptionOnFakeInvisible() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/exposed/exceptionOnFakeInvisible.kt"); + doTest(fileName); + } + @TestMetadata("functional.kt") public void testFunctional() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/exposed/functional.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/EffectiveVisibility.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/EffectiveVisibility.kt index 0eed8161225..891978a3620 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/EffectiveVisibility.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/EffectiveVisibility.kt @@ -233,12 +233,13 @@ private fun lowerBound(args: List) = if (args.isEmpty()) Public else lowerBound(args.first(), args.subList(1, args.size)) private fun Visibility.forVisibility(descriptor: ClassDescriptor? = null): EffectiveVisibility = when (this) { - Visibilities.PRIVATE, Visibilities.PRIVATE_TO_THIS -> Private + Visibilities.PRIVATE, Visibilities.PRIVATE_TO_THIS, Visibilities.INVISIBLE_FAKE -> Private Visibilities.PROTECTED -> Protected(descriptor) Visibilities.INTERNAL -> Internal Visibilities.PUBLIC -> Public Visibilities.LOCAL -> Local - else -> this.effectiveVisibility(descriptor) + // NB: visibility must be already normalized here, so e.g. no JavaVisibilities are possible at this point + else -> throw AssertionError("Visibility $name is not allowed in forVisibility") } fun effectiveVisibility(visibility: Visibility, descriptor: ClassDescriptor?) = visibility.forVisibility(descriptor)