File tree Expand file tree Collapse file tree 3 files changed +28
-1
lines changed
compiler/src/dotty/tools/dotc/typer Expand file tree Collapse file tree 3 files changed +28
-1
lines changed Original file line number Diff line number Diff 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)
Original file line number Diff line number Diff line change 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 ]
Original file line number Diff line number Diff line change 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 ]
You can’t perform that action at this time.
0 commit comments