Skip to content

Commit a80a601

Browse files
Backport "fix: Only implement a deferred given in a class if its parent won't implement it" to 3.5.2 (#21473)
Backports #21206 to the 3.5.2 branch. PR submitted by the release tooling. [skip ci]
2 parents 29307f1 + 2b7a672 commit a80a601

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -3019,7 +3019,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
30193019
body
30203020

30213021
/** Implement givens that were declared with a `deferred` rhs.
3022-
* The a given value matching the declared type is searched in a
3022+
* The given value matching the declared type is searched in a
30233023
* context directly enclosing the current class, in which all given
30243024
* parameters of the current class are also defined.
30253025
*/
@@ -3036,6 +3036,10 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
30363036
false
30373037
else true
30383038

3039+
def willBeimplementedInParentClass(m: TermRef) =
3040+
val superCls = cls.superClass
3041+
superCls.exists && superCls.asClass.baseClasses.contains(m.symbol.owner)
3042+
30393043
def givenImpl(mbr: TermRef): ValDef =
30403044
val dcl = mbr.symbol
30413045
val target = dcl.info.asSeenFrom(cls.thisType, dcl.owner)
@@ -3065,6 +3069,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
30653069
cls.thisType.implicitMembers
30663070
//.showing(i"impl def givens for $cls/$result")
30673071
.filter(_.symbol.isAllOf(DeferredGivenFlags, butNot = Param))
3072+
.filter(!willBeimplementedInParentClass(_)) // only implement the given in the topmost class
30683073
//.showing(i"impl def filtered givens for $cls/$result")
30693074
.filter(isGivenValue)
30703075
.map(givenImpl)

Diff for: tests/pos/i21189-alt.scala

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//> using options -source:future -language:experimental.modularity
2+
3+
class MySortedSet[T : Ord] extends SortedSet[T]
4+
5+
trait Ord[T]
6+
7+
trait Sorted[T] extends ParentOfSorted[T]
8+
9+
trait ParentOfSorted[T]:
10+
given Ord[T] as ord = compiletime.deferred
11+
12+
class SortedSet[T : Ord] extends Sorted[T]

Diff for: tests/pos/i21189.scala

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//> using options -source:future -language:experimental.modularity
2+
3+
class MySortedSet[T : Ord] extends SortedSet[T]
4+
5+
trait Ord[T]
6+
7+
trait Sorted[T]:
8+
given Ord[T] as ord = compiletime.deferred
9+
10+
class SortedSet[T : Ord] extends Sorted[T]

0 commit comments

Comments
 (0)