Skip to content

Commit 2e2077a

Browse files
Backport "Report only non-overridden unimplemented members" to LTS (#22092)
Backports #21337 to the 3.3.5. PR submitted by the release tooling. [skip ci]
2 parents 5b7fbdd + 783d05c commit 2e2077a

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

Diff for: compiler/src/dotty/tools/dotc/typer/RefChecks.scala

+11-1
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,15 @@ object RefChecks {
600600
&& withMode(Mode.IgnoreCaptures)(mbrDenot.matchesLoosely(impl, alwaysCompareTypes = true)))
601601
.exists
602602

603+
/** Filter out symbols from `syms` that are overridden by a symbol appearing later in the list.
604+
* Symbols that are not overridden are kept. */
605+
def lastOverrides(syms: List[Symbol]): List[Symbol] =
606+
val deduplicated =
607+
syms.foldLeft(List.empty[Symbol]):
608+
case (acc, sym) if acc.exists(s => isOverridingPair(s, sym, clazz.thisType)) => acc
609+
case (acc, sym) => sym :: acc
610+
deduplicated.reverse
611+
603612
/** The term symbols in this class and its baseclasses that are
604613
* abstract in this class. We can't use memberNames for that since
605614
* a concrete member might have the same signature as an abstract
@@ -622,7 +631,8 @@ object RefChecks {
622631

623632
val missingMethods = grouped.toList flatMap {
624633
case (name, syms) =>
625-
syms.filterConserve(!_.isSetter)
634+
lastOverrides(syms)
635+
.filterConserve(!_.isSetter)
626636
.distinctBy(_.signature) // Avoid duplication for similar definitions (#19731)
627637
}
628638

Diff for: tests/neg/i21335.check

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
-- Error: tests/neg/i21335.scala:7:6 -----------------------------------------------------------------------------------
2+
7 |class Z1 extends Bar1 // error
3+
| ^
4+
| class Z1 needs to be abstract, since override def bar(): Bar1 in trait Bar1 is not defined
5+
-- Error: tests/neg/i21335.scala:12:6 ----------------------------------------------------------------------------------
6+
12 |class Z2 extends Bar2 // error
7+
| ^
8+
| class Z2 needs to be abstract, since def bar(): Bar2 in trait Bar2 is not defined

Diff for: tests/neg/i21335.scala

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
trait Foo:
2+
def bar(): Foo
3+
4+
trait Bar1 extends Foo:
5+
override def bar(): Bar1
6+
7+
class Z1 extends Bar1 // error
8+
9+
trait Bar2 extends Foo:
10+
def bar(): Bar2
11+
12+
class Z2 extends Bar2 // error

0 commit comments

Comments
 (0)