diff --git a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala index da082f6c36fe..173d5e6b1f7e 100644 --- a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala +++ b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala @@ -702,8 +702,8 @@ object RefChecks { val missingMethods = grouped.toList flatMap { case (name, syms) => - val withoutSetters = syms filterNot (_.isSetter) - if (withoutSetters.nonEmpty) withoutSetters else syms + syms.filterConserve(!_.isSetter) + .distinctBy(_.signature) // Avoid duplication for similar definitions (#19731) } def stubImplementations: List[String] = { @@ -714,7 +714,7 @@ object RefChecks { if (regrouped.tail.isEmpty) membersStrings(regrouped.head._2) - else (regrouped.sortBy("" + _._1.name) flatMap { + else (regrouped.sortBy(_._1.name.toString()) flatMap { case (owner, members) => ("// Members declared in " + owner.fullName) +: membersStrings(members) :+ "" }).init @@ -733,7 +733,7 @@ object RefChecks { return } - for (member <- missing) { + for (member <- missingMethods) { def showDclAndLocation(sym: Symbol) = s"${sym.showDcl} in ${sym.owner.showLocated}" def undefined(msg: String) = diff --git a/tests/neg/i19731.check b/tests/neg/i19731.check new file mode 100644 index 000000000000..eebfb924d199 --- /dev/null +++ b/tests/neg/i19731.check @@ -0,0 +1,27 @@ +-- Error: tests/neg/i19731.scala:4:6 ----------------------------------------------------------------------------------- +4 |class F1 extends Foo: // error + | ^ + | class F1 needs to be abstract, since def foo(): Unit in class F1 is not defined +-- Error: tests/neg/i19731.scala:7:6 ----------------------------------------------------------------------------------- +7 |class F2 extends Foo: // error + | ^ + | class F2 needs to be abstract, since: + | it has 2 unimplemented members. + | /** As seen from class F2, the missing signatures are as follows. + | * For convenience, these are usable as stub implementations. + | */ + | def foo(): Unit = ??? + | def foo(x: Int): Unit = ??? +-- Error: tests/neg/i19731.scala:16:6 ---------------------------------------------------------------------------------- +16 |class B1 extends Bar: // error + | ^ + | class B1 needs to be abstract, since: + | it has 2 unimplemented members. + | /** As seen from class B1, the missing signatures are as follows. + | * For convenience, these are usable as stub implementations. + | */ + | // Members declared in B1 + | def foo(x: Int): Unit = ??? + | + | // Members declared in Bar + | def foo(): Unit = ??? diff --git a/tests/neg/i19731.scala b/tests/neg/i19731.scala new file mode 100644 index 000000000000..75fff0e53872 --- /dev/null +++ b/tests/neg/i19731.scala @@ -0,0 +1,17 @@ +trait Foo: + def foo(): Unit + +class F1 extends Foo: // error + def foo(): Unit + +class F2 extends Foo: // error + def foo(): Unit + def foo(x: Int): Unit + + +trait Bar: + def foo(): Unit + def foo(x: Int): Unit + +class B1 extends Bar: // error + def foo(x: Int): Unit