question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

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

See original GitHub issue

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.

Issue Analytics

  • State:closed
  • Created 2 years ago
  • Comments:6 (3 by maintainers)

github_iconTop GitHub Comments

2reactions
bishaboshacommented, Apr 19, 2021

I minimised this using my example from https://github.com/lampepfl/dotty/issues/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 
1reaction
smartercommented, 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: https://github.com/smarter/squeryl/commit/c33e5826716993fbb34e6fb9025124f77076539f /cc @nicolasstucki @odersky

Read more comments on GitHub >

github_iconTop Results From Across the Web

Scheme with Classes, Mixins, and Traits - CS @ Utah
The class system is implemented as a macro in terms of procedures and a record-type gen- erator; the mixin and trait patterns, in...
Read more >
Scala macros. How to instantiate subclass and dynamically ...
I'm using Scala.js to write React code. I now have a form which contains bunch of input s, each needs a onChange callback...
Read more >
How to Use Mixins in Sass and Pass Arguments – With Code ...
First we define a mixin using the @mixin at-rule. Then we give it a name – choose whatever you think will fit what...
Read more >
Laravel Macroable: Understanding macros and mixin - Medium
Laravel Macroable is a package, that allows adding extra functionality to a class that is missing in the class definition through a simple...
Read more >
NoDenotation - Javadoc.io
The class with the same (type-) name as this module or module class, ... Otherwise the symbol is stale, which constitutes an internal...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found