@@ -519,32 +519,21 @@ class OrderingConstraint(private val boundsMap: ParamBounds,
519
519
def mergeParams (ps1 : List [TypeParamRef ], ps2 : List [TypeParamRef ]) =
520
520
(ps1 /: ps2)((ps1, p2) => if (ps1.contains(p2)) ps1 else p2 :: ps1)
521
521
522
- @ tailrec
523
- def mergeEntries (e1 : Type , e2 : Type , retry : Boolean = true ): Type = e1 match {
524
- case e1 : TypeBounds =>
525
- e2 match {
526
- case e2 : TypeBounds => e1 & e2
527
- case _ if e1 contains e2 => e2
528
- case _ => mergeError
529
- }
530
- case tv1 : TypeVar =>
531
- e2 match {
532
- case tv2 : TypeVar if tv1.instanceOpt eq tv2.instanceOpt => e1
533
- case _ => mergeError
534
- }
522
+ // Must be symmetric
523
+ def mergeEntries (e1 : Type , e2 : Type ): Type =
524
+ (e1, e2) match {
535
525
case _ if e1 eq e2 => e1
536
- case _ if retry =>
537
- // mergeEntries must be commutative
538
- mergeEntries(e2, e1, false )
526
+ case (e1 : TypeBounds , e2 : TypeBounds ) => e1 & e2
527
+ case (e1 : TypeBounds , _) if e1 contains e2 => e2
528
+ case (_, e2 : TypeBounds ) if e2 contains e1 => e1
529
+ case (tv1 : TypeVar , tv2 : TypeVar ) if tv1.instanceOpt eq tv2.instanceOpt => e1
539
530
case _ =>
540
- mergeError
541
- }
542
-
543
- def mergeError = throw new AssertionError (i " cannot merge $this with $other" )
531
+ throw new AssertionError (i " cannot merge $this with $other, mergeEntries( $e1, $e2) failed " )
532
+ }
544
533
545
534
val that = other.asInstanceOf [OrderingConstraint ]
546
535
new OrderingConstraint (
547
- merge(this .boundsMap, that.boundsMap, mergeEntries(_, _) ),
536
+ merge(this .boundsMap, that.boundsMap, mergeEntries),
548
537
merge(this .lowerMap, that.lowerMap, mergeParams),
549
538
merge(this .upperMap, that.upperMap, mergeParams))
550
539
}
0 commit comments