@@ -15,6 +15,7 @@ import util.Spans._
15
15
import util .Property
16
16
import collection .mutable
17
17
import tpd .ListOfTreeDecorator
18
+ import Variances .alwaysInvariant
18
19
import config .{Config , Feature }
19
20
import config .Printers .typr
20
21
import Annotations ._
@@ -968,7 +969,10 @@ class Namer { typer: Typer =>
968
969
override final def typeSig (sym : Symbol ): Type =
969
970
val tparamSyms = completerTypeParams(sym)(ictx)
970
971
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
+
972
976
val dummyInfo1 = abstracted(TypeBounds .empty)
973
977
sym.info = dummyInfo1
974
978
sym.setFlag(Provisional )
@@ -998,8 +1002,22 @@ class Namer { typer: Typer =>
998
1002
}
999
1003
sym.info = dummyInfo2
1000
1004
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
+
1001
1019
val rhs1 = typedAheadType(rhs)
1002
- val rhsBodyType : TypeBounds = rhs1.tpe.toBounds
1020
+ val rhsBodyType : TypeBounds = addVariances( rhs1.tpe) .toBounds
1003
1021
val unsafeInfo = if (isDerived) rhsBodyType else abstracted(rhsBodyType)
1004
1022
1005
1023
def opaqueToBounds (info : Type ): Type =
0 commit comments