Skip to content

Pattern matching on a sealed trait extended by its child leads to stack overflow and crash #19031

@sankalpgambhir

Description

@sankalpgambhir

Compiler version

main: 3.4.0-RC1-bin-SNAPSHOT-nonbootstrapped-git-c90ad6b
3.3.1

originally discovered on 3.3.1, used main for isolation and for the logs below

HOWEVER, works on 3.2.2

Minimized code

sealed trait A:
  class B extends A

def compute(a: A): Boolean =
  a match
    case b: A#B => true

Output (click arrow to expand)

With 3.4.0-RC1-bin-SNAPSHOT-nonbootstrapped-git-c90ad6b (failing):
Identical output for 3.3.1

[[0minfo[0m] entering *experimental* thin client - BEEP WHIRR
[[0minfo[0m] terminate the server with `shutdown`
> run -color:never /tmp/dotty-test/rec.scala
[info] running (fork) dotty.tools.dotc.Main -classpath /home/sankalp/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.10/scala-library-2.13.10.jar:/home/sankalp/projects/scala-spree/dotty-working/library/../out/bootstrap/scala3-library-bootstrapped/scala-3.4.0-RC1-bin-SNAPSHOT-nonbootstrapped/scala3-library_3-3.4.0-RC1-bin-SNAPSHOT.jar -color:never /tmp/dotty-test/rec.scala
Exception in thread "main" java.lang.StackOverflowError

  unhandled exception while running MegaPhase{protectedAccessors, extmethods, uncacheGivenAliases, elimByName, hoistSuperArgs, forwardDepChecks, specializeApplyMethods, tryCatchPatterns, patternMatcher} on /tmp/dotty-test/rec.scala

  An unhandled exception was thrown in the compiler.
  Please file a crash report here:
  https://github.com/lampepfl/dotty/issues/new/choose

     while compiling: /tmp/dotty-test/rec.scala
        during phase: MegaPhase{protectedAccessors, extmethods, uncacheGivenAliases, elimByName, hoistSuperArgs, forwardDepChecks, specializeApplyMethods, tryCatchPatterns, patternMatcher}
                mode: Mode(ImplicitsEnabled)
     library version: version 2.13.10
    compiler version: version 3.4.0-RC1-bin-SNAPSHOT-nonbootstrapped-git-c90ad6b
            settings: -classpath /home/sankalp/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.10/scala-library-2.13.10.jar:/home/sankalp/projects/scala-spree/dotty-working/library/../out/bootstrap/scala3-library-bootstrapped/scala-3.4.0-RC1-bin-SNAPSHOT-nonbootstrapped/scala3-library_3-3.4.0-RC1-bin-SNAPSHOT.jar -color never

                tree: EmptyTree
       tree position: :<unknown>
           tree type: <notype>
              symbol: val <none>
           call site: package <root> in module class <root>

  == Source file context for tree position ==


	at dotty.tools.dotc.core.Types$LambdaType.paramRefs(Types.scala:3703)
	at dotty.tools.dotc.core.Types$LambdaType.paramRefs$(Types.scala:3680)
	at dotty.tools.dotc.core.Types$MethodOrPoly.paramRefs(Types.scala:3766)
	at dotty.tools.dotc.core.OrderingConstraint.adjustDeps$$anonfun$2(OrderingConstraint.scala:431)
	at dotty.tools.dotc.core.OrderingConstraint.adjustDeps$$anonfun$adapted$1(OrderingConstraint.scala:432)
	at scala.collection.immutable.Range.foreach(Range.scala:190)
	at dotty.tools.dotc.core.OrderingConstraint.adjustDeps(OrderingConstraint.scala:432)
	at dotty.tools.dotc.core.OrderingConstraint.init(OrderingConstraint.scala:535)
	at dotty.tools.dotc.core.OrderingConstraint.add(OrderingConstraint.scala:513)
	at dotty.tools.dotc.core.OrderingConstraint.add(OrderingConstraint.scala:506)
	at dotty.tools.dotc.core.ConstraintHandling.addToConstraint(ConstraintHandling.scala:768)
	at dotty.tools.dotc.core.ConstraintHandling.addToConstraint$(ConstraintHandling.scala:29)
	at dotty.tools.dotc.core.TypeComparer.addToConstraint(TypeComparer.scala:31)
	at dotty.tools.dotc.core.TypeComparer$.addToConstraint(TypeComparer.scala:3116)
	at dotty.tools.dotc.typer.ProtoTypes$.constrained(ProtoTypes.scala:747)
	at dotty.tools.dotc.typer.ProtoTypes$.newTypeVar(ProtoTypes.scala:780)
	at dotty.tools.dotc.core.TypeOps$InferPrefixMap$1.apply(TypeOps.scala:892)
	at dotty.tools.dotc.core.Types$TypeMap.op$proxy18$1(Types.scala:5823)
	at dotty.tools.dotc.core.Types$TypeMap.mapOver(Types.scala:5823)
	at dotty.tools.dotc.core.TypeOps$InferPrefixMap$1.apply(TypeOps.scala:895)
	at dotty.tools.dotc.core.TypeOps$.instantiateToSubType(TypeOps.scala:901)
	at dotty.tools.dotc.core.TypeOps$.refineUsingParent(TypeOps.scala:757)
	at dotty.tools.dotc.transform.patmat.SpaceEngine$.$anonfun$13(Space.scala:650)
	at scala.collection.immutable.List.map(List.scala:246)
	at dotty.tools.dotc.transform.patmat.SpaceEngine$.rec$1(Space.scala:661)
	at dotty.tools.dotc.transform.patmat.SpaceEngine$.decompose(Space.scala:669)
	at dotty.tools.dotc.transform.patmat.SpaceEngine$Parts$.unapply(Space.scala:689)
	at dotty.tools.dotc.transform.patmat.SpaceEngine$.rec$1(Space.scala:624)
	<STACK TRACE TRIMMED BY PR AUTHOR>

With 3.2.2 (working):

sbt:rectest> compile
[info] compiling 2 Scala sources to /tmp/dotty-test/rectest/target/scala-3.2.2/classes ...
[success] Total time: 7 s, completed Nov 23, 2023, 12:53:07 PM

Source and Problem

Discovered as epfl-lara/lisa#190, where we are unable to upgrade from 3.2.2, where this does work, to 3.3.1 as we would like to.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions