@@ -1229,8 +1229,8 @@ class Namer { typer: Typer =>
1229
1229
1230
1230
def typeDefSig (tdef : TypeDef , sym : Symbol , tparamSyms : List [TypeSymbol ])(implicit ctx : Context ): Type = {
1231
1231
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
1234
1234
sym.setFlag(Provisional )
1235
1235
// Temporarily set info of defined type T to ` >: Nothing <: Any.
1236
1236
// This is done to avoid cyclic reference errors for F-bounds.
@@ -1248,6 +1248,16 @@ class Namer { typer: Typer =>
1248
1248
case LambdaTypeTree (_, body) => body
1249
1249
case rhs => rhs
1250
1250
}
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
+
1251
1261
val rhsBodyType = typedAheadType(rhs).tpe
1252
1262
val rhsType = if (isDerived) rhsBodyType else abstracted(rhsBodyType)
1253
1263
val unsafeInfo = rhsType.toBounds
@@ -1268,7 +1278,8 @@ class Namer { typer: Typer =>
1268
1278
case _ =>
1269
1279
}
1270
1280
sym.normalizeOpaque()
1271
- ensureUpToDate(sym.typeRef, dummyInfo)
1281
+ ensureUpToDate(sym.typeRef, dummyInfo1)
1282
+ if (dummyInfo2 `ne` dummyInfo1) ensureUpToDate(sym.typeRef, dummyInfo2)
1272
1283
ensureUpToDate(sym.typeRef.appliedTo(tparamSyms.map(_.typeRef)), TypeBounds .empty)
1273
1284
sym.info
1274
1285
}
0 commit comments