Skip to content

Commit 2a49471

Browse files
authored
Merge pull request #13828 from deniszo/fix-13739_and_13512
Handles Nothing when synthesizing CanEqual
2 parents 0eb7e61 + 3023d3a commit 2a49471

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

compiler/src/dotty/tools/dotc/typer/Synthesizer.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
102102
def canComparePredefinedClasses(cls1: ClassSymbol, cls2: ClassSymbol): Boolean =
103103

104104
def cmpWithBoxed(cls1: ClassSymbol, cls2: ClassSymbol) =
105-
cls2 == defn.boxedType(cls1.typeRef).symbol
105+
cls2 == defn.NothingClass
106+
|| cls2 == defn.boxedType(cls1.typeRef).symbol
106107
|| cls1.isNumericValueClass && cls2.derivesFrom(defn.BoxedNumberClass)
107108

108109
if cls1.isPrimitiveValueClass then
@@ -129,7 +130,7 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
129130
else if cls2 == defn.NullClass then
130131
cls1.derivesFrom(defn.ObjectClass)
131132
else
132-
false
133+
cls1 == defn.NothingClass || cls2 == defn.NothingClass
133134
end canComparePredefinedClasses
134135

135136
/** Some simulated `CanEqual` instances for predefined types. It's more efficient

tests/pos/i13512.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import scala.language.strictEquality
2+
3+
class NotEquatable
4+
5+
def f = List(new NotEquatable) match
6+
case Nil => ???
7+
case _ =>

tests/pos/i13739.scala

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import scala.language.strictEquality
2+
3+
class Foo(i: Int) extends AnyVal
4+
5+
val _ = summon[CanEqual[Nothing, Nothing]]
6+
7+
val _ = summon[CanEqual[Int, Nothing]]
8+
val _ = summon[CanEqual[Nothing, Int]]
9+
val _ = summon[CanEqual[3, Nothing]]
10+
val _ = summon[CanEqual[Nothing, 3]]
11+
12+
val _ = summon[CanEqual[Byte, Nothing]]
13+
val _ = summon[CanEqual[Nothing, Byte]]
14+
val _ = summon[CanEqual[Short, Nothing]]
15+
val _ = summon[CanEqual[Nothing, Short]]
16+
val _ = summon[CanEqual[Float, Nothing]]
17+
val _ = summon[CanEqual[Nothing, Float]]
18+
19+
val _ = summon[CanEqual[Double, Nothing]]
20+
val _ = summon[CanEqual[Nothing, Double]]
21+
val _ = summon[CanEqual[3.0, Nothing]]
22+
val _ = summon[CanEqual[Nothing, 3.0]]
23+
24+
val _ = summon[CanEqual[String, Nothing]]
25+
val _ = summon[CanEqual[Nothing, String]]
26+
val _ = summon[CanEqual["foo", Nothing]]
27+
val _ = summon[CanEqual[Nothing, "foo"]]
28+
29+
val _ = summon[CanEqual[Char, Nothing]]
30+
val _ = summon[CanEqual[Nothing, Char]]
31+
val _ = summon[CanEqual['f', Nothing]]
32+
val _ = summon[CanEqual[Nothing, 'f']]
33+
34+
val _ = summon[CanEqual[Boolean, Nothing]]
35+
val _ = summon[CanEqual[Nothing, Boolean]]
36+
val _ = summon[CanEqual[true, Nothing]]
37+
val _ = summon[CanEqual[Nothing, true]]
38+
39+
val _ = summon[CanEqual[Foo, Nothing]]
40+
val _ = summon[CanEqual[Nothing, Foo]]
41+
42+
val _ = summon[CanEqual[Option[Int], None.type]]
43+
val _ = summon[CanEqual[Option[Int], Option[Nothing]]]
44+
45+
val _ = summon[CanEqual[Any & Nothing, Foo]]
46+
val _ = summon[CanEqual[Nothing & Any, Foo]]

0 commit comments

Comments
 (0)