diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 97795825f1b..e8b3a7d6988 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.fir.diagnostics import com.intellij.psi.PsiElement +import com.intellij.psi.PsiNameIdentifierOwner import com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.kotlin.KtPsiSourceElement import org.jetbrains.kotlin.diagnostics.KtPsiDiagnostic diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 628557966c2..dc6fe8160f6 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.fir.diagnostics import com.intellij.psi.PsiElement +import com.intellij.psi.PsiNameIdentifierOwner import com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.kotlin.analysis.api.diagnostics.KtDiagnosticWithPsi import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol @@ -1927,7 +1928,7 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val containingClassName: Name } - interface CannotInferVisibility : KtFirDiagnostic { + interface CannotInferVisibility : KtFirDiagnostic { override val diagnosticClass get() = CannotInferVisibility::class val callable: KtCallableSymbol } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 1ee83ff95fe..e720780bd97 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.fir.diagnostics import com.intellij.psi.PsiElement +import com.intellij.psi.PsiNameIdentifierOwner import com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol @@ -2319,7 +2320,7 @@ internal class CannotInferVisibilityImpl( override val callable: KtCallableSymbol, firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, -) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.CannotInferVisibility +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.CannotInferVisibility internal class MultipleDefaultsInheritedFromSupertypesImpl( override val name: Name, diff --git a/compiler/fir/analysis-tests/testData/resolve/incorrectSuperCall.kt b/compiler/fir/analysis-tests/testData/resolve/incorrectSuperCall.kt index 0e9c05726da..6dcae6c07c0 100644 --- a/compiler/fir/analysis-tests/testData/resolve/incorrectSuperCall.kt +++ b/compiler/fir/analysis-tests/testData/resolve/incorrectSuperCall.kt @@ -11,7 +11,7 @@ open class B { open fun baz() {} } -class C : A, B() { +class C : A, B() { override fun foo() { super.foo() diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 57992456ae0..74f2e7bed40 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.checkers.generator.diagnostics import com.intellij.psi.PsiElement +import com.intellij.psi.PsiNameIdentifierOwner import com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind @@ -926,7 +927,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { parameter>("overridden") parameter("containingClassName") } - val CANNOT_INFER_VISIBILITY by error(PositioningStrategy.DECLARATION_NAME) { + val CANNOT_INFER_VISIBILITY by error(PositioningStrategy.DECLARATION_NAME) { parameter>("callable") } diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 6bf2cb3e1b7..a116e852069 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.analysis.diagnostics import com.intellij.psi.PsiElement +import com.intellij.psi.PsiNameIdentifierOwner import com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind @@ -518,7 +519,7 @@ object FirErrors { val DATA_CLASS_OVERRIDE_DEFAULT_VALUES: KtDiagnosticFactory2, FirClassSymbol<*>> by error2, FirClassSymbol<*>>(SourceElementPositioningStrategies.DATA_MODIFIER) val CANNOT_WEAKEN_ACCESS_PRIVILEGE: KtDiagnosticFactory3, Name> by error3, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val CANNOT_CHANGE_ACCESS_PRIVILEGE: KtDiagnosticFactory3, Name> by error3, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) - val CANNOT_INFER_VISIBILITY: KtDiagnosticFactory1> by error1>(SourceElementPositioningStrategies.DECLARATION_NAME) + val CANNOT_INFER_VISIBILITY: KtDiagnosticFactory1> by error1>(SourceElementPositioningStrategies.DECLARATION_NAME) val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES: KtDiagnosticFactory3>> by error3>>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE: KtDiagnosticFactory3>> by error3>>(SourceElementPositioningStrategies.DECLARATION_NAME) val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION: KtDiagnosticFactoryForDeprecation3>> by deprecationError3>>(ProhibitAllMultipleDefaultsInheritedFromSupertypes, SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) 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 668d1c9f3ca..162a339730a 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 @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.KtRealSourceElementKind +import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities @@ -141,17 +142,31 @@ sealed class FirOverrideChecker(mppKind: MppCheckerKind) : FirAbstractOverrideCh // Other kinds of fake overrides may also be incorrect, but not to that extent, so we can // check them more granularly. See the relevant comments. - firTypeScope.processAllProperties { - if (it.containingClassLookupTag() == declaration.symbol.toLookupTag() && !it.isSubstitutionOverride) { + fun checkMember(it: FirCallableSymbol<*>) { + val isFromThis = it.containingClassLookupTag() == declaration.symbol.toLookupTag() + + if (isFromThis && !it.isSubstitutionOverride) { checkMember(it, declaration, reporter, typeCheckerState, firTypeScope, context) + } else { + val source = it.source?.takeIf { isFromThis } ?: declaration.source + it.ensureKnownVisibility(context, reporter, source) } } - firTypeScope.processAllFunctions { - if (it.containingClassLookupTag() == declaration.symbol.toLookupTag() && !it.isSubstitutionOverride) { - checkMember(it, declaration, reporter, typeCheckerState, firTypeScope, context) - } - } + firTypeScope.processAllProperties(::checkMember) + firTypeScope.processAllFunctions(::checkMember) + } + + /** + * Returns `false` if [Visibilities.Unknown]. + */ + private fun FirCallableSymbol<*>.ensureKnownVisibility( + context: CheckerContext, + reporter: DiagnosticReporter, + source: KtSourceElement? = this.source, + ) = when { + visibility != Visibilities.Unknown -> true + else -> false.also { reporter.reportOn(source, FirErrors.CANNOT_INFER_VISIBILITY, this, context) } } private fun checkModality( @@ -178,13 +193,7 @@ sealed class FirOverrideChecker(mppKind: MppCheckerKind) : FirAbstractOverrideCh overriddenSymbols: List>, context: CheckerContext ) { - if (visibility == Visibilities.Unknown) { - // MANY_*_NOT_IMPLEMENTED implies CANNOT_INFER_VISIBILITY as per KT-63741 - val isManyNotImplementedDiagnosticReported = overriddenSymbols.count { !it.isAbstract } != 1 - val isSimpleToReasonAboutSituation = overriddenSymbols.none { it.isIntersectionOverride } - if (!(isManyNotImplementedDiagnosticReported && isSimpleToReasonAboutSituation)) { - reporter.reportOn(source, FirErrors.CANNOT_INFER_VISIBILITY, this, context) - } + if (!ensureKnownVisibility(context, reporter)) { return } diff --git a/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt b/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt index 610e50fbc35..72e50a851e1 100644 --- a/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt +++ b/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.sure object PositioningStrategies { - open class DeclarationHeader : PositioningStrategy() { + open class DeclarationHeader : PositioningStrategy() { override fun isValid(element: T): Boolean { if (element is KtNamedDeclaration && element !is KtObjectDeclaration && @@ -142,8 +142,8 @@ object PositioningStrategies { } @JvmField - val DECLARATION_NAME: PositioningStrategy = object : DeclarationHeader() { - override fun mark(element: KtNamedDeclaration): List { + val DECLARATION_NAME: PositioningStrategy = object : DeclarationHeader() { + override fun mark(element: PsiNameIdentifierOwner): List { val nameIdentifier = element.nameIdentifier if (nameIdentifier != null) { if (element is KtClassOrObject) { diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/notImplementedMembers.fir.kt b/compiler/testData/diagnostics/tests/annotations/rendering/notImplementedMembers.fir.kt index 11f6723d79c..9c6bb9582c6 100644 --- a/compiler/testData/diagnostics/tests/annotations/rendering/notImplementedMembers.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/rendering/notImplementedMembers.fir.kt @@ -45,4 +45,4 @@ interface GI : G { } class AG1(val a: A, val g: G) : A by a, G by g -class AG2() : AI, GI +class AG2() : AI, GI diff --git a/compiler/testData/diagnostics/tests/delegation/Delegation_MultipleDelegates.fir.kt b/compiler/testData/diagnostics/tests/delegation/Delegation_MultipleDelegates.fir.kt new file mode 100644 index 00000000000..34887b05dd4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/delegation/Delegation_MultipleDelegates.fir.kt @@ -0,0 +1,19 @@ +// !DIAGNOSTICS: -CONFLICTING_JVM_DECLARATIONS +interface One { + public open fun foo() : Int + private fun boo() = 10 +} +interface Two { + public open fun foo() : Int +} + +interface OneImpl : One { + public override fun foo() = 1 +} +interface TwoImpl : Two { + public override fun foo() = 2 +} + +class Test1() : TwoImpl, OneImpl {} +class Test2(a : One) : One by a, Two {} +class Test3(a : One, b : Two) : Two by b, One by a {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/delegation/Delegation_MultipleDelegates.kt b/compiler/testData/diagnostics/tests/delegation/Delegation_MultipleDelegates.kt index 93288159c5b..49639167e4e 100644 --- a/compiler/testData/diagnostics/tests/delegation/Delegation_MultipleDelegates.kt +++ b/compiler/testData/diagnostics/tests/delegation/Delegation_MultipleDelegates.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // !DIAGNOSTICS: -CONFLICTING_JVM_DECLARATIONS interface One { public open fun foo() : Int diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_after.fir.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_after.fir.kt index 765581922b7..5083fa9ae87 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_after.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_after.fir.kt @@ -78,7 +78,7 @@ open class NWEH: NotDeprecated, WarningDeprecated, ErrorDeprecated, HiddenDeprec class WE2: WE() -class NWE2: WE(), NotDeprecated +class NWE2: WE(), NotDeprecated class NWE3: WE(), NotDeprecated { override fun f() { diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_before.fir.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_before.fir.kt index 44193d7f394..14d9be6623f 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_before.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_before.fir.kt @@ -78,7 +78,7 @@ open class NWEH: NotDeprecated, WarningDeprecated, ErrorDeprecated, HiddenDeprec class WE2: WE() -class NWE2: WE(), NotDeprecated +class NWE2: WE(), NotDeprecated class NWE3: WE(), NotDeprecated { override fun f() { diff --git a/compiler/testData/diagnostics/tests/intersectionWithMultipleDefaultsInJava.fir.kt b/compiler/testData/diagnostics/tests/intersectionWithMultipleDefaultsInJava.fir.kt new file mode 100644 index 00000000000..6ac12129809 --- /dev/null +++ b/compiler/testData/diagnostics/tests/intersectionWithMultipleDefaultsInJava.fir.kt @@ -0,0 +1,34 @@ +// TARGET_BACKEND: JVM + +// FILE: IntCollection.java +interface IntCollection { + public boolean add(int key); +} + +// FILE: IntSet.java +interface IntSet extends IntCollection { + public default boolean add(Integer it) { return true; } + + // from the supertype + // public boolean add(int key); +} + +// FILE: AbstractCollection.java +abstract class AbstractCollection { + public boolean add(E it) { return true; } +} + +// FILE: AbstractIntCollection.java +abstract class AbstractIntCollection extends AbstractCollection { + public boolean add(int it) { return true; } + + // from the supertype + // public default boolen add(Integer it) { return true; } +} + +// FILE: AbstractIntSet.java +public abstract class AbstractIntSet extends AbstractIntCollection implements IntSet {} + +// FILE: Main.kt + +class KotlinClass : AbstractIntSet() diff --git a/compiler/testData/diagnostics/tests/intersectionWithMultipleDefaultsInJava.kt b/compiler/testData/diagnostics/tests/intersectionWithMultipleDefaultsInJava.kt index 17048d1fce7..7c0bd32b2b1 100644 --- a/compiler/testData/diagnostics/tests/intersectionWithMultipleDefaultsInJava.kt +++ b/compiler/testData/diagnostics/tests/intersectionWithMultipleDefaultsInJava.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // TARGET_BACKEND: JVM // FILE: IntCollection.java diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.fir.kt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.fir.kt index fffdc059ad7..4e38fb6c5b6 100644 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.fir.kt +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.fir.kt @@ -21,7 +21,7 @@ open class C : A() interface D : B -class E : C(), D +class E : C(), D fun main() { E().foo(42) diff --git a/compiler/testData/diagnostics/tests/multiplatform/scopes/manyImplMemberNotImplemented.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/scopes/manyImplMemberNotImplemented.fir.kt index 03c701e8a50..c8365afb9ee 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/scopes/manyImplMemberNotImplemented.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/scopes/manyImplMemberNotImplemented.fir.kt @@ -10,8 +10,8 @@ expect open class C1() expect interface I1 -open class Common1_1 : C1(), I1 -open class Common1_2 : I1, C1() +open class Common1_1 : C1(), I1 +open class Common1_2 : I1, C1() expect open class Expect1_1 : C1, I1 expect open class Expect1_2 : I1, C1 @@ -37,8 +37,8 @@ actual interface I1 { fun f() {} } -actual open class Expect1_1 : C1(), I1 -actual open class Expect1_2 : I1, C1() +actual open class Expect1_1 : C1(), I1 +actual open class Expect1_2 : I1, C1() actual abstract class C2 actual constructor() { diff --git a/compiler/testData/diagnostics/tests/multiplatform/scopes/manyInterfacesMemberNotImplemented.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/scopes/manyInterfacesMemberNotImplemented.fir.kt index 9a8609119df..78df967ff40 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/scopes/manyInterfacesMemberNotImplemented.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/scopes/manyInterfacesMemberNotImplemented.fir.kt @@ -11,9 +11,9 @@ expect interface S1 expect interface S2 -open class A : S1, S2 +open class A : S1, S2 -class B : A() +class B : A() // MODULE: jvm()()(common) // TARGET_PLATFORM: JVM diff --git a/compiler/testData/diagnostics/tests/override/FakeOverrideDifferentDeclarationSignatures.fir.kt b/compiler/testData/diagnostics/tests/override/FakeOverrideDifferentDeclarationSignatures.fir.kt new file mode 100644 index 00000000000..ea3be88048a --- /dev/null +++ b/compiler/testData/diagnostics/tests/override/FakeOverrideDifferentDeclarationSignatures.fir.kt @@ -0,0 +1,11 @@ +interface A { + fun f(): String = "string" +} + +open class B { + open fun f(): CharSequence = "charSequence" +} + +class C : B(), A + +val obj: A = object : B(), A {} diff --git a/compiler/testData/diagnostics/tests/override/FakeOverrideDifferentDeclarationSignatures.kt b/compiler/testData/diagnostics/tests/override/FakeOverrideDifferentDeclarationSignatures.kt index ebf944e3744..aba4ace8df5 100644 --- a/compiler/testData/diagnostics/tests/override/FakeOverrideDifferentDeclarationSignatures.kt +++ b/compiler/testData/diagnostics/tests/override/FakeOverrideDifferentDeclarationSignatures.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL interface A { fun f(): String = "string" } diff --git a/compiler/testData/diagnostics/tests/override/ParentInheritsManyImplementations.fir.kt b/compiler/testData/diagnostics/tests/override/ParentInheritsManyImplementations.fir.kt new file mode 100644 index 00000000000..49807f48b4b --- /dev/null +++ b/compiler/testData/diagnostics/tests/override/ParentInheritsManyImplementations.fir.kt @@ -0,0 +1,17 @@ +package d + +interface A { + fun foo() = 1 +} + +interface B { + fun foo() = 2 +} + +open class C : A, B {} + +interface E { + fun foo(): Int +} + +class D : C() {} diff --git a/compiler/testData/diagnostics/tests/override/ParentInheritsManyImplementations.kt b/compiler/testData/diagnostics/tests/override/ParentInheritsManyImplementations.kt index 6e6bfa47ddc..75d9920c5c9 100644 --- a/compiler/testData/diagnostics/tests/override/ParentInheritsManyImplementations.kt +++ b/compiler/testData/diagnostics/tests/override/ParentInheritsManyImplementations.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL package d interface A { diff --git a/compiler/testData/diagnostics/tests/override/varImplementedByInheritedVal.fir.kt b/compiler/testData/diagnostics/tests/override/varImplementedByInheritedVal.fir.kt index 66ae9d7edb4..e8af83216aa 100644 --- a/compiler/testData/diagnostics/tests/override/varImplementedByInheritedVal.fir.kt +++ b/compiler/testData/diagnostics/tests/override/varImplementedByInheritedVal.fir.kt @@ -20,9 +20,9 @@ open class CVar { class C1 : IVar, IVarDefault class C2 : CVal(), IVar -class C3 : CVal(), IVarDefault -class C4 : CVal(), IVar, IVarDefault +class C3 : CVal(), IVarDefault +class C4 : CVal(), IVar, IVarDefault class C5 : CVar(), IVar -class C6 : CVar(), IVarDefault -class C7 : CVar(), IVar, IVarDefault +class C6 : CVar(), IVarDefault +class C7 : CVar(), IVar, IVarDefault class C8(ival: IVal) : IVar, IVal by ival diff --git a/compiler/testData/diagnostics/tests/override/varImplementedByInheritedValError.fir.kt b/compiler/testData/diagnostics/tests/override/varImplementedByInheritedValError.fir.kt index e92b4c97aee..64092078006 100644 --- a/compiler/testData/diagnostics/tests/override/varImplementedByInheritedValError.fir.kt +++ b/compiler/testData/diagnostics/tests/override/varImplementedByInheritedValError.fir.kt @@ -20,9 +20,9 @@ open class CVar { class C1 : IVar, IVarDefault class C2 : CVal(), IVar -class C3 : CVal(), IVarDefault -class C4 : CVal(), IVar, IVarDefault +class C3 : CVal(), IVarDefault +class C4 : CVal(), IVar, IVarDefault class C5 : CVar(), IVar -class C6 : CVar(), IVarDefault -class C7 : CVar(), IVar, IVarDefault +class C6 : CVar(), IVarDefault +class C7 : CVar(), IVar, IVarDefault class C8(ival: IVal) : IVar, IVal by ival diff --git a/compiler/testData/diagnostics/tests/regressions/kt302.fir.kt b/compiler/testData/diagnostics/tests/regressions/kt302.fir.kt new file mode 100644 index 00000000000..0f32c90ddab --- /dev/null +++ b/compiler/testData/diagnostics/tests/regressions/kt302.fir.kt @@ -0,0 +1,13 @@ +// KT-302 Report an error when inheriting many implementations of the same member + +package kt302 + +interface A { + open fun foo() {} +} + +interface B { + open fun foo() {} +} + +class C : A, B {} //should be error here diff --git a/compiler/testData/diagnostics/tests/regressions/kt302.kt b/compiler/testData/diagnostics/tests/regressions/kt302.kt index 9d1e0328baa..299fd7fafae 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt302.kt +++ b/compiler/testData/diagnostics/tests/regressions/kt302.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // KT-302 Report an error when inheriting many implementations of the same member package kt302 diff --git a/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/intersectionOfPrimitiveBasedFunctions.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/intersectionOfPrimitiveBasedFunctions.fir.kt index a883f19e03f..906dbfb0b07 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/intersectionOfPrimitiveBasedFunctions.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/purelyImplementedCollection/intersectionOfPrimitiveBasedFunctions.fir.kt @@ -14,4 +14,4 @@ interface IS { fun replace(key: String, value: String): String? = null } -abstract class ZS : MyMap(), IS +abstract class ZS : MyMap(), IS