@@ -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 }
0 commit comments