@@ -387,9 +387,11 @@ object RefChecks {
387387 overrideError(" is an extension method, cannot override a normal method" )
388388 else if (other.is(ExtensionMethod ) && ! member.is(ExtensionMethod )) // (1.3)
389389 overrideError(" is a normal method, cannot override an extension method" )
390- else if (! other.is(Deferred ) &&
391- ! other.name.is(DefaultGetterName ) &&
392- ! member.isAnyOverride)
390+ else if ! other.is(Deferred )
391+ && ! member.is(Deferred )
392+ && ! other.name.is(DefaultGetterName )
393+ && ! member.isAnyOverride
394+ then
393395 // Exclusion for default getters, fixes SI-5178. We cannot assign the Override flag to
394396 // the default getter: one default getter might sometimes override, sometimes not. Example in comment on ticket.
395397 // Also exclusion for implicit shortcut methods
@@ -485,6 +487,22 @@ object RefChecks {
485487 while opc.hasNext do
486488 checkOverride(opc.overriding, opc.overridden)
487489 opc.next()
490+
491+ // The OverridingPairs cursor does assume that concrete overrides abstract
492+ // We have to check separately for an abstract definition in a subclass that
493+ // overrides a concrete definition in a superclass. E.g. the following (inspired
494+ // from neg/i11130.scala) needs to be rejected as well:
495+ //
496+ // class A { type T = B }
497+ // class B extends A { override type T }
498+ for
499+ dcl <- clazz.info.decls.iterator
500+ if dcl.is(Deferred )
501+ other <- dcl.allOverriddenSymbols
502+ if ! other.is(Deferred )
503+ do
504+ checkOverride(dcl, other)
505+
488506 printMixinOverrideErrors()
489507
490508 // Verifying a concrete class has nothing unimplemented.
@@ -748,17 +766,6 @@ object RefChecks {
748766 checkMemberTypesOK()
749767 checkCaseClassInheritanceInvariant()
750768 }
751- else if (clazz.is(Trait ) && ! (clazz derivesFrom defn.AnyValClass ))
752- // For non-AnyVal classes, prevent abstract methods in interfaces that override
753- // final members in Object; see #4431
754- for (decl <- clazz.info.decls) {
755- // Have to use matchingSymbol, not a method involving overridden symbols,
756- // because the scala type system understands that an abstract method here does not
757- // override a concrete method in Object. The jvm, however, does not.
758- val overridden = decl.matchingDecl(defn.ObjectClass , defn.ObjectType )
759- if (overridden.is(Final ))
760- report.error(TraitRedefinedFinalMethodFromAnyRef (overridden), decl.srcPos)
761- }
762769
763770 if (! clazz.is(Trait )) {
764771 // check that parameterized base classes and traits are typed in the same way as from the superclass
0 commit comments