@@ -1490,16 +1490,19 @@ class TypeComparer(@constructorOnly initctx: Context) extends ConstraintHandling
1490
1490
def isNewSubType (tp1 : Type ): Boolean =
1491
1491
def isCovered (tp : Type ): CoveredStatus =
1492
1492
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
1494
1497
case tp : AppliedType => isCovered(tp.tycon)
1495
1498
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) min CoveredStatus . CoveredWithOr
1498
1501
case _ => CoveredStatus .Uncovered
1499
1502
1500
1503
val covered1 = isCovered(tp1)
1501
1504
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
1503
1506
// println(s"useless subtype: $tp1 <:< $tp2")
1504
1507
false
1505
1508
else isSubType(tp1, tp2, approx.addLow)
@@ -2997,29 +3000,15 @@ object TypeComparer {
2997
3000
type ApproxState = ApproxState .Repr
2998
3001
2999
3002
/** Result of `isCovered` check. */
3000
- object CoveredStatus :
3001
- opaque type Repr = Int
3003
+ private object CoveredStatus :
3004
+ type Repr = Int
3002
3005
3003
3006
private inline val IsCovered = 2
3004
3007
private inline val NotHasOr = 1
3005
3008
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
3023
3012
end CoveredStatus
3024
3013
type CoveredStatus = CoveredStatus .Repr
3025
3014
0 commit comments