Skip to content

Commit b8098ce

Browse files
committed
Correctly handle abstract type in isCheckDefinitelyFalse
1 parent 128c7a1 commit b8098ce

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

compiler/src/dotty/tools/dotc/transform/TypeTestsCasts.scala

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,14 @@ object TypeTestsCasts {
153153
val xs = xSpace.decompose.map(_.tp)
154154
xs.forall(x => isCheckDefinitelyFalse(x, p))
155155
else
156-
val xClass = effectiveClass(x.widen)
157-
val pClass = effectiveClass(p.widen)
156+
if x.typeSymbol.isClass && p.typeSymbol.isClass then
157+
val xClass = effectiveClass(x.widen)
158+
val pClass = effectiveClass(p.widen)
158159

159-
!xClass.derivesFrom(pClass)
160-
&& (xClass.is(Final) || pClass.is(Final) || !xClass.is(Trait) && !pClass.is(Trait))
160+
!xClass.derivesFrom(pClass)
161+
&& (xClass.is(Final) || pClass.is(Final) || !xClass.is(Trait) && !pClass.is(Trait))
162+
else
163+
false
161164
}
162165

163166
def recur(X: Type, P: Type): String = (X <:< P) ||| (P.dealias match {

tests/neg-custom-args/isInstanceOf/i5826.scala

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
class Foo {
2-
def test[A]: List[Int] | A => Int = {
3-
case ls: List[Int] => ls.head // ok, List decomposes to Some and None
2+
def test[A]: (List[Int] | A) => Int = {
3+
case ls: List[Int] => ls.head // error, A = List[String]
44
case _ => 0
55
}
66

@@ -17,4 +17,9 @@ class Foo {
1717
case ls: A[X] => 4 // error
1818
case _ => 0
1919
}
20+
21+
def test4[A](x: List[Int] | (A => Int)) = x match {
22+
case ls: List[Int] => ls.head // ok, List decomposes to Some and None
23+
case _ => 0
24+
}
2025
}

0 commit comments

Comments
 (0)