File tree 3 files changed +28
-1
lines changed
compiler/src/dotty/tools/dotc/typer
3 files changed +28
-1
lines changed Original file line number Diff line number Diff line change @@ -3044,7 +3044,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
3044
3044
body
3045
3045
3046
3046
/** Implement givens that were declared with a `deferred` rhs.
3047
- * The a given value matching the declared type is searched in a
3047
+ * The given value matching the declared type is searched in a
3048
3048
* context directly enclosing the current class, in which all given
3049
3049
* parameters of the current class are also defined.
3050
3050
*/
@@ -3061,6 +3061,10 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
3061
3061
false
3062
3062
else true
3063
3063
3064
+ def willBeimplementedInParentClass (m : TermRef ) =
3065
+ val superCls = cls.superClass
3066
+ superCls.exists && superCls.asClass.baseClasses.contains(m.symbol.owner)
3067
+
3064
3068
def givenImpl (mbr : TermRef ): ValDef =
3065
3069
val dcl = mbr.symbol
3066
3070
val target = dcl.info.asSeenFrom(cls.thisType, dcl.owner)
@@ -3090,6 +3094,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
3090
3094
cls.thisType.implicitMembers
3091
3095
// .showing(i"impl def givens for $cls/$result")
3092
3096
.filter(_.symbol.isAllOf(DeferredGivenFlags , butNot = Param ))
3097
+ .filter(! willBeimplementedInParentClass(_)) // only implement the given in the topmost class
3093
3098
// .showing(i"impl def filtered givens for $cls/$result")
3094
3099
.filter(isGivenValue)
3095
3100
.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