@@ -239,6 +239,11 @@ object RefChecks {
239
239
// compatibility checking.
240
240
def checkSubType (tp1 : Type , tp2 : Type )(using Context ): Boolean = tp1 frozen_<:< tp2
241
241
242
+ /** A hook that allows to adjust the type of `other` before checking conformance.
243
+ * Overridden in capture checking to handle non-capture checked superclasses leniently.
244
+ */
245
+ def adjustOtherType (tp : Type , other : Symbol )(using Context ): Type = tp
246
+
242
247
private val subtypeChecker : (Type , Type ) => Context ?=> Boolean = this .checkSubType
243
248
244
249
def checkAll (checkOverride : ((Type , Type ) => Context ?=> Boolean , Symbol , Symbol ) => Unit ) =
@@ -352,14 +357,18 @@ object RefChecks {
352
357
&& atPhase(typerPhase):
353
358
loop(member.info.paramInfoss, other.info.paramInfoss)
354
359
360
+ val checker =
361
+ if makeOverridingPairsChecker == null then OverridingPairsChecker (clazz, self)
362
+ else makeOverridingPairsChecker(clazz, self)
363
+
355
364
/* Check that all conditions for overriding `other` by `member`
356
365
* of class `clazz` are met.
357
366
*/
358
367
def checkOverride (checkSubType : (Type , Type ) => Context ?=> Boolean , member : Symbol , other : Symbol ): Unit =
359
368
def memberTp (self : Type ) =
360
369
if (member.isClass) TypeAlias (member.typeRef.EtaExpand (member.typeParams))
361
370
else self.memberInfo(member)
362
- def otherTp (self : Type ) = self.memberInfo(other)
371
+ def otherTp (self : Type ) = checker.adjustOtherType( self.memberInfo(other), other)
363
372
364
373
refcheck.println(i " check override ${infoString(member)} overriding ${infoString(other)}" )
365
374
@@ -564,7 +573,6 @@ object RefChecks {
564
573
overrideDeprecation(" " , member, other, " removed or renamed" )
565
574
end checkOverride
566
575
567
- val checker = if makeOverridingPairsChecker == null then OverridingPairsChecker (clazz, self) else makeOverridingPairsChecker(clazz, self)
568
576
checker.checkAll(checkOverride)
569
577
printMixinOverrideErrors()
570
578
0 commit comments