Skip to content

Commit 18dfe3a

Browse files
committed
Check overriding before opaque types are opened
1 parent 1ff7929 commit 18dfe3a

File tree

2 files changed

+8
-3
lines changed

2 files changed

+8
-3
lines changed

compiler/src/dotty/tools/dotc/core/Phases.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ object Phases {
210210
private[this] var myTyperPhase: Phase = _
211211
private[this] var mySbtExtractDependenciesPhase: Phase = _
212212
private[this] var myPicklerPhase: Phase = _
213+
private[this] var myFirstTransformPhase: Phase = _
213214
private[this] var myCollectNullableFieldsPhase: Phase = _
214215
private[this] var myRefChecksPhase: Phase = _
215216
private[this] var myPatmatPhase: Phase = _
@@ -226,6 +227,7 @@ object Phases {
226227
final def typerPhase: Phase = myTyperPhase
227228
final def sbtExtractDependenciesPhase: Phase = mySbtExtractDependenciesPhase
228229
final def picklerPhase: Phase = myPicklerPhase
230+
final def firstTransformPhase = myFirstTransformPhase
229231
final def collectNullableFieldsPhase: Phase = myCollectNullableFieldsPhase
230232
final def refchecksPhase: Phase = myRefChecksPhase
231233
final def patmatPhase: Phase = myPatmatPhase
@@ -245,6 +247,7 @@ object Phases {
245247
myTyperPhase = phaseOfClass(classOf[FrontEnd])
246248
mySbtExtractDependenciesPhase = phaseOfClass(classOf[sbt.ExtractDependencies])
247249
myPicklerPhase = phaseOfClass(classOf[Pickler])
250+
myFirstTransformPhase = phaseOfClass(classOf[FirstTransform])
248251
myCollectNullableFieldsPhase = phaseOfClass(classOf[CollectNullableFields])
249252
myRefChecksPhase = phaseOfClass(classOf[RefChecks])
250253
myElimRepeatedPhase = phaseOfClass(classOf[ElimRepeated])

compiler/src/dotty/tools/dotc/typer/RefChecks.scala

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,22 +268,24 @@ object RefChecks {
268268
}
269269

270270
def compatibleTypes(memberTp: Type, otherTp: Type): Boolean =
271-
try
271+
try {
272+
val checkCtx = ctx.withPhase(ctx.base.firstTransformPhase)
272273
if (member.isType) // intersection of bounds to refined types must be nonempty
273274
memberTp.bounds.hi.hasSameKindAs(otherTp.bounds.hi) &&
274275
((memberTp frozen_<:< otherTp) ||
275276
!member.owner.derivesFrom(other.owner) && {
276277
// if member and other come from independent classes or traits, their
277278
// bounds must have non-empty-intersection
278279
val jointBounds = (memberTp.bounds & otherTp.bounds).bounds
279-
jointBounds.lo frozen_<:< jointBounds.hi
280+
(jointBounds.lo frozen_<:< jointBounds.hi)(checkCtx)
280281
})
281282
else
282283
member.name.is(DefaultGetterName) || // default getters are not checked for compatibility
283284
memberTp.overrides(otherTp,
284285
member.matchNullaryLoosely || other.matchNullaryLoosely ||
285286
ctx.testScala2Mode(overrideErrorMsg("no longer has compatible type"),
286-
(if (member.owner == clazz) member else clazz).pos))
287+
(if (member.owner == clazz) member else clazz).pos))(checkCtx)
288+
}
287289
catch {
288290
case ex: MissingType =>
289291
// can happen when called with upwardsSelf as qualifier of memberTp and otherTp,

0 commit comments

Comments
 (0)