Skip to content

Pattern matching on union of enum and trait causes StackOverflowError in TypeComparer.provablyDisjoint #11973

Closed
@tyukiand

Description

@tyukiand

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 enums
  • It works when both parts of the union are traits
  • It works when trait is replaced by an abstract class
  • It works when either case in match is replaced by case _ => ()

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions