Skip to content

Commit 1340acb

Browse files
authored
Merge pull request #5664 from dotty-staging/fix-#5650
Fix #5650: Use upper bound of match types for rhs
2 parents a4d38b9 + d5de6bb commit 1340acb

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1229,8 +1229,8 @@ class Namer { typer: Typer =>
12291229

12301230
def typeDefSig(tdef: TypeDef, sym: Symbol, tparamSyms: List[TypeSymbol])(implicit ctx: Context): Type = {
12311231
def abstracted(tp: Type): Type = HKTypeLambda.fromParams(tparamSyms, tp)
1232-
val dummyInfo = abstracted(TypeBounds.empty)
1233-
sym.info = dummyInfo
1232+
val dummyInfo1 = abstracted(TypeBounds.empty)
1233+
sym.info = dummyInfo1
12341234
sym.setFlag(Provisional)
12351235
// Temporarily set info of defined type T to ` >: Nothing <: Any.
12361236
// This is done to avoid cyclic reference errors for F-bounds.
@@ -1248,6 +1248,16 @@ class Namer { typer: Typer =>
12481248
case LambdaTypeTree(_, body) => body
12491249
case rhs => rhs
12501250
}
1251+
1252+
// For match types: approximate with upper bound while evaluating the rhs.
1253+
val dummyInfo2 = rhs match {
1254+
case MatchTypeTree(bound, _, _) if !bound.isEmpty =>
1255+
abstracted(TypeBounds.upper(typedAheadType(bound).tpe))
1256+
case _ =>
1257+
dummyInfo1
1258+
}
1259+
sym.info = dummyInfo2
1260+
12511261
val rhsBodyType = typedAheadType(rhs).tpe
12521262
val rhsType = if (isDerived) rhsBodyType else abstracted(rhsBodyType)
12531263
val unsafeInfo = rhsType.toBounds
@@ -1268,7 +1278,8 @@ class Namer { typer: Typer =>
12681278
case _ =>
12691279
}
12701280
sym.normalizeOpaque()
1271-
ensureUpToDate(sym.typeRef, dummyInfo)
1281+
ensureUpToDate(sym.typeRef, dummyInfo1)
1282+
if (dummyInfo2 `ne` dummyInfo1) ensureUpToDate(sym.typeRef, dummyInfo2)
12721283
ensureUpToDate(sym.typeRef.appliedTo(tparamSyms.map(_.typeRef)), TypeBounds.empty)
12731284
sym.info
12741285
}

tests/pos/i5650.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
sealed abstract class N
2+
trait Z extends N
3+
trait S[P] extends N
4+
5+
object Test {
6+
type T[X] <: N =
7+
X match {
8+
case Z => Z
9+
case S[p] => T[p]
10+
}
11+
}

0 commit comments

Comments
 (0)