Skip to content

Possible regression to 3.3.1: unhandled exception while running pickleQuotes #19767

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
hmf opened this issue Feb 22, 2024 · 4 comments · Fixed by #20102
Closed

Possible regression to 3.3.1: unhandled exception while running pickleQuotes #19767

hmf opened this issue Feb 22, 2024 · 4 comments · Fixed by #20102
Assignees
Labels
area:metaprogramming:quotes Issues related to quotes and splices itype:bug regression This worked in a previous version but doesn't anymore
Milestone

Comments

@hmf
Copy link

hmf commented Feb 22, 2024

Compiler version

Was working in 3.3.0 but breaks in 3.3.1

Minimized code

Code taken from macro file that breaks (only very small part of it).

  import scala.quoted.*

  sealed trait IMap
  case object IEmpT extends IMap
  case class ICons[K <: Singleton, V, T <: IMap](key: K, value: V, tail: T) extends IMap

  type IEmpT = IEmpT.type
  // transparent inline def filterFast0[I <:IMap](inline l: I, q: String): Any = ${ filterFast0Impl('l,'q) }

  def filterX[I <: IMap, K](x: Expr[I], q: Expr[K])(using tp1: Type[I], tp2: Type[K], tq: Quotes): Expr[_ <: IMap] =
    import quotes.reflect.*
    x match
      case '{ $_ : IEmpT } => 
        '{ IEmpT }
      case '{ $y : ICons[k1,v1,t1] } => 
        val k: Expr[k1] = '{$y.key}
        val v: Expr[v1] = '{$y.value}
        val t: Expr[t1] = '{$y.tail}
        val tt =  filterX(t, q)
        val equals = '{$k == $q} 
        if equals.valueOrAbort
        then
          // Error here
          '{ ICons($y.key, $y.value, $tt) }
          // '{ ICons[k1, v1, IMap]($y.key, $y.value, $tt) }
        else
          tt
      case _ =>
        report.errorAndAbort(s"Cannot process ${Type.show[I]}: ${x.isExprOf[ICons[_,_,_]]}. Aborting")

Output

Error from compilation

unhandled exception while running pickleQuotes on /home/hmf/VSCodeProjects/sploty/meta/src/data/Macros4.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: <no file>
    during phase: <no phase>
            mode: Mode(ImplicitsEnabled)
 library version: version 2.13.10
compiler version: version 3.3.1
        settings: -Yretain-trees true -bootclasspath /home/hmf/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.10/scala-library-2.13.10.jar -classpath /home/hmf/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.3.1/scala3-library_3-3.3.1.jar:/home/hmf/VSCodeProjects/sploty/meta/compile-resources:/home/hmf/VSCodeProjects/sploty/out/meta/compile.dest/classes -d /home/hmf/VSCodeProjects/sploty/out/meta/compile.dest/classes -deprecation true -explain true -feature true

            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 ==

[error] ## Exception when compiling 39 sources to /home/hmf/VSCodeProjects/sploty/out/meta/compile.dest/classes
[error] java.lang.AssertionError: assertion failed: unresolved symbols: type k1 (line 208) #40655, type v1 (line 208) #40657, type t1 (line 208) #40659, type I (line 188) #40640 when pickling /home/hmf/VSCodeProjects/sploty/meta/src/data/Macros4.scala
[error] scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:8)
[error] dotty.tools.dotc.core.tasty.TreePickler.pickle(TreePickler.scala:829)
[error] dotty.tools.dotc.quoted.PickledQuotes$.pickle(PickledQuotes.scala:221)
[error] dotty.tools.dotc.quoted.PickledQuotes$.pickleQuote(PickledQuotes.scala:33)
[error] dotty.tools.dotc.transform.PickleQuotes$.pickleAsTasty$1(PickleQuotes.scala:332)
[error] dotty.tools.dotc.transform.PickleQuotes$.pickle(PickleQuotes.scala:416)
[error] dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:99)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1520)
[error] dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
[error] dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1512)
[error] dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
[error] dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
[error] dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformBlock$$anonfun$1$$anonfun$1(tpd.scala:1249)
[error] dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1231)
[error] dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1244)
[error] dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformBlock(tpd.scala:1249)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1518)
[error] dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
[error] dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1526)
[error] dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
[error] dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$1(Trees.scala:1605)
[error] scala.collection.immutable.List.mapConserve(List.scala:472)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1605)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformSub(Trees.scala:1609)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1524)
[error] dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
[error] dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
[error] dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformBlock$$anonfun$1$$anonfun$1(tpd.scala:1249)
[error] dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1231)
[error] dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1244)
[error] dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformBlock(tpd.scala:1249)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1518)
[error] dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
[error] dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1570)
[error] dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:40)
[error] dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
[error] dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1244)
[error] dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1244)
[error] dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1246)
[error] dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:47)
[error] dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1572)
[error] dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:40)
[error] dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
[error] dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1244)
[error] dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1244)
[error] dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1246)
[error] dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1580)
[error] dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:40)
[error] dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
[error] dotty.tools.dotc.transform.MacroTransform.run(MacroTransform.scala:18)
[error] dotty.tools.dotc.transform.PickleQuotes.run(PickleQuotes.scala:90)
[error] dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:327)
[error] scala.collection.immutable.List.map(List.scala:246)
[error] dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:331)
[error] dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:246)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1321)
[error] dotty.tools.dotc.Run.runPhases$1(Run.scala:262)
[error] dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:270)
[error] dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:279)
[error] dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:67)
[error] dotty.tools.dotc.Run.compileUnits(Run.scala:279)
[error] dotty.tools.dotc.Run.compileSources(Run.scala:194)
[error] dotty.tools.dotc.Run.compile(Run.scala:179)
[error] dotty.tools.dotc.Driver.doCompile(Driver.scala:37)
[error] dotty.tools.xsbt.CompilerBridgeDriver.run(CompilerBridgeDriver.java:88)
[error] dotty.tools.xsbt.CompilerBridge.run(CompilerBridge.java:22)
[error] sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:91)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$7(MixedAnalyzingCompiler.scala:193)
[error] scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
[error] sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:248)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler.scala:183)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4$adapted(MixedAnalyzingCompiler.scala:163)
[error] sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:239)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:163)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:211)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:534)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:534)
[error] sbt.internal.inc.Incremental$.$anonfun$apply$5(Incremental.scala:180)
[error] sbt.internal.inc.Incremental$.$anonfun$apply$5$adapted(Incremental.scala:178)
[error] sbt.internal.inc.Incremental$$anon$2.run(Incremental.scala:464)
[error] sbt.internal.inc.IncrementalCommon$CycleState.next(IncrementalCommon.scala:116)
[error] sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:56)
[error] sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:52)
[error] sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:263)
[error] sbt.internal.inc.Incremental$.$anonfun$incrementalCompile$8(Incremental.scala:419)
[error] sbt.internal.inc.Incremental$.withClassfileManager(Incremental.scala:506)
[error] sbt.internal.inc.Incremental$.incrementalCompile(Incremental.scala:406)
[error] sbt.internal.inc.Incremental$.apply(Incremental.scala:172)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:534)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:488)
[error] sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:332)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:425)
[error] sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:137)
[error] mill.scalalib.worker.ZincWorkerImpl.compileInternal(ZincWorkerImpl.scala:544)
[error] mill.scalalib.worker.ZincWorkerImpl.$anonfun$compileMixed$1(ZincWorkerImpl.scala:334)
[error] mill.api.FixSizedCache.withCachedValue(FixSizedCache.scala:66)
[error] mill.scalalib.worker.ZincWorkerImpl.withCompilers(ZincWorkerImpl.scala:414)
[error] mill.scalalib.worker.ZincWorkerImpl.compileMixed(ZincWorkerImpl.scala:333)
[error] mill.scalalib.ScalaModule.$anonfun$compile$2(ScalaModule.scala:280)
[error] mill.define.Task$TraverseCtx.evaluate(Task.scala:71)
[error] mill.eval.GroupEvaluator.$anonfun$evaluateGroup$11(GroupEvaluator.scala:356)
[error] scala.util.DynamicVariable.withValue(DynamicVariable.scala:59)
[error] scala.Console$.withErr(Console.scala:193)
[error] mill.api.SystemStreams$.$anonfun$withStreams$2(SystemStreams.scala:62)
[error] scala.util.DynamicVariable.withValue(DynamicVariable.scala:59)
[error] scala.Console$.withOut(Console.scala:164)
[error] mill.api.SystemStreams$.$anonfun$withStreams$1(SystemStreams.scala:61)
[error] scala.util.DynamicVariable.withValue(DynamicVariable.scala:59)
[error] scala.Console$.withIn(Console.scala:227)
[error] mill.api.SystemStreams$.withStreams(SystemStreams.scala:60)
[error] mill.eval.GroupEvaluator.$anonfun$evaluateGroup$8(GroupEvaluator.scala:356)
[error] mill.eval.GroupEvaluator.$anonfun$evaluateGroup$8$adapted(GroupEvaluator.scala:325)
[error] scala.collection.immutable.Vector.foreach(Vector.scala:2124)
[error] mill.eval.GroupEvaluator.computeAll$1(GroupEvaluator.scala:325)
[error] mill.eval.GroupEvaluator.evaluateGroup(GroupEvaluator.scala:380)
[error] mill.eval.GroupEvaluator.$anonfun$evaluateGroupCached$22(GroupEvaluator.scala:247)
[error] scala.util.DynamicVariable.withValue(DynamicVariable.scala:59)
[error] mill.eval.GroupEvaluator.$anonfun$evaluateGroupCached$2(GroupEvaluator.scala:238)
[error] mill.eval.GroupEvaluator$synchronizedEval$.$anonfun$apply$1(GroupEvaluator.scala:65)
[error] scala.util.Using$.resource(Using.scala:262)
[error] mill.eval.GroupEvaluator$synchronizedEval$.apply(GroupEvaluator.scala:64)
[error] mill.eval.GroupEvaluator.evaluateGroupCached(GroupEvaluator.scala:83)
[error] mill.eval.GroupEvaluator.evaluateGroupCached$(GroupEvaluator.scala:71)
[error] mill.eval.EvaluatorImpl.evaluateGroupCached(EvaluatorImpl.scala:15)
[error] mill.eval.EvaluatorCore.$anonfun$evaluate0$2(EvaluatorCore.scala:116)
[error] scala.concurrent.impl.Promise$Transformation.run(Promise.scala:467)
[error] mill.eval.ExecutionContexts$RunNow$.execute(ExecutionContexts.scala:14)
[error] scala.concurrent.impl.Promise$Transformation.submitWithValue(Promise.scala:429)
[error] scala.concurrent.impl.Promise$DefaultPromise.submitWithValue(Promise.scala:338)
[error] scala.concurrent.impl.Promise$DefaultPromise.dispatchOrAddCallbacks(Promise.scala:312)
[error] scala.concurrent.impl.Promise$DefaultPromise.map(Promise.scala:182)
[error] mill.eval.EvaluatorCore.$anonfun$evaluate0$1(EvaluatorCore.scala:92)
[error] mill.eval.EvaluatorCore.$anonfun$evaluate0$1$adapted(EvaluatorCore.scala:90)
[error] scala.collection.immutable.VectorStatics$.foreachRec(Vector.scala:2124)
[error] scala.collection.immutable.Vector.foreach(Vector.scala:2130)
[error] mill.eval.EvaluatorCore.evaluate0(EvaluatorCore.scala:90)
[error] mill.eval.EvaluatorCore.$anonfun$evaluate$1(EvaluatorCore.scala:43)
[error] scala.util.DynamicVariable.withValue(DynamicVariable.scala:59)
[error] mill.eval.EvaluatorCore.evaluate(EvaluatorCore.scala:34)
[error] mill.eval.EvaluatorCore.evaluate$(EvaluatorCore.scala:26)
[error] mill.eval.EvaluatorImpl.evaluate(EvaluatorImpl.scala:15)
[error] mill.main.RunScript$.evaluateNamed(RunScript.scala:38)
[error] mill.main.RunScript$.$anonfun$evaluateTasksNamed$2(RunScript.scala:26)
[error] scala.util.Either.map(Either.scala:382)
[error] mill.main.RunScript$.evaluateTasksNamed(RunScript.scala:26)
[error] mill.runner.MillBuildBootstrap$.evaluateWithWatches(MillBuildBootstrap.scala:399)
[error] mill.runner.MillBuildBootstrap.$anonfun$processFinalTargets$3(MillBuildBootstrap.scala:308)
[error] scala.util.DynamicVariable.withValue(DynamicVariable.scala:59)
[error] mill.runner.MillBuildBootstrap.processFinalTargets(MillBuildBootstrap.scala:308)
[error] mill.runner.MillBuildBootstrap.evaluateRec(MillBuildBootstrap.scala:196)
[error] mill.runner.MillBuildBootstrap.$anonfun$evaluate$1(MillBuildBootstrap.scala:49)
[error] scala.util.DynamicVariable.withValue(DynamicVariable.scala:59)
[error] mill.runner.MillBuildBootstrap.evaluate(MillBuildBootstrap.scala:48)
[error] mill.runner.MillMain$.$anonfun$main0$6(MillMain.scala:234)
[error] mill.runner.Watching$.watchLoop(Watching.scala:27)
[error] mill.runner.MillMain$.$anonfun$main0$1(MillMain.scala:219)
[error] scala.util.DynamicVariable.withValue(DynamicVariable.scala:59)
[error] scala.Console$.withErr(Console.scala:193)
[error] mill.api.SystemStreams$.$anonfun$withStreams$2(SystemStreams.scala:62)
[error] scala.util.DynamicVariable.withValue(DynamicVariable.scala:59)
[error] scala.Console$.withOut(Console.scala:164)
[error] mill.api.SystemStreams$.$anonfun$withStreams$1(SystemStreams.scala:61)
[error] scala.util.DynamicVariable.withValue(DynamicVariable.scala:59)
[error] scala.Console$.withIn(Console.scala:227)
[error] mill.api.SystemStreams$.withStreams(SystemStreams.scala:60)
[error] mill.runner.MillMain$.main0(MillMain.scala:101)
[error] mill.runner.MillMain$.liftedTree1$1(MillMain.scala:78)
[error] mill.runner.MillMain$.main(MillMain.scala:69)
[error] mill.runner.MillMain.main(MillMain.scala)
[error] java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error] java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
[error] java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error] java.base/java.lang.reflect.Method.invoke(Method.java:568)
[error] mill.main.client.IsolatedMillMainLoader.runMain(IsolatedMillMainLoader.java:58)
[error] mill.main.client.MillClientMain.main(MillClientMain.java:78)
[error]
1 targets failed
meta.compile java.lang.AssertionError: assertion failed: unresolved symbols: type k1 (line 208) #40655, type v1 (line 208) #40657, type t1 (line 208) #40659, type I (line 188) #40640 when pickling /home/hmf/VSCodeProjects/sploty/meta/src/data/Macros4.scala
scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:8)
dotty.tools.dotc.core.tasty.TreePickler.pickle(TreePickler.scala:829)
dotty.tools.dotc.quoted.PickledQuotes$.pickle(PickledQuotes.scala:221)
dotty.tools.dotc.quoted.PickledQuotes$.pickleQuote(PickledQuotes.scala:33)
dotty.tools.dotc.transform.PickleQuotes$.pickleAsTasty$1(PickleQuotes.scala:332)
dotty.tools.dotc.transform.PickleQuotes$.pickle(PickleQuotes.scala:416)
dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:99)
dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1520)
dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1512)
dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformBlock$$anonfun$1$$anonfun$1(tpd.scala:1249)
dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1231)
dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1244)
dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformBlock(tpd.scala:1249)
dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1518)
dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1526)
dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$1(Trees.scala:1605)
scala.collection.immutable.List.mapConserve(List.scala:472)
dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1605)
dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformSub(Trees.scala:1609)
dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1524)
dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformBlock$$anonfun$1$$anonfun$1(tpd.scala:1249)
dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1231)
dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1244)
dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformBlock(tpd.scala:1249)
dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1518)
dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1570)
dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:40)
dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1244)
dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1244)
dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1246)
dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:47)
dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1572)
dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:40)
dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1244)
dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1244)
dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1246)
dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1580)
dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:40)
dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:103)
dotty.tools.dotc.transform.MacroTransform.run(MacroTransform.scala:18)
dotty.tools.dotc.transform.PickleQuotes.run(PickleQuotes.scala:90)
dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:327)
scala.collection.immutable.List.map(List.scala:246)
dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:331)
dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:246)
scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1321)
dotty.tools.dotc.Run.runPhases$1(Run.scala:262)
dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:270)
dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:279)
dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:67)
dotty.tools.dotc.Run.compileUnits(Run.scala:279)
dotty.tools.dotc.Run.compileSources(Run.scala:194)
dotty.tools.dotc.Run.compile(Run.scala:179)
dotty.tools.dotc.Driver.doCompile(Driver.scala:37)
dotty.tools.xsbt.CompilerBridgeDriver.run(CompilerBridgeDriver.java:88)
dotty.tools.xsbt.CompilerBridge.run(CompilerBridge.java:22)
sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:91)
sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$7(MixedAnalyzingCompiler.scala:193)
scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:248)
sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler.scala:183)
sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4$adapted(MixedAnalyzingCompiler.scala:163)
sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:239)
sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:163)
sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:211)
sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:534)
sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:534)
sbt.internal.inc.Incremental$.$anonfun$apply$5(Incremental.scala:180)
sbt.internal.inc.Incremental$.$anonfun$apply$5$adapted(Incremental.scala:178)
sbt.internal.inc.Incremental$$anon$2.run(Incremental.scala:464)
sbt.internal.inc.IncrementalCommon$CycleState.next(IncrementalCommon.scala:116)
sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:56)
sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:52)
sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:263)
sbt.internal.inc.Incremental$.$anonfun$incrementalCompile$8(Incremental.scala:419)
sbt.internal.inc.Incremental$.withClassfileManager(Incremental.scala:506)
sbt.internal.inc.Incremental$.incrementalCompile(Incremental.scala:406)
sbt.internal.inc.Incremental$.apply(Incremental.scala:172)
sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:534)
sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:488)
sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:332)
sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:425)
sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:137)
mill.scalalib.worker.ZincWorkerImpl.compileInternal(ZincWorkerImpl.scala:544)
mill.scalalib.worker.ZincWorkerImpl.$anonfun$compileMixed$1(ZincWorkerImpl.scala:334)
mill.api.FixSizedCache.withCachedValue(FixSizedCache.scala:66)
mill.scalalib.worker.ZincWorkerImpl.withCompilers(ZincWorkerImpl.scala:414)
mill.scalalib.worker.ZincWorkerImpl.compileMixed(ZincWorkerImpl.scala:333)
mill.scalalib.ScalaModule.$anonfun$compile$2(ScalaModule.scala:280)
mill.define.Task$TraverseCtx.evaluate(Task.scala:71)

Expectation

If we use explcit typing '{ ICons[k1, v1, IMap]($y.key, $y.value, $tt) } no error occurs. I am assuming the explicit typing is not required. The IDE (VSCode + Metals) shows the very same type parameters shown here.

@hmf hmf added itype:bug stat:needs triage Every issue needs to have an "area" and "itype" label labels Feb 22, 2024
@hmf hmf changed the title Posible regression to 3.3.1: unhandled exception while running pickleQuotes Possible regression to 3.3.1: unhandled exception while running pickleQuotes Feb 22, 2024
@nicolasstucki nicolasstucki added area:metaprogramming:quotes Issues related to quotes and splices and removed stat:needs triage Every issue needs to have an "area" and "itype" label labels Feb 23, 2024
@nicolasstucki
Copy link
Contributor

Test result: 3.3.1-RC1-bin-20230403-b0ad1e1-NIGHTLY is a bad release

Last good release: 3.3.1-RC1-bin-20230331-7262437-NIGHTLY
First bad release: 3.3.1-RC1-bin-20230403-b0ad1e1-NIGHTLY

@nicolasstucki
Copy link
Contributor

First bad commit f035f10

@nicolasstucki
Copy link
Contributor

Minimization

import scala.quoted.*

class ICons[K <: Singleton](val key: K)

def filterX(using Quotes): Unit =
  (??? : Expr[Any]) match
    case '{ $y : ICons[k1] } => '{ ICons($y.key) }

@nicolasstucki
Copy link
Contributor

Seems to be related to the <: Singleton bound.

@Gedochao Gedochao added the regression This worked in a previous version but doesn't anymore label Apr 4, 2024
nicolasstucki added a commit that referenced this issue Apr 5, 2024
Fixes #19767

In the minimization from the issue, after the splicing phase we ended up
with a quote with illegal `k1` types, which should have been healed
during the splicing phase:
```scala
'<k1$given2>{
  new ICons[(ICons[k1]#key : k1)](
  //...
```
To fix that, we now map over and heal the prefix of the TermRef as well,
so we end up with:
```scala
'<k1$given2>{
  new ICons[(ICons[k1$given2]#key : k1$given2)](
  //...
```
@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
Labels
area:metaprogramming:quotes Issues related to quotes and splices itype:bug regression This worked in a previous version but doesn't anymore
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants