diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index bc286d844be..33172df71bd 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -37964,6 +37964,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/noRetentionAfter.kt"); } + @Test + @TestMetadata("overridableCheck.kt") + public void testOverridableCheck() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overridableCheck.kt"); + } + @Test @TestMetadata("override.kt") public void testOverride() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 564f2f611d9..29fe2e91652 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -37964,6 +37964,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/noRetentionAfter.kt"); } + @Test + @TestMetadata("overridableCheck.kt") + public void testOverridableCheck() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overridableCheck.kt"); + } + @Test @TestMetadata("override.kt") public void testOverride() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 42e2b311dab..23b04164418 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -37964,6 +37964,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/noRetentionAfter.kt"); } + @Test + @TestMetadata("overridableCheck.kt") + public void testOverridableCheck() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overridableCheck.kt"); + } + @Test @TestMetadata("override.kt") public void testOverride() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt index b246d8b7422..6d8693a57c7 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt @@ -13,15 +13,11 @@ import org.jetbrains.kotlin.fir.analysis.checkers.* import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.declarations.utils.isLocal import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol -import org.jetbrains.kotlin.fir.scopes.ProcessorAction -import org.jetbrains.kotlin.fir.scopes.processDirectlyOverriddenFunctions -import org.jetbrains.kotlin.fir.scopes.processDirectlyOverriddenProperties import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.fir.symbols.impl.* @@ -158,7 +154,7 @@ object FirOptInUsageBaseChecker { context, result, visited, fromSetter = false, dispatchReceiverType = null, fromSupertype = false ) } else { - fir.loadOverridableSpecificExperimentalities(session, context, parentClassSymbol, visited, result) + fir.loadOverridableSpecificExperimentalities(session, context, visited, result) } dispatchReceiverType?.addExperimentalities(context, result, visited) if (fromSetter && this is FirPropertySymbol) { @@ -197,35 +193,12 @@ object FirOptInUsageBaseChecker { return result } - @OptIn(SymbolInternals::class) private fun FirCallableDeclaration.loadOverridableSpecificExperimentalities( session: FirSession, context: CheckerContext, - parentClassSymbol: FirRegularClassSymbol?, visited: MutableSet, result: SmartSet ) { - if (isSubstitutionOrIntersectionOverride) { - parentClassSymbol?.lazyResolveToPhase(FirResolvePhase.STATUS) - val parentClassScope = parentClassSymbol?.unsubstitutedScope(context) - if (this is FirSimpleFunction) { - parentClassScope?.processDirectlyOverriddenFunctions(symbol) { overriddenSymbol -> - val overriddenFir = overriddenSymbol.fir - if (visited.add(overriddenFir)) { - overriddenFir.loadOverridableSpecificExperimentalities(session, context, parentClassSymbol, visited, result) - } - ProcessorAction.NEXT - } - } else if (this is FirProperty) { - parentClassScope?.processDirectlyOverriddenProperties(symbol) { overriddenSymbol -> - val overriddenFir = overriddenSymbol.fir - if (visited.add(overriddenFir)) { - overriddenFir.loadOverridableSpecificExperimentalities(session, context, parentClassSymbol, visited, result) - } - ProcessorAction.NEXT - } - } - } // Without coneTypeSafe v fails in MT test (FirRenderer.kt) returnTypeRef.coneTypeSafe().addExperimentalities(context, result, visited) receiverParameter?.typeRef?.coneType.addExperimentalities(context, result, visited) diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/overridableCheck.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/overridableCheck.fir.kt new file mode 100644 index 00000000000..0b0821b38d1 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/overridableCheck.fir.kt @@ -0,0 +1,22 @@ +@RequiresOptIn +@Target(AnnotationTarget.TYPEALIAS, AnnotationTarget.FUNCTION) +annotation class Marker + +class Wrapper + +@Marker +typealias TA = Wrapper + +open class Base { + @Marker + open fun foo(): T? = null + + open fun bar(): TA? = null +} + +class Derived : Base() + +fun test(d: Derived) { + d.foo() + d.bar() +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/overridableCheck.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/overridableCheck.kt new file mode 100644 index 00000000000..859c7ba402b --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/overridableCheck.kt @@ -0,0 +1,22 @@ +@RequiresOptIn +@Target(AnnotationTarget.TYPEALIAS, AnnotationTarget.FUNCTION) +annotation class Marker + +class Wrapper + +@Marker +typealias TA = Wrapper + +open class Base { + @Marker + open fun foo(): T? = null + + open fun bar(): TA? = null +} + +class Derived : Base() + +fun test(d: Derived) { + d.foo() + d.bar() +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/overridableCheck.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/overridableCheck.txt new file mode 100644 index 00000000000..ba38b1c9090 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/overridableCheck.txt @@ -0,0 +1,36 @@ +package + +public fun test(/*0*/ d: Derived): kotlin.Unit + +public open class Base { + public constructor Base() + public open fun bar(): TA? /* = Wrapper? */ + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @Marker public open fun foo(): T? + 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() + public open override /*1*/ /*fake_override*/ fun bar(): TA? /* = Wrapper? */ + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @Marker public open override /*1*/ /*fake_override*/ fun foo(): kotlin.String? + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@kotlin.RequiresOptIn @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPEALIAS, AnnotationTarget.FUNCTION}) public final annotation class Marker : kotlin.Annotation { + public constructor Marker() + 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 Wrapper { + public constructor Wrapper() + 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 +} +@Marker public typealias TA = Wrapper diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 7c2bd043953..42108a02df0 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -38054,6 +38054,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/noRetentionAfter.kt"); } + @Test + @TestMetadata("overridableCheck.kt") + public void testOverridableCheck() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overridableCheck.kt"); + } + @Test @TestMetadata("override.kt") public void testOverride() throws Exception {