Skip to content

pickling reference to undefined symbol in quoted code #15213

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
bishabosha opened this issue May 18, 2022 · 3 comments · Fixed by #15247
Closed

pickling reference to undefined symbol in quoted code #15213

bishabosha opened this issue May 18, 2022 · 3 comments · Fixed by #15247
Assignees
Labels
area:metaprogramming:quotes Issues related to quotes and splices itype:bug itype:crash regression This worked in a previous version but doesn't anymore
Milestone

Comments

@bishabosha
Copy link
Member

bishabosha commented May 18, 2022

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)

-- 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 bishabosha added itype:bug itype:crash regression This worked in a previous version but doesn't anymore area:metaprogramming:quotes Issues related to quotes and splices labels May 18, 2022
@bishabosha bishabosha added this to the 3.2.0-RC1 milestone May 18, 2022
@bishabosha
Copy link
Member Author

started failing in 3.2.0-RC1-bin-20220422-fd6ac43-NIGHTLY, may be related to #12540?

@bishabosha bishabosha changed the title picking symbol missing pickling reference to undefined symbol in quoted code May 18, 2022
@odersky
Copy link
Contributor

odersky commented May 18, 2022

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 nicolasstucki added the stat:needs bisection Need to use nightly builds and git bisect to find out the commit where this issue was introduced label May 19, 2022
@nicolasstucki
Copy link
Contributor

The first bad commit is a5e32da which was indeed added by #12540

@nicolasstucki nicolasstucki removed the stat:needs bisection Need to use nightly builds and git bisect to find out the commit where this issue was introduced label May 19, 2022
nicolasstucki added a commit to dotty-staging/dotty that referenced this issue May 20, 2022
@anatoliykmetyuk anatoliykmetyuk modified the milestones: 3.2.0-RC1, 3.1.3 May 30, 2022
@Kordyjan Kordyjan modified the milestones: 3.1.3, 3.2.0-RC1 May 31, 2022
bishabosha pushed a commit to dotty-staging/dotty that referenced this issue Oct 18, 2022
@Kordyjan Kordyjan modified the milestones: 3.2.0-RC1, 3.2.0 Aug 1, 2023
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 itype:crash 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