scala / scala3

The Scala 3 compiler, also known as Dotty.
https://dotty.epfl.ch
Apache License 2.0
5.84k stars 1.05k forks source link

pickling reference to undefined symbol in quoted code #15213

Closed bishabosha closed 2 years ago

bishabosha commented 2 years ago

This has started crashing in 3.2.0-RC1-bin-20220422-fd6ac43-NIGHTLY. Example is from https://docs.scala-lang.org/scala3/reference/metaprogramming/macros.html#example-expansion

Compiler version

3.2.0-RC1-bin-20220422-fd6ac43-NIGHTLY (first crash)

Minimized code

import scala.quoted.*

def map[T](arr: Expr[Array[T]], f: Expr[T] => Expr[Unit])(using Type[T], Quotes): Expr[Unit] = '{}

def sum(arr: Expr[Array[Int]])(using Quotes): Expr[Int] = '{
  var sum = 0
  ${ map(arr, x => '{sum += $x}) }
  sum
}

Output (click arrow to expand)

```scala -- Error: /Users/jamie/workspace/dotty/local/foo/App.scala:15:6 ---------------- 15 | var sum = 0 | ^ |pickling reference to as yet undefined (sum : Int) with symbol variable sum exception occurred while compiling /Users/jamie/workspace/dotty/local/foo/App.scala Exception in thread "main" java.lang.AssertionError: assertion failed: unresolved symbols: variable sum (line 14) #14827 when pickling /Users/jamie/workspace/dotty/local/foo/App.scala java.lang.AssertionError: assertion failed: unresolved symbols: variable sum (line 14) #14827 when pickling /Users/jamie/workspace/dotty/local/foo/App.scala while compiling /Users/jamie/workspace/dotty/local/foo/App.scala at scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:8) at dotty.tools.dotc.core.tasty.TreePickler.pickle(TreePickler.scala:770) at dotty.tools.dotc.quoted.PickledQuotes$.pickle(PickledQuotes.scala:220) at dotty.tools.dotc.quoted.PickledQuotes$.pickleQuote(PickledQuotes.scala:32) at dotty.tools.dotc.transform.PickleQuotes$.pickleAsTasty$1(PickleQuotes.scala:294) at dotty.tools.dotc.transform.PickleQuotes$.apply(PickleQuotes.scala:380) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:106) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$1(Trees.scala:1513) at scala.collection.immutable.List.mapConserve(List.scala:472) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1513) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1418) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$1(Trees.scala:1513) at scala.collection.immutable.List.mapConserve(List.scala:472) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1513) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1418) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$1(Trees.scala:1513) at scala.collection.immutable.List.mapConserve(List.scala:472) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1513) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1418) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1412) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1420) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1484) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:40) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1212) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1212) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformBlock(tpd.scala:1217) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1432) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1412) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1418) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1484) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:40) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1212) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1212) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformBlock(tpd.scala:1217) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1432) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$1(Trees.scala:1513) at scala.collection.immutable.List.mapConserve(List.scala:472) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1513) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1418) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1484) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:40) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1212) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1212) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformBlock(tpd.scala:1217) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1432) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$1(Trees.scala:1513) at scala.collection.immutable.List.mapConserve(List.scala:472) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1513) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1418) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1418) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1484) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:40) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1212) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1212) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformBlock(tpd.scala:1217) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1432) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformBlock$$anonfun$1$$anonfun$1(tpd.scala:1217) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1199) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1212) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformBlock(tpd.scala:1217) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1432) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1412) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1418) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1484) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:40) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1212) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1212) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformBlock(tpd.scala:1217) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1432) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$1(Trees.scala:1513) at scala.collection.immutable.List.mapConserve(List.scala:472) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1513) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1418) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1484) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:40) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1212) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1212) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1214) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:47) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1486) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:40) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.loop$2(tpd.scala:1212) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1212) at dotty.tools.dotc.ast.tpd$TreeMapWithPreciseStatContexts.transformStats(tpd.scala:1214) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1494) at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:40) at dotty.tools.dotc.transform.PickleQuotes$$anon$1.transform(PickleQuotes.scala:123) at dotty.tools.dotc.transform.MacroTransform.run(MacroTransform.scala:18) at dotty.tools.dotc.transform.PickleQuotes.run(PickleQuotes.scala:96) at dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:311) at scala.collection.immutable.List.map(List.scala:246) at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:312) at dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:225) 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:1328) at dotty.tools.dotc.Run.runPhases$1(Run.scala:236) at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:244) at dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Run.scala:253) at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:68) at dotty.tools.dotc.Run.compileUnits(Run.scala:253) at dotty.tools.dotc.Run.compileSources(Run.scala:186) at dotty.tools.dotc.Run.compile(Run.scala:170) at dotty.tools.dotc.Driver.doCompile(Driver.scala:35) at dotty.tools.dotc.Driver.process(Driver.scala:195) at dotty.tools.dotc.Driver.process(Driver.scala:163) at dotty.tools.dotc.Driver.process(Driver.scala:175) at dotty.tools.dotc.Driver.main(Driver.scala:205) at dotty.tools.dotc.Main.main(Main.scala) ```
bishabosha commented 2 years ago

started failing in 3.2.0-RC1-bin-20220422-fd6ac43-NIGHTLY, may be related to https://github.com/lampepfl/dotty/pull/12540?

odersky commented 2 years ago

Following the error report with a failed assertion gives

6 |  var sum = 0
  |      ^
  |pickling reference to as yet undefined (sum : Int) with symbol variable sum
error when pickling type (sum : Int)
error when pickling tree sum
error when pickling tree sum.+
error when pickling tree sum.+({{{ 0 | Int | | <empty> }}})
error when pickling tree sum.+({{{ 0 | Int | | <empty> }}})
nicolasstucki commented 2 years ago

The first bad commit is a5e32da7b95dc7326cacb4d78261533651d9df07 which was indeed added by https://github.com/lampepfl/dotty/pull/12540