Closed
Description
I would like to report a compiler crash (java.lang.StackOverflowError
in dotc.core.TypeComparer.provablyDisjoint
).
Scala Version
3.0.0-RC2
(also present in 3.0.0-RC1
)
Minimized code
enum E:
case C
trait T
def f(x: E | T): Unit = x match {
case e: E => ()
case t: T => ()
}
Output (click arrow to expand)
[error] java.lang.StackOverflowError
[error] dotty.tools.dotc.core.TypeComparer.isSubType(TypeComparer.scala:182)
[error] dotty.tools.dotc.core.TypeComparer.isSubType(TypeComparer.scala:190)
[error] dotty.tools.dotc.core.TypeComparer.topLevelSubType(TypeComparer.scala:128)
[error] dotty.tools.dotc.core.TypeComparer$.topLevelSubType(TypeComparer.scala:2603)
[error] dotty.tools.dotc.core.Types$Type.$less$colon$less(Types.scala:1020)
[error] dotty.tools.dotc.core.TypeOps$.instantiateToSubType(TypeOps.scala:782)
[error] dotty.tools.dotc.core.TypeOps$.refineUsingParent(TypeOps.scala:667)
[error] dotty.tools.dotc.core.TypeComparer.decompose$2$$anonfun$1(TypeComparer.scala:2424)
[error] scala.collection.immutable.List.map(List.scala:246)
[error] dotty.tools.dotc.core.TypeComparer.decompose$1(TypeComparer.scala:2424)
[error] dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2447)
[error] dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2524)
[error] dotty.tools.dotc.core.TypeComparer.provablyDisjoint$$anonfun$1(TypeComparer.scala:2447)
[error] scala.collection.immutable.List.forall(List.scala:386)
[error] dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2447)
[error] dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2524)
[error] dotty.tools.dotc.core.TypeComparer.provablyDisjoint$$anonfun$1(TypeComparer.scala:2447)
[error] scala.collection.immutable.List.forall(List.scala:386)
[error] dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2447)
[error] dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2524)
[error] dotty.tools.dotc.core.TypeComparer.provablyDisjoint$$anonfun$1(TypeComparer.scala:2447)
[error] scala.collection.immutable.List.forall(List.scala:386)
[error] dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2447)
[error] dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2524)
[error] dotty.tools.dotc.core.TypeComparer.provablyDisjoint$$anonfun$1(TypeComparer.scala:2447)
[error] scala.collection.immutable.List.forall(List.scala:386)
[...etc, repetitive stack trace omitted]
Some further observations
- It works when both parts of the union are
enum
s - It works when both parts of the union are
trait
s - It works when
trait
is replaced by anabstract class
- It works when either case in
match
is replaced bycase _ => ()