@@ -360,31 +360,6 @@ object RefChecks {
360
360
361
361
// Console.println(infoString(member) + " overrides " + infoString(other) + " in " + clazz);//DEBUG
362
362
363
- // return if we already checked this combination elsewhere
364
- if (member.owner != clazz) {
365
- def deferredCheck = member.is(Deferred ) || ! other.is(Deferred )
366
- def subOther (s : Symbol ) = s derivesFrom other.owner
367
- def subMember (s : Symbol ) = s derivesFrom member.owner
368
-
369
- if (subOther(member.owner) && deferredCheck)
370
- // println(i"skip 1 ${member.showLocated}, ${other.showLocated}")
371
- // Console.println(infoString(member) + " shadows1 " + infoString(other) " in " + clazz);//DEBUG
372
- return
373
- /*
374
- val parentSymbols = clazz.info.parents.map(_.typeSymbol)
375
- def matchIn(parent: Symbol): Boolean = considerMatching(member, other, parent.thisType)
376
- if parentSymbols.exists(p =>
377
- subOther(p) && subMember(p) && deferredCheck && matchIn(p))
378
- then
379
- println(i"skip 2 ${member.showLocated}, ${other.showLocated}")
380
- //Console.println(infoString(member) + " shadows2 " + infoString(other) + " in " + clazz);//DEBUG
381
- return
382
- if parentSymbols.forall(p => subOther(p) == subMember(p) && matchIn(p)) then
383
- println(i"skip 3 ${member.showLocated}, ${other.showLocated}")
384
- //Console.println(infoString(member) + " shadows " + infoString(other) + " in " + clazz);//DEBUG
385
- return*/
386
- }
387
-
388
363
/* Is the intersection between given two lists of overridden symbols empty? */
389
364
def intersectionIsEmpty (syms1 : Iterator [Symbol ], syms2 : Iterator [Symbol ]) = {
390
365
val set2 = syms2.toSet
@@ -419,7 +394,9 @@ object RefChecks {
419
394
overrideError(" cannot be used here - class definitions cannot be overridden" )
420
395
else if (! other.is(Deferred ) && member.isClass)
421
396
overrideError(" cannot be used here - classes can only override abstract types" )
422
- else if (other.isEffectivelyFinal) // (1.2)
397
+ else if other.isEffectivelyFinal && ! member.owner.derivesFrom(other.owner) then // (1.2)
398
+ // If member is in a subclass, we checked this before or the signatures are different
399
+ // This escape clause is needed to make MapView in stdlib213 compile
423
400
overrideError(i " cannot override final member ${other.showLocated}" )
424
401
else if (member.is(ExtensionMethod ) && ! other.is(ExtensionMethod )) // (1.3)
425
402
overrideError(" is an extension method, cannot override a normal method" )
@@ -440,15 +417,22 @@ object RefChecks {
440
417
member.setFlag(Override )
441
418
else if (member.isType && self.memberInfo(member) =:= self.memberInfo(other))
442
419
() // OK, don't complain about type aliases which are equal
443
- else if (member.owner != clazz && other.owner != clazz &&
444
- ! (other.owner derivesFrom member.owner))
420
+ else if member.owner != clazz
421
+ && other.owner != clazz
422
+ && ! other.owner.derivesFrom(member.owner)
423
+ && ! member.owner.derivesFrom(other.owner)
424
+ then
445
425
emitOverrideError(
446
426
s " $clazz inherits conflicting members: \n "
447
427
+ infoStringWithLocation(other) + " and\n " + infoStringWithLocation(member)
448
428
+ " \n (Note: this can be resolved by declaring an override in " + clazz + " .)" )
449
429
else if member.is(Exported ) then
450
430
overrideError(" cannot override since it comes from an export" )
451
- else
431
+ else if ! member.owner.derivesFrom(other.owner) then
432
+ // if `member.owner` derives from `other.owner` then the relationship was either
433
+ // checked before, or `member` and `other` have different signatures in `member.owner`,
434
+ // in which case we could not add an `override` anyway.
435
+ // This escape clause is needed to make MapView in stdlib213 compile
452
436
overrideError(" needs `override` modifier" )
453
437
else if (other.is(AbsOverride ) && other.isIncompleteIn(clazz) && ! member.is(AbsOverride ))
454
438
overrideError(" needs `abstract override` modifiers" )
0 commit comments