@@ -53,7 +53,7 @@ object TypeTestsCasts {
53
53
* 6. if `P = T1 | T2` or `P = T1 & T2`, checkable(X, T1) && checkable(X, T2).
54
54
* 7. if `P` is a refinement type, "it's a refinement type"
55
55
* 8. if `P` is a local class which is not statically reachable from the scope where `X` is defined, "it's a local class"
56
- * 9. if `X` is `T1 | T2`, checkable(T1, P) && checkable(T2, P) or (isCheckDefinitelyFalse(T1, P) && checkable(T2, P)) or (checkable(T1, P) && isCheckDefinitelyFalse(T2, P)) .
56
+ * 9. if `X` is `T1 | T2`, checkable(T1, P) && checkable(T2, P).
57
57
* 10. otherwise, ""
58
58
*/
59
59
def whyUncheckable (X : Type , P : Type , span : Span )(using Context ): String = atPhase(Phases .refchecksPhase.next) {
@@ -132,41 +132,6 @@ object TypeTestsCasts {
132
132
133
133
}
134
134
135
- /** Whether the check X.isInstanceOf[P] is definitely false? */
136
- def isCheckDefinitelyFalse (X : Type , P : Type )(using Context ): Boolean = trace(s " isCheckDefinitelyFalse( ${X .show}, ${P .show}) " ) {
137
- X .widenDealias match
138
- case AndType (x1, x2) =>
139
- isCheckDefinitelyFalse(x1, P ) || isCheckDefinitelyFalse(x2, P )
140
-
141
- case x =>
142
- P .widenDealias match
143
- case AndType (p1, p2) =>
144
- isCheckDefinitelyFalse(x, p1) || isCheckDefinitelyFalse(x, p2)
145
-
146
- case p =>
147
- val pSpace = Typ (p)
148
- val xSpace = Typ (x)
149
- if pSpace.canDecompose then
150
- val ps = pSpace.decompose.map(_.tp)
151
- ps.forall(p => isCheckDefinitelyFalse(x, p))
152
- else if xSpace.canDecompose then
153
- val xs = xSpace.decompose.map(_.tp)
154
- xs.forall(x => isCheckDefinitelyFalse(x, p))
155
- else
156
- if x.typeSymbol.isClass && p.typeSymbol.isClass then
157
- val xClass = effectiveClass(x)
158
- val pClass = effectiveClass(p)
159
-
160
- val bothAreClasses = ! xClass.is(Trait ) && ! pClass.is(Trait )
161
- val notXsubP = ! xClass.derivesFrom(pClass)
162
- val notPsubX = ! pClass.derivesFrom(xClass)
163
- bothAreClasses && notXsubP && notPsubX
164
- || xClass.is(Final ) && notXsubP
165
- || pClass.is(Final ) && notPsubX
166
- else
167
- false
168
- }
169
-
170
135
def recur (X : Type , P : Type ): String = (X <:< P ) ||| (P .dealias match {
171
136
case _ : SingletonType => " "
172
137
case _ : TypeProxy
@@ -184,24 +149,11 @@ object TypeTestsCasts {
184
149
// - T1 <:< T2 | T3
185
150
// - T1 & T2 <:< T3
186
151
// See TypeComparer#either
187
- val res1 = recur(tp1, P )
188
- val res2 = recur(tp2, P )
189
-
190
- if res1.isEmpty && res2.isEmpty then
191
- res1
192
- else if res2.isEmpty then
193
- if isCheckDefinitelyFalse(tp1, P ) then res2
194
- else res1
195
- else if res1.isEmpty then
196
- if isCheckDefinitelyFalse(tp2, P ) then res1
197
- else res2
198
- else
199
- res1
152
+ recur(tp1, P ) && recur(tp2, P )
200
153
201
- case _ =>
154
+ case x =>
202
155
// always false test warnings are emitted elsewhere
203
- X .classSymbol.exists && P .classSymbol.exists &&
204
- ! X .classSymbol.asClass.mayHaveCommonChild(P .classSymbol.asClass)
156
+ TypeComparer .provablyDisjoint(x, tpe)
205
157
|| typeArgsTrivial(X , tpe)
206
158
||| i " its type arguments can't be determined from $X"
207
159
}
0 commit comments