Skip to content

Commit f28a83c

Browse files
committed
Dont use non-local returns in lubs
These returns were non-local only when Config.tracingEnabled was set to true. But then they prevented recompilation under -Xfatal-errors.
1 parent 2662e6f commit f28a83c

File tree

1 file changed

+28
-23
lines changed

1 file changed

+28
-23
lines changed

compiler/src/dotty/tools/dotc/core/TypeComparer.scala

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1726,31 +1726,36 @@ class TypeComparer(initctx: Context) extends ConstraintHandling[AbsentContext] w
17261726
* @note We do not admit singleton types in or-types as lubs.
17271727
*/
17281728
def lub(tp1: Type, tp2: Type, canConstrain: Boolean = false): Type = /*>|>*/ trace(s"lub(${tp1.show}, ${tp2.show}, canConstrain=$canConstrain)", subtyping, show = true) /*<|<*/ {
1729-
if (tp1 eq tp2) return tp1
1730-
if (!tp1.exists) return tp1
1731-
if (!tp2.exists) return tp2
1732-
if ((tp1 isRef AnyClass) || (tp1 isRef AnyKindClass) || (tp2 isRef NothingClass)) return tp1
1733-
if ((tp2 isRef AnyClass) || (tp2 isRef AnyKindClass) || (tp1 isRef NothingClass)) return tp2
1734-
val atoms1 = tp1.atoms
1735-
if (atoms1.nonEmpty && !widenInUnions) {
1736-
val atoms2 = tp2.atoms
1737-
if (atoms2.nonEmpty) {
1738-
if (atoms1.subsetOf(atoms2)) return tp2
1739-
if (atoms2.subsetOf(atoms1)) return tp1
1740-
if ((atoms1 & atoms2).isEmpty) return orType(tp1, tp2)
1741-
}
1742-
}
1743-
val t1 = mergeIfSuper(tp1, tp2, canConstrain)
1744-
if (t1.exists) return t1
1729+
if (tp1 eq tp2) tp1
1730+
else if (!tp1.exists) tp1
1731+
else if (!tp2.exists) tp2
1732+
else if ((tp1 isRef AnyClass) || (tp1 isRef AnyKindClass) || (tp2 isRef NothingClass)) tp1
1733+
else if ((tp2 isRef AnyClass) || (tp2 isRef AnyKindClass) || (tp1 isRef NothingClass)) tp2
1734+
else {
1735+
def mergedLub: Type = {
1736+
val atoms1 = tp1.atoms
1737+
if (atoms1.nonEmpty && !widenInUnions) {
1738+
val atoms2 = tp2.atoms
1739+
if (atoms2.nonEmpty) {
1740+
if (atoms1.subsetOf(atoms2)) return tp2
1741+
if (atoms2.subsetOf(atoms1)) return tp1
1742+
if ((atoms1 & atoms2).isEmpty) return orType(tp1, tp2)
1743+
}
1744+
}
1745+
val t1 = mergeIfSuper(tp1, tp2, canConstrain)
1746+
if (t1.exists) return t1
17451747

1746-
val t2 = mergeIfSuper(tp2, tp1, canConstrain)
1747-
if (t2.exists) return t2
1748+
val t2 = mergeIfSuper(tp2, tp1, canConstrain)
1749+
if (t2.exists) return t2
17481750

1749-
def widen(tp: Type) = if (widenInUnions) tp.widen else tp.widenIfUnstable
1750-
val tp1w = widen(tp1)
1751-
val tp2w = widen(tp2)
1752-
if ((tp1 ne tp1w) || (tp2 ne tp2w)) lub(tp1w, tp2w)
1753-
else orType(tp1w, tp2w) // no need to check subtypes again
1751+
def widen(tp: Type) = if (widenInUnions) tp.widen else tp.widenIfUnstable
1752+
val tp1w = widen(tp1)
1753+
val tp2w = widen(tp2)
1754+
if ((tp1 ne tp1w) || (tp2 ne tp2w)) lub(tp1w, tp2w)
1755+
else orType(tp1w, tp2w) // no need to check subtypes again
1756+
}
1757+
mergedLub
1758+
}
17541759
}
17551760

17561761
/** The least upper bound of a list of types */

0 commit comments

Comments
 (0)