@@ -1018,8 +1018,11 @@ object Types {
10181018 */
10191019 def safe_& (that : Type )(using Context ): Type = (this , that) match {
10201020 case (TypeBounds (lo1, hi1), TypeBounds (lo2, hi2)) =>
1021- TypeBounds (OrType (lo1.stripLazyRef, lo2.stripLazyRef), AndType (hi1.stripLazyRef, hi2.stripLazyRef))
1022- case _ => this & that
1021+ TypeBounds (
1022+ OrType .makeHk(lo1.stripLazyRef, lo2.stripLazyRef),
1023+ AndType .makeHk(hi1.stripLazyRef, hi2.stripLazyRef))
1024+ case _ =>
1025+ this & that
10231026 }
10241027
10251028 /** `this & that`, but handle CyclicReferences by falling back to `safe_&`.
@@ -2934,6 +2937,10 @@ object Types {
29342937 tp2
29352938 else
29362939 if (checkValid) apply(tp1, tp2) else unchecked(tp1, tp2)
2940+
2941+ /** Like `make`, but also supports higher-kinded types as argument */
2942+ def makeHk (tp1 : Type , tp2 : Type )(using Context ): Type =
2943+ ctx.typeComparer.liftIfHK(tp1, tp2, AndType .make(_, _, checkValid = false ), makeHk, _ | _)
29372944 }
29382945
29392946 abstract case class OrType (tp1 : Type , tp2 : Type ) extends AndOrType {
@@ -3020,6 +3027,10 @@ object Types {
30203027 def make (tp1 : Type , tp2 : Type )(using Context ): Type =
30213028 if (tp1 eq tp2) tp1
30223029 else apply(tp1, tp2)
3030+
3031+ /** Like `make`, but also supports higher-kinded types as argument */
3032+ def makeHk (tp1 : Type , tp2 : Type )(using Context ): Type =
3033+ ctx.typeComparer.liftIfHK(tp1, tp2, OrType (_, _), makeHk, _ & _)
30233034 }
30243035
30253036 /** An extractor object to pattern match against a nullable union.
0 commit comments