Skip to content

stale symbol involving trait mixin when defining and using macro in same project #12140

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
bchazalet opened this issue Apr 18, 2021 · 6 comments · Fixed by #12144
Closed

stale symbol involving trait mixin when defining and using macro in same project #12140

bchazalet opened this issue Apr 18, 2021 · 6 comments · Fixed by #12144
Milestone

Comments

@bchazalet
Copy link

Compiler version

3.0.0-RC2

Minimized code

I'm trying to compile the squeryl library under scala 3.0.0-RC2 and this line seems to be responsible for the compiler crashing:

implicit val numericComparisonEvidence: CanCompare[TNumeric, TNumeric]   = new CanCompare[TNumeric, TNumeric]

I don't know how relevant this is to the actual error (see below) but that's the line the compiler points me to. I am note quite sure how to minimise it, but I could give it a try if someone could give me some advice as to how to approach it. Note that you can see the error for yourself in the CI checks (github action) of this PR.

Output

dotty.tools.dotc.core.Denotations$StaleSymbol: stale symbol; method org$squeryl$dsl$QueryDsl$_setter_$numericComparisonEvidence_$eq#75633 in trait QueryDsl, defined in Period(59..80, run = 2), is referred to in run Period(64..64, run = 3) while compiling /Users/bchazalet/development/code/cw/squeryl/src/main/scala-3/org/squeryl/internals/OptionType.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala-3/org/squeryl/internals/TableDefinitionInSchema.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala-3/org/squeryl/internals/TypeInfo.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/KeyedEntity.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/PrimitiveTypeMode.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/Query.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/Queryable.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/Schema.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/Session.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/Table.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/View.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/adapters/DB2Adapter.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/adapters/DerbyAdapter.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/adapters/H2Adapter.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/adapters/MSSQLServer.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/adapters/MySQLAdapter.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/adapters/MySQLInnoDBAdapter.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/adapters/OracleAdapter.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/adapters/PostgreSqlAdapter.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/adapters/SQLiteAdapter.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/annotations/ColumnBase.java, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/annotations/FieldToColumnCorrespondanceMode.java, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/annotations/OptionType.java, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/annotations/Row.java, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/annotations/Transient.java, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/annotations/package.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/customtypes/CustomTypesMode.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/AbstractQuery.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/CompositeKey.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/DelegateQuery.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/Group.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/ManyToMany.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/OptionalQueryable.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/QueryDsl.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/QueryYield.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/TypedExpression.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/ast/CastExpressionNode.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/ast/ExpressionNode.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/ast/OuterJoinExpression.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/ast/QueryExpressionElements.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/ast/QueryExpressionNode.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/ast/SelectElement.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/ast/UpdateStatement.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/ast/ViewExpressionNode.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/boilerplate/ComputeMeasuresSignaturesFromGroupByState.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/boilerplate/ComputeMeasuresSignaturesFromStartOrWhereState.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/boilerplate/FromSignatures.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/boilerplate/GroupBySignatures.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/boilerplate/JoinSignatures.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/boilerplate/OrderBySignatures.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/boilerplate/Query1.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/boilerplate/SampleTuple.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/fsm/BaseQueryYield.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/fsm/StartState.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/dsl/internal/JoinedQueryable.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/internals/ArrayTEF.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/internals/ColumnAttribute.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/internals/DatabaseAdapter.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/internals/FieldMapper.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/internals/FieldMetaData.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/internals/FieldReferenceLinker.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/internals/FieldTypeHandler.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/internals/PosoLifecycleEvent.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/internals/PosoMetaData.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/internals/ResultSetMapper.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/internals/StatementWriter.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/internals/Utils.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/logging/BarChartRenderer.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/logging/LocalH2SinkStatisticsListener.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/logging/StatisticsListener.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/logging/StatsSchema.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/logging/UsageProfileConsolidator.scala, /Users/bchazalet/development/code/cw/squeryl/src/main/scala/org/squeryl/pg/PgSchema.scala
[error] ## Exception when compiling 73 sources to /Users/bchazalet/development/code/cw/squeryl/target/scala-3.0.0-RC2/classes
[error] dotty.tools.dotc.core.Denotations$StaleSymbol: stale symbol; method org$squeryl$dsl$QueryDsl$_setter_$numericComparisonEvidence_$eq#75633 in trait QueryDsl, defined in Period(59..80, run = 2), is referred to in run Period(64..64, run = 3)
[error] dotty.tools.dotc.core.Denotations$SingleDenotation.staleSymbolError(Denotations.scala:957)
[error] dotty.tools.dotc.core.Denotations$SingleDenotation.bringForward(Denotations.scala:754)
[error] dotty.tools.dotc.core.Denotations$SingleDenotation.toNewRun$1(Denotations.scala:805)
[error] dotty.tools.dotc.core.Denotations$SingleDenotation.current(Denotations.scala:879)
[error] dotty.tools.dotc.core.Symbols$Symbol.recomputeDenot(Symbols.scala:122)
[error] dotty.tools.dotc.core.Symbols$Symbol.computeDenot(Symbols.scala:116)
[error] dotty.tools.dotc.core.Symbols$Symbol.denot(Symbols.scala:109)
[error] dotty.tools.dotc.core.Symbols$.toDenot(Symbols.scala:494)
[error] dotty.tools.dotc.transform.Mixin.traitInits$1$$anonfun$1(Mixin.scala:256)
[error] scala.collection.Iterator$$anon$6.hasNext(Iterator.scala:472)
[error] scala.collection.Iterator$$anon$9.hasNext(Iterator.scala:574)
[error] scala.collection.immutable.List.prependedAll(List.scala:155)
[error] scala.collection.immutable.List$.from(List.scala:651)
[error] scala.collection.immutable.List$.from(List.scala:648)
[error] scala.collection.IterableOps$WithFilter.map(Iterable.scala:884)
[error] dotty.tools.dotc.transform.Mixin.traitInits$3(Mixin.scala:277)
[error] dotty.tools.dotc.transform.Mixin.$anonfun$5(Mixin.scala:307)
[error] scala.collection.immutable.List.flatMap(List.scala:293)
[error] dotty.tools.dotc.transform.Mixin.transformTemplate(Mixin.scala:310)
[error] dotty.tools.dotc.transform.Mixin.transformTemplate(Mixin.scala:177)
[error] dotty.tools.dotc.transform.MegaPhase.goTemplate(MegaPhase.scala:1004)
[error] dotty.tools.dotc.transform.MegaPhase.goTemplate(MegaPhase.scala:1005)
[error] dotty.tools.dotc.transform.MegaPhase.goTemplate(MegaPhase.scala:1005)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:363)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:429)
[error] dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:256)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:427)
[error] dotty.tools.dotc.transform.MegaPhase.transformStat$2(MegaPhase.scala:437)
[error] dotty.tools.dotc.transform.MegaPhase.recur$1(MegaPhase.scala:442)
[error] dotty.tools.dotc.transform.MegaPhase.recur$1(MegaPhase.scala:442)
[error] dotty.tools.dotc.transform.MegaPhase.transformStats(MegaPhase.scala:442)
[error] dotty.tools.dotc.transform.MegaPhase.mapPackage$1(MegaPhase.scala:382)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:385)
[error] dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:429)
[error] dotty.tools.dotc.transform.MegaPhase.transformUnit(MegaPhase.scala:448)
[error] dotty.tools.dotc.transform.MegaPhase.run(MegaPhase.scala:460)
[error] dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:303)
[error] scala.collection.immutable.List.map(List.scala:246)
[error] dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:304)
[error] dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:205)
[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:1323)
[error] dotty.tools.dotc.Run.runPhases$5(Run.scala:215)
[error] dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:223)
[error] scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
[error] dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:67)
[error] dotty.tools.dotc.Run.compileUnits(Run.scala:230)
[error] dotty.tools.dotc.Run.compileUnits(Run.scala:172)
[error] dotty.tools.dotc.Driver.finish(Driver.scala:60)
[error] dotty.tools.dotc.Driver.doCompile(Driver.scala:40)
[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:186)
[error] scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
[error] sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:241)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler.scala:176)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4$adapted(MixedAnalyzingCompiler.scala:157)
[error] sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:239)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:157)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:204)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:528)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:528)
[error] sbt.internal.inc.Incremental$.$anonfun$apply$5(Incremental.scala:174)
[error] sbt.internal.inc.Incremental$.$anonfun$apply$5$adapted(Incremental.scala:172)
[error] sbt.internal.inc.Incremental$$anon$2.run(Incremental.scala:457)
[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:261)
[error] sbt.internal.inc.Incremental$.$anonfun$incrementalCompile$8(Incremental.scala:412)
[error] sbt.internal.inc.Incremental$.withClassfileManager(Incremental.scala:499)
[error] sbt.internal.inc.Incremental$.incrementalCompile(Incremental.scala:399)
[error] sbt.internal.inc.Incremental$.apply(Incremental.scala:166)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:528)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:482)
[error] sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:332)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:420)
[error] sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:137)
[error] sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:2346)
[error] sbt.Defaults$.$anonfun$compileIncrementalTask$2(Defaults.scala:2303)
[error] sbt.internal.io.Retry$.apply(Retry.scala:46)
[error] sbt.internal.io.Retry$.apply(Retry.scala:28)
[error] sbt.internal.io.Retry$.apply(Retry.scala:23)
[error] sbt.internal.server.BspCompileTask$.compute(BspCompileTask.scala:31)
[error] sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:2299)
[error] scala.Function1.$anonfun$compose$1(Function1.scala:49)
[error] sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62)
[error] sbt.std.Transform$$anon$4.work(Transform.scala:68)
[error] sbt.Execute.$anonfun$submit$2(Execute.scala:282)
[error] sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:23)
[error] sbt.Execute.work(Execute.scala:291)
[error] sbt.Execute.$anonfun$submit$1(Execute.scala:282)
[error] sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265)
[error] sbt.CompletionService$$anon$2.call(CompletionService.scala:64)
[error] java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[error] java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
[error] java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[error] java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
[error] java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
[error] java.base/java.lang.Thread.run(Thread.java:832)
[error]
[error] stack trace is suppressed; run last Compile / compileIncremental for the full output
[error] (Compile / compileIncremental) dotty.tools.dotc.core.Denotations$StaleSymbol: stale symbol; method org$squeryl$dsl$QueryDsl$_setter_$numericComparisonEvidence_$eq#75633 in trait QueryDsl, defined in Period(59..80, run = 2), is referred to in run Period(64..64, run = 3)

Expectation

Strangely, I have got a computer where it compiles ok, but another where it doesn't and the CI where it doesn't either. I'd expect it to always compile.

@smarter
Copy link
Member

smarter commented Apr 18, 2021

This is caused by having a macro defined and used in the same project, this requires the compiler to execute itself multiple times, and somehow when combined with mixing in traits this doesn't work. If I move TypeInfo to its own project that the main project depends on, it compiles fine: smarter/squeryl@c33e582 /cc @nicolasstucki @odersky

@smarter smarter changed the title stale symbol while compiling squeryl against 3.0.0-RC2 stale symbol involving trait mixin when defining and using macro in same project Apr 18, 2021
@bchazalet
Copy link
Author

thanks for the swift response @smarter! I am going to do that then.

@bishabosha
Copy link
Member

bishabosha commented Apr 19, 2021

I minimised this using my example from #10043, but adding implicit modifier

// Trait.scala
package example

import quoted._

trait Trait {
  implicit val foo: Int = 23
}

object Trait {
  inline def get: Trait = ${ getImpl }

  def getImpl(using Quotes): Expr[Trait] = '{ new Trait {} }
}
// Test.scala
@main def Test = println(example.Trait.get)
> scalac -d out Trait.scala Test.scala 

@bchazalet
Copy link
Author

bchazalet commented May 15, 2021

I'm seeing this error again using scala 3.0.0 as part of the CI of this PR, see https://github.com/squeryl/squeryl/pull/321/checks?check_run_id=2591158482

Note that I don't see it locally (I'm running hotspot's java 8 locally)

@smarter
Copy link
Member

smarter commented May 15, 2021

The fix is only in master and nightly builds, not 3.0.0 which was branched off before that.

@bchazalet
Copy link
Author

I see, thanks for the info!

@Kordyjan Kordyjan added this to the 3.0.1 milestone Aug 2, 2023
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.

4 participants