diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt index d1069c00489..9d8bdaa65eb 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt @@ -63,10 +63,12 @@ object FirOverrideChecker : FirClassChecker() { processFunctionsByName(memberSymbol.name) {} getDirectOverriddenFunctions(memberSymbol) } + is FirPropertySymbol -> { processPropertiesByName(memberSymbol.name) {} getDirectOverriddenProperties(memberSymbol) } + else -> throw IllegalArgumentException("unexpected member kind $memberSymbol") } } @@ -267,7 +269,22 @@ object FirOverrideChecker : FirClassChecker() { if (kind !is KtRealSourceElementKind && kind !is KtFakeSourceElementKind.PropertyFromParameter) return - val overridden = overriddenMemberSymbols.first().originalOrSelf() + val visibilityChecker = context.session.visibilityChecker + val file = context.findClosest() ?: return + val containingDeclarations = context.containingDeclarations + containingClass + + @OptIn(SymbolInternals::class) + val overridden = overriddenMemberSymbols.firstOrNull { + it.lazyResolveToPhase(FirResolvePhase.STATUS) + visibilityChecker.isVisible( + it.originalOrSelf().fir, + context.session, + file, + containingDeclarations, + null, + skipCheckForContainingClassVisibility = true + ) + }?.originalOrSelf() ?: return val originalContainingClassSymbol = overridden.containingClass()?.toSymbol(context.session) as? FirRegularClassSymbol ?: return reporter.reportOn( member.source, diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index ebb3ef5017c..62e5b2f9ab8 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -18073,6 +18073,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/fir/incorrectBytecodeWithEnhancedNullability.kt"); } + @Test + @TestMetadata("internalPotentialOverride.kt") + public void testInternalPotentialOverride() throws Exception { + runTest("compiler/testData/codegen/box/fir/internalPotentialOverride.kt"); + } + @Test @TestMetadata("IrBuiltIns.kt") public void testIrBuiltIns() throws Exception { diff --git a/compiler/testData/codegen/box/fir/internalPotentialOverride.kt b/compiler/testData/codegen/box/fir/internalPotentialOverride.kt new file mode 100644 index 00000000000..f4416262828 --- /dev/null +++ b/compiler/testData/codegen/box/fir/internalPotentialOverride.kt @@ -0,0 +1,17 @@ +// TARGET_BACKEND: JVM_IR +// MODULE: m1 +// FILE: A.kt + +open class A { + internal open fun foo() : Int = 1 +} + +// MODULE: m2(m1) +// FILE: B.kt + +class B : A() { + fun foo() : String = "OK" +} + +fun box() = B().foo() + diff --git a/compiler/testData/diagnostics/tests/override/InternalPotentialOverride.fir.kt b/compiler/testData/diagnostics/tests/override/InternalPotentialOverride.fir.kt deleted file mode 100644 index 8d18c9b2790..00000000000 --- a/compiler/testData/diagnostics/tests/override/InternalPotentialOverride.fir.kt +++ /dev/null @@ -1,21 +0,0 @@ -// MODULE: m1 -// FILE: A.kt - -open class A { - internal open fun foo() : Int = 1 -} - -open class AG { - internal open fun bar(arg: T) = arg -} - -// MODULE: m2(m1) -// FILE: B.kt - -class B : A() { - fun foo() : String = "" -} - -class BG : AG() { - fun bar(arg: Int) = arg -} diff --git a/compiler/testData/diagnostics/tests/override/InternalPotentialOverride.kt b/compiler/testData/diagnostics/tests/override/InternalPotentialOverride.kt index 9375cee0704..5c1d8bfc6aa 100644 --- a/compiler/testData/diagnostics/tests/override/InternalPotentialOverride.kt +++ b/compiler/testData/diagnostics/tests/override/InternalPotentialOverride.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // MODULE: m1 // FILE: A.kt diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index e9dd7d431e8..c153709b90c 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -18073,6 +18073,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/fir/incorrectBytecodeWithEnhancedNullability.kt"); } + @Test + @TestMetadata("internalPotentialOverride.kt") + public void testInternalPotentialOverride() throws Exception { + runTest("compiler/testData/codegen/box/fir/internalPotentialOverride.kt"); + } + @Test @TestMetadata("IrBuiltIns.kt") public void testIrBuiltIns() throws Exception {