@@ -1530,27 +1530,32 @@ class TypeComparer(initctx: Context) extends ConstraintHandling[AbsentContext] {
1530
1530
* @note We do not admit singleton types in or-types as lubs.
1531
1531
*/
1532
1532
def lub (tp1 : Type , tp2 : Type , canConstrain : Boolean = false ): Type = /* >|>*/ trace(s " lub( ${tp1.show}, ${tp2.show}, canConstrain= $canConstrain) " , subtyping, show = true ) /* <|<*/ {
1533
- if (tp1 eq tp2) tp1
1534
- else if (! tp1.exists) tp1
1535
- else if (! tp2.exists) tp2
1536
- else if ((tp1 isRef AnyClass ) || (tp1 isRef AnyKindClass ) || (tp2 isRef NothingClass )) tp1
1537
- else if ((tp2 isRef AnyClass ) || (tp2 isRef AnyKindClass ) || (tp1 isRef NothingClass )) tp2
1538
- else {
1539
- val t1 = mergeIfSuper(tp1, tp2, canConstrain)
1540
- if (t1.exists) t1
1541
- else {
1542
- val t2 = mergeIfSuper(tp2, tp1, canConstrain)
1543
- if (t2.exists) t2
1544
- else {
1545
- def widen (tp : Type ) =
1546
- if (ctx.scala2Mode || ctx.erasedTypes) tp.widen else tp.widenIfUnstable
1547
- val tp1w = widen(tp1)
1548
- val tp2w = widen(tp2)
1549
- if ((tp1 ne tp1w) || (tp2 ne tp2w)) lub(tp1w, tp2w)
1550
- else orType(tp1w, tp2w) // no need to check subtypes again
1551
- }
1533
+ if (tp1 eq tp2) return tp1
1534
+ if (! tp1.exists) return tp1
1535
+ if (! tp2.exists) return tp2
1536
+ if ((tp1 isRef AnyClass ) || (tp1 isRef AnyKindClass ) || (tp2 isRef NothingClass )) return tp1
1537
+ if ((tp2 isRef AnyClass ) || (tp2 isRef AnyKindClass ) || (tp1 isRef NothingClass )) return tp2
1538
+ val atoms1 = tp1.atoms
1539
+ if (atoms1.nonEmpty && ! ctx.scala2Mode && ! ctx.erasedTypes) {
1540
+ val atoms2 = tp2.atoms
1541
+ if (atoms2.nonEmpty) {
1542
+ if (atoms1.subsetOf(atoms2)) return tp2
1543
+ if (atoms2.subsetOf(atoms1)) return tp1
1544
+ if ((atoms1 & atoms2).isEmpty) return orType(tp1, tp2)
1552
1545
}
1553
1546
}
1547
+ val t1 = mergeIfSuper(tp1, tp2, canConstrain)
1548
+ if (t1.exists) return t1
1549
+
1550
+ val t2 = mergeIfSuper(tp2, tp1, canConstrain)
1551
+ if (t2.exists) return t2
1552
+
1553
+ def widen (tp : Type ) =
1554
+ if (ctx.scala2Mode || ctx.erasedTypes) tp.widen else tp.widenIfUnstable
1555
+ val tp1w = widen(tp1)
1556
+ val tp2w = widen(tp2)
1557
+ if ((tp1 ne tp1w) || (tp2 ne tp2w)) lub(tp1w, tp2w)
1558
+ else orType(tp1w, tp2w) // no need to check subtypes again
1554
1559
}
1555
1560
1556
1561
/** The least upper bound of a list of types */
0 commit comments