Skip to content

Regression in JVM backend when access closures from local class #22470

Closed
@WojciechMazur

Description

@WojciechMazur

Based on OpenCB failures in multiple projects:

Compiler version

Last good release: 3.7.0-RC1-bin-20250119-bd699fc-NIGHTLY
First bad release: 3.7.0-RC1-bin-20250120-db23c08-NIGHTLY

The first bad commit could be any of:
fe2e6e9
08442e8

Minimized code

trait Source[+T]:
  def onComplete(): Unit

trait Listener[-T]:
  val lock: Listener.ListenerLock | Null
object Listener:
  trait ListenerLock:
    def acquire(): Unit

object Source:
  private def race[T, U](sources: Source[U]*): Source[T] = 
    new Source[T] { 
      def onComplete(): Unit = {
        new Listener {
          override val lock = new Listener.ListenerLock {
            override def acquire() = println(sources)
          }
        }
      }
    }

Output (click arrow to expand)

java.util.NoSuchElementException: key not found: val sources$2
        at scala.collection.MapOps.default(Map.scala:289)
        at scala.collection.MapOps.default$(Map.scala:288)
        at scala.collection.AbstractMap.default(Map.scala:420)
        at scala.collection.mutable.HashMap.apply(HashMap.scala:440)
        at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder$locals$.load(BCodeSkelBuilder.scala:583)
        at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoadTo(BCodeBodyBuilder.scala:439)
        at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoad(BCodeBodyBuilder.scala:303)
        at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.loop$1(BCodeBodyBuilder.scala:1209)
        at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoadArguments(BCodeBodyBuilder.scala:1216)
        at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genApply(BCodeBodyBuilder.scala:835)
        at dotty.tools.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoadTo(BCodeBodyBuilder.scala:385)
        at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.emitNormalMethodBody$1(BCodeSkelBuilder.scala:899)
        at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.genDefDef(BCodeSkelBuilder.scala:922)
        at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.gen(BCodeSkelBuilder.scala:699)
        at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.gen$$anonfun$1(BCodeSkelBuilder.scala:705)
        at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
        at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
        at scala.collection.immutable.List.foreach(List.scala:334)
        at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.gen(BCodeSkelBuilder.scala:705)
        at dotty.tools.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder.genPlainClass(BCodeSkelBuilder.scala:293)
        at dotty.tools.backend.jvm.CodeGen.genClass(CodeGen.scala:161)
        at dotty.tools.backend.jvm.CodeGen.genClassDef$1(CodeGen.scala:62)
        at dotty.tools.backend.jvm.CodeGen.genClassDefs$1(CodeGen.scala:118)
        at dotty.tools.backend.jvm.CodeGen.genClassDefs$1$$anonfun$1(CodeGen.scala:116)
        at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
        at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
        at scala.collection.immutable.List.foreach(List.scala:334)
        at dotty.tools.backend.jvm.CodeGen.genClassDefs$1(CodeGen.scala:116)
        at dotty.tools.backend.jvm.CodeGen.genUnit(CodeGen.scala:121)
        at dotty.tools.backend.jvm.GenBCode.run(GenBCode.scala:90)
        at dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:383)
        at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
        at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
        at scala.collection.immutable.List.foreach(List.scala:334)
        at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:376)
        at dotty.tools.backend.jvm.GenBCode.runOn(GenBCode.scala:98)
        at dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:345)
        at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
        at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
        at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1324)
        at dotty.tools.dotc.Run.runPhases$1(Run.scala:338)
        at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:385)
        at dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:397)
        at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:69)
        at dotty.tools.dotc.Run.compileUnits(Run.scala:397)
        at dotty.tools.dotc.Run.compileSources(Run.scala:284)
        at dotty.tools.dotc.Run.compile(Run.scala:269)
        at dotty.tools.dotc.Driver.doCompile(Driver.scala:37)
        at dotty.tools.dotc.Driver.process(Driver.scala:201)
        at dotty.tools.dotc.Driver.process(Driver.scala:169)
        at dotty.tools.dotc.Driver.process(Driver.scala:181)
        at dotty.tools.dotc.Driver.main(Driver.scala:211)
        at dotty.tools.dotc.Main.main(Main.scala)
Error while emitting /Users/wmazur/projects/scala/sandbox/test.scala
key not found: val sources$2
1 error found
Compilation failed

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions