@@ -1490,16 +1490,19 @@ class TypeComparer(@constructorOnly initctx: Context) extends ConstraintHandling
14901490 def isNewSubType (tp1 : Type ): Boolean =
14911491 def isCovered (tp : Type ): CoveredStatus =
14921492 tp.dealiasKeepRefiningAnnots.stripTypeVar match
1493- case tp : TypeRef if tp.symbol.isClass && tp.symbol != NothingClass && tp.symbol != NullClass => CoveredStatus .Covered
1493+ case tp : TypeRef =>
1494+ if tp.symbol.isClass && tp.symbol != NothingClass && tp.symbol != NullClass
1495+ then CoveredStatus .Covered
1496+ else CoveredStatus .Uncovered
14941497 case tp : AppliedType => isCovered(tp.tycon)
14951498 case tp : RefinedOrRecType => isCovered(tp.parent)
1496- case tp : AndType => isCovered(tp.tp1) combinedWith isCovered(tp.tp2)
1497- case tp : OrType => isCovered(tp.tp1) combinedWith isCovered(tp.tp2)
1499+ case tp : AndType => isCovered(tp.tp1) min isCovered(tp.tp2)
1500+ case tp : OrType => isCovered(tp.tp1) min isCovered(tp.tp2) max CoveredStatus . CoveredWithOr
14981501 case _ => CoveredStatus .Uncovered
14991502
15001503 val covered1 = isCovered(tp1)
15011504 val covered2 = isCovered(tp2)
1502- if CoveredStatus .bothCovered (covered1, covered2) && ! CoveredStatus .bothHaveOr (covered1, covered2) then
1505+ if (covered1 min covered2) >= CoveredStatus .CoveredWithOr && (covered1 max covered2) == CoveredStatus . Covered then
15031506 // println(s"useless subtype: $tp1 <:< $tp2")
15041507 false
15051508 else isSubType(tp1, tp2, approx.addLow)
@@ -2997,29 +3000,15 @@ object TypeComparer {
29973000 type ApproxState = ApproxState .Repr
29983001
29993002 /** Result of `isCovered` check. */
3000- object CoveredStatus :
3001- opaque type Repr = Int
3003+ private object CoveredStatus :
3004+ type Repr = Int
30023005
30033006 private inline val IsCovered = 2
30043007 private inline val NotHasOr = 1
30053008
3006- /** The type is not covered. */
3007- val Uncovered : Repr = 1
3008-
3009- /** The type is covered and contains OrTypes. */
3010- val CoveredWithOr : Repr = 2
3011-
3012- /** The type is covered and free from OrTypes. */
3013- val Covered : Repr = 3
3014-
3015- object Repr :
3016- extension (s : Repr )
3017- def combinedWith (that : => Repr ): Repr =
3018- if s == Uncovered then Uncovered
3019- else s min that
3020-
3021- inline def bothHaveOr (s1 : Repr , s2 : Repr ): Boolean = ~ ((s1 | s2) & NotHasOr ) != 0
3022- inline def bothCovered (s1 : Repr , s2 : Repr ): Boolean = (s1 & s2 & IsCovered ) != 0
3009+ val Uncovered : Repr = 1 // The type is not covered
3010+ val CoveredWithOr : Repr = 2 // The type is covered and contains OrTypes
3011+ val Covered : Repr = 3 // The type is covered and free from OrTypes
30233012 end CoveredStatus
30243013 type CoveredStatus = CoveredStatus .Repr
30253014
0 commit comments