@@ -15,6 +15,7 @@ import util.Spans._
1515import util .Property
1616import collection .mutable
1717import tpd .ListOfTreeDecorator
18+ import Variances .alwaysInvariant
1819import config .{Config , Feature }
1920import config .Printers .typr
2021import Annotations ._
@@ -968,7 +969,10 @@ class Namer { typer: Typer =>
968969 override final def typeSig (sym : Symbol ): Type =
969970 val tparamSyms = completerTypeParams(sym)(ictx)
970971 given ctx as Context = nestedCtx
971- def abstracted (tp : TypeBounds ): TypeBounds = HKTypeLambda .boundsFromParams(tparamSyms, tp)
972+
973+ def abstracted (tp : TypeBounds ): TypeBounds =
974+ HKTypeLambda .boundsFromParams(tparamSyms, tp)
975+
972976 val dummyInfo1 = abstracted(TypeBounds .empty)
973977 sym.info = dummyInfo1
974978 sym.setFlag(Provisional )
@@ -998,8 +1002,22 @@ class Namer { typer: Typer =>
9981002 }
9991003 sym.info = dummyInfo2
10001004
1005+ // Treat the parameters of an upper type lambda bound on the RHS as non-variant.
1006+ // E.g. type F <: [X] =>> G and type F[X] <: G
1007+ // are treated alike.
1008+ def addVariances (tp : Type ): Type = tp match
1009+ case tp : TypeBounds =>
1010+ def recur (tp : Type ): Type = tp match
1011+ case tp : HKTypeLambda if ! tp.isDeclaredVarianceLambda =>
1012+ tp.withVariances(tp.paramNames.map(alwaysInvariant))
1013+ .derivedLambdaType(resType = recur(tp.resType))
1014+ case tp => tp
1015+ tp.derivedTypeBounds(tp.lo, recur(tp.hi))
1016+ case _ =>
1017+ tp
1018+
10011019 val rhs1 = typedAheadType(rhs)
1002- val rhsBodyType : TypeBounds = rhs1.tpe.toBounds
1020+ val rhsBodyType : TypeBounds = addVariances( rhs1.tpe) .toBounds
10031021 val unsafeInfo = if (isDerived) rhsBodyType else abstracted(rhsBodyType)
10041022
10051023 def opaqueToBounds (info : Type ): Type =
0 commit comments