Skip to content

Crash involving inline def with capture-tracked parameter #20237

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
natsukagami opened this issue Apr 19, 2024 · 0 comments · Fixed by #20241
Closed

Crash involving inline def with capture-tracked parameter #20237

natsukagami opened this issue Apr 19, 2024 · 0 comments · Fixed by #20241
Milestone

Comments

@natsukagami
Copy link
Contributor

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
@natsukagami natsukagami added itype:bug itype:crash stat:needs triage Every issue needs to have an "area" and "itype" label area:experimental:cc Capture checking related labels Apr 19, 2024
odersky added a commit to dotty-staging/dotty that referenced this issue Apr 20, 2024
Fixes scala#20237 since it erases illegal capture sets containing skolem types.
@Gedochao Gedochao removed the stat:needs triage Every issue needs to have an "area" and "itype" label label Apr 21, 2024
nicolasstucki added a commit that referenced this issue Apr 22, 2024
Fixes #20237 since it erases illegal capture sets containing skolem
types.
@Kordyjan Kordyjan added this to the 3.5.0 milestone May 10, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants