scala3
scala3 copied to clipboard
Enabling `-experimental` introduces compiler crash in transparent inline macro
Based on OpenCB failure in 2 projects:
-
jodersky/ustats
- build logs -
rssh/dotty-cps-async
- build logs
Compiler version
Last good release: 3.5.0-RC1-bin-20240515-177b489-NIGHTLY First bad release: 3.5.0-RC1-bin-20240516-c608177-NIGHTLY Bisect points to c8764bac0f555b2d3c9f42403d1ae216960d28ad
Minimized code
//> using options -experimental
class ProbeFailedException(cause: Exception) extends Exception(cause)
trait Probing:
self: Metrics =>
val probeFailureCounter: MetricsGroup[Counter] =
counters("ustats_probe_failures_count").labelled
trait Counter
class Metrics:
class counters(name: String):
transparent inline final def labelled: MetricsGroup[Counter] = MetricsGroup.refine[Counter]
class MetricsGroup[A]
object MetricsGroup:
import scala.quoted.*
transparent inline final def refine[A]: MetricsGroup[A] =
${ refineImpl[A] }
private def refineImpl[A](using qctx: Quotes, tpe: Type[A]): Expr[MetricsGroup[A]] =
import qctx.reflect.*
val mt = MethodType(Nil)(_ => Nil, _ => TypeRepr.of[A])
val tpe = Refinement(TypeRepr.of[MetricsGroup[A]], "apply", mt).asType
tpe match
case '[tpe] =>
'{ MetricsGroup[A]().asInstanceOf[MetricsGroup[A] & tpe] }
Output
unhandled exception while running posttyper on /Users/wmazur/projects/sandbox/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 -Xno-enrich-error-messages.
while compiling: /Users/wmazur/projects/sandbox/test.scala
during phase: posttyper
mode: Mode(ImplicitsEnabled)
library version: version 2.13.12
compiler version: version 3.5.0-RC1-bin-SNAPSHOT-git-c8764ba
settings: -classpath /Users/wmazur/.ivy2/local/org.scala-lang/scala3-library_3/3.5.0-RC1-bin-SNAPSHOT/jars/scala3-library_3.jar:/Users/wmazur/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar -d /Users/wmazur/projects/sandbox/.scala-build/sandbox_265807102e-9acd4df6a7/classes/main -experimental true -java-output-version 17 -sourceroot /Users/wmazur/projects/sandbox
Exception while compiling /Users/wmazur/projects/sandbox/test.scala, /Users/wmazur/projects/sandbox/test.macros.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 -Xno-enrich-error-messages.
while compiling: <no file>
during phase: parser
mode: Mode()
library version: version 2.13.12
compiler version: version 3.5.0-RC1-bin-SNAPSHOT-git-c8764ba
settings: -classpath /Users/wmazur/.ivy2/local/org.scala-lang/scala3-library_3/3.5.0-RC1-bin-SNAPSHOT/jars/scala3-library_3.jar:/Users/wmazur/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.12/scala-library-2.13.12.jar -d /Users/wmazur/projects/sandbox/.scala-build/sandbox_265807102e-9acd4df6a7/classes/main -experimental true -java-output-version 17 -sourceroot /Users/wmazur/projects/sandbox
Exception in thread "main" dotty.tools.dotc.core.Denotations$StaleSymbolException: stale symbol; module class Metrics$#4138 in module class <empty>, defined in Period(2.1-12), is referred to in run Period(3.9)
at dotty.tools.dotc.core.Denotations$SingleDenotation.staleSymbolError(Denotations.scala:961)
at dotty.tools.dotc.core.Denotations$SingleDenotation.bringForward(Denotations.scala:759)
at dotty.tools.dotc.core.Denotations$SingleDenotation.toNewRun$1(Denotations.scala:806)
at dotty.tools.dotc.core.Denotations$SingleDenotation.current(Denotations.scala:877)
at dotty.tools.dotc.core.Symbols$Symbol.recomputeDenot(Symbols.scala:124)
at dotty.tools.dotc.core.Symbols$Symbol.computeDenot(Symbols.scala:118)
at dotty.tools.dotc.core.Symbols$Symbol.denot(Symbols.scala:109)
at dotty.tools.dotc.core.Symbols$Symbol.source(Symbols.scala:321)
at dotty.tools.dotc.core.Symbols$Symbol.source(Symbols.scala:329)
at dotty.tools.dotc.typer.Checking$.isNonExperimentalTopLevelDefinition$1(Checking.scala:810)
at dotty.tools.dotc.typer.Checking$.nonExperimentalTopLevelDefs$1$$anonfun$1(Checking.scala:818)
at scala.collection.Iterator$$anon$10.nextCur(Iterator.scala:594)
at scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:608)
at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:576)
at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:574)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1300)
at dotty.tools.dotc.typer.Checking$.markTopLevelDefsAsExperimental$1(Checking.scala:838)
at dotty.tools.dotc.typer.Checking$.checkAndAdaptExperimentalImports(Checking.scala:846)
at dotty.tools.dotc.transform.PostTyper$PostTyperTransformer.transformStats(PostTyper.scala:569)
at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1242)
at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1613)
at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:42)
at dotty.tools.dotc.transform.PostTyper$PostTyperTransformer.transform(PostTyper.scala:560)
at dotty.tools.dotc.transform.MacroTransform.run(MacroTransform.scala:20)
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:373)
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:336)
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.compileUnits(Run.scala:288)
at dotty.tools.dotc.Run.compileSuspendedUnits(Run.scala:410)
at dotty.tools.dotc.Driver.finish(Driver.scala:63)
at dotty.tools.dotc.Driver.doCompile(Driver.scala:38)
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)
Expectation
Should compile