Skip to content

Crash involving inline def with capture-tracked parameter #20237

Closed
@natsukagami

Description

@natsukagami

Compiler version

main

Minimized code

import language.experimental.captureChecking
import scala.annotation.capability

@capability class Cap:
  def use[T](body: Cap ?=> T) = body(using this)

class Box[T](body: Cap ?=> T):
  inline def open(using cap: Cap) = cap.use(body)

object Box:
  def make[T](body: Cap ?=> T): Box[T]^{body} = Box(body)

def main =
  given Cap = new Cap
  val box = Box.make(1).open

Output (click arrow to expand)

 unhandled exception while running cc on Test.scala

  An unhandled exception was thrown in the compiler.
  Please file a crash report here:
  https://github.com/scala/scala3/issues/new/choose
  For non-enriched exceptions, compile with -Yno-enrich-error-messages.

     while compiling: Test.scala
        during phase: cc
                mode: Mode(ImplicitsEnabled)
     library version: version 2.13.12
    compiler version: version 3.5.0-RC1-bin-SNAPSHOT-nonbootstrapped-git-99c19a7
            settings: -Vprint List(inlining) -classpath /home/nki/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar:/home/nki/Projects/dotty/library/../out/bootstrap/scala3-library-bootstrapped/scala-3.5.0-RC1-bin-SNAPSHOT-nonbootstrapped/scala3-library_3-3.5.0-RC1-bin-SNAPSHOT.jar -d /
Exception in thread "main" dotty.tools.dotc.cc.IllegalCaptureRef: SkolemType(632104437)
	at dotty.tools.dotc.cc.CaptureOps$package$.toCaptureRef(CaptureOps.scala:87)
	at dotty.tools.dotc.cc.CaptureOps$package$.$anonfun$1(CaptureOps.scala:96)
	at scala.collection.immutable.List.map(List.scala:246)
	at dotty.tools.dotc.cc.CaptureOps$package$.toCaptureSet(CaptureOps.scala:96)
	at dotty.tools.dotc.cc.Setup$$anon$3.apply(Setup.scala:289)
	at dotty.tools.dotc.cc.Setup.dotty$tools$dotc$cc$Setup$$transformExplicitType(Setup.scala:305)
	at dotty.tools.dotc.cc.Setup.dotty$tools$dotc$cc$Setup$$transformTT(Setup.scala:316)
	at dotty.tools.dotc.cc.Setup$$anon$5.transformResultType(Setup.scala:377)
	at dotty.tools.dotc.cc.Setup$$anon$5.traverse(Setup.scala:404)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.recur$2(tpd.scala:1280)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1283)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1275)
	at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1715)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1799)
	at dotty.tools.dotc.cc.Setup$$anon$5.traverse(Setup.scala:422)
	at dotty.tools.dotc.cc.Setup$$anon$5.traverse(Setup.scala:406)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.recur$2(tpd.scala:1280)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1283)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1275)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverse(Trees.scala:1797)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.recur$2(tpd.scala:1281)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1283)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1275)
	at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1695)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1799)
	at dotty.tools.dotc.cc.Setup$$anon$5.traverse(Setup.scala:422)
	at dotty.tools.dotc.cc.Setup$$anon$5.traverse(Setup.scala:397)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.recur$2(tpd.scala:1280)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1283)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1275)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverse(Trees.scala:1797)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.recur$2(tpd.scala:1281)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1283)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1275)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverse(Trees.scala:1797)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.recur$2(tpd.scala:1281)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1283)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1275)
	at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1757)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1799)
	at dotty.tools.dotc.cc.Setup$$anon$5.traverse(Setup.scala:422)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1798)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1798)
	at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1754)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1799)
	at dotty.tools.dotc.cc.Setup$$anon$5.traverse(Setup.scala:415)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.recur$2(tpd.scala:1280)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1283)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1275)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverse(Trees.scala:1797)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.recur$2(tpd.scala:1281)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1283)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1275)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverse(Trees.scala:1797)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.recur$2(tpd.scala:1281)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1283)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1275)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverse(Trees.scala:1797)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.recur$2(tpd.scala:1281)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1283)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1275)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverse(Trees.scala:1797)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.recur$2(tpd.scala:1281)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1283)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1275)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverse(Trees.scala:1797)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.recur$2(tpd.scala:1281)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1283)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1275)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverse(Trees.scala:1797)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.recur$2(tpd.scala:1278)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1283)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1275)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverse(Trees.scala:1797)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.recur$2(tpd.scala:1278)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1283)
	at dotty.tools.dotc.ast.tpd$TreeTraverserWithPreciseImportContexts.apply(tpd.scala:1275)
	at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1763)
	at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1799)
	at dotty.tools.dotc.cc.Setup$$anon$5.traverse(Setup.scala:422)
	at dotty.tools.dotc.cc.Setup.setupUnit(Setup.scala:667)
	at dotty.tools.dotc.cc.CheckCaptures$CaptureChecker.checkUnit(CheckCaptures.scala:1183)
	at dotty.tools.dotc.transform.Recheck.run(Recheck.scala:166)
	at dotty.tools.dotc.cc.CheckCaptures.run(CheckCaptures.scala:190)
	at dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:380)
	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:333)
	at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:386)
	at dotty.tools.dotc.transform.Recheck.runOn(Recheck.scala:170)
	at dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:343)
	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:1323)
	at dotty.tools.dotc.Run.runPhases$1(Run.scala:369)
	at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:384)
	at dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:396)
	at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:69)
	at dotty.tools.dotc.Run.compileUnits(Run.scala:396)
	at dotty.tools.dotc.Run.compileSources(Run.scala:282)
	at dotty.tools.dotc.Run.compile(Run.scala:267)
	at dotty.tools.dotc.Driver.doCompile(Driver.scala:37)
	at dotty.tools.dotc.Driver.process(Driver.scala:202)
	at dotty.tools.dotc.Driver.process(Driver.scala:170)
	at dotty.tools.dotc.Driver.process(Driver.scala:182)
	at dotty.tools.dotc.Driver.main(Driver.scala:212)
	at dotty.tools.dotc.Main.main(Main.scala)

Notes

  • Compiler does not crash if:
    • def open is not inline
    • Box is created not through make (Box(1)).
    • .open is not directly called:
      def main =
        given Cap = new Cap
        val box =
          val x = Box.make(1)
          x.open

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions