Skip to content
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

assertion failed: List(value c$1, value c$1) #65

Closed
fdietze opened this issue Apr 23, 2015 · 9 comments
Closed

assertion failed: List(value c$1, value c$1) #65

fdietze opened this issue Apr 23, 2015 · 9 comments

Comments

@fdietze
Copy link

fdietze commented Apr 23, 2015

Hi, I'm getting an assertion when compiling this project:

https://github.com/renesca/renesca-magic/tree/b064d5ab59c534dd485e950559394649afa4212a

Do you have any Idea where this error comes from? Macros? Scala compiler?

Thank you!

java.lang.AssertionError: assertion failed: List(value c$1, value c$1)
    at scala.reflect.internal.Symbols$Symbol.suchThat(Symbols.scala:1921)
    at scala.tools.nsc.transform.Mixin$MixinTransformer$AddInitBitsTransformer$1.scala$tools$nsc$transform$Mixin$MixinTransformer$AddInitBitsTransformer$$checkedGetter(Mixin.scala:951)
    at scala.tools.nsc.transform.Mixin$MixinTransformer$AddInitBitsTransformer$1$$anonfun$transformStats$1.apply(Mixin.scala:963)
    at scala.tools.nsc.transform.Mixin$MixinTransformer$AddInitBitsTransformer$1$$anonfun$transformStats$1.apply(Mixin.scala:962)
    at scala.collection.immutable.List.flatMap(List.scala:327)
    at scala.tools.nsc.transform.Mixin$MixinTransformer$AddInitBitsTransformer$1.transformStats(Mixin.scala:962)
    at scala.tools.nsc.transform.Mixin$MixinTransformer$AddInitBitsTransformer$1.transformStats(Mixin.scala:949)
    at scala.reflect.internal.Trees$class.itransform(Trees.scala:1366)
    at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
    at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
    at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2555)
    at scala.tools.nsc.transform.Mixin$MixinTransformer.scala$tools$nsc$transform$Mixin$MixinTransformer$$addInitBits$1(Mixin.scala:977)
    at scala.tools.nsc.transform.Mixin$MixinTransformer$$anonfun$scala$tools$nsc$transform$Mixin$MixinTransformer$$dd$1$5.apply(Mixin.scala:921)
    at scala.tools.nsc.transform.Mixin$MixinTransformer$$anonfun$scala$tools$nsc$transform$Mixin$MixinTransformer$$dd$1$5.apply(Mixin.scala:921)
    at scala.reflect.internal.Trees$class.deriveDefDef(Trees.scala:1810)
    at scala.reflect.internal.SymbolTable.deriveDefDef(SymbolTable.scala:16)
    at scala.tools.nsc.transform.Mixin$MixinTransformer.scala$tools$nsc$transform$Mixin$MixinTransformer$$dd$1(Mixin.scala:921)
    at scala.tools.nsc.transform.Mixin$MixinTransformer$$anonfun$addCheckedGetters$1$1.apply(Mixin.scala:943)
    at scala.tools.nsc.transform.Mixin$MixinTransformer$$anonfun$addCheckedGetters$1$1.apply(Mixin.scala:943)
    at scala.collection.immutable.List.map(List.scala:277)
    at scala.tools.nsc.transform.Mixin$MixinTransformer.addCheckedGetters$1(Mixin.scala:943)
    at scala.tools.nsc.transform.Mixin$MixinTransformer.addNewDefs(Mixin.scala:1005)
    at scala.tools.nsc.transform.Mixin$MixinTransformer.scala$tools$nsc$transform$Mixin$MixinTransformer$$postTransform(Mixin.scala:1164)
    at scala.tools.nsc.transform.Mixin$MixinTransformer$$anonfun$transform$1.apply(Mixin.scala:1261)
    at scala.tools.nsc.transform.Mixin$MixinTransformer$$anonfun$transform$1.apply(Mixin.scala:1261)
    at scala.reflect.internal.SymbolTable.enteringPhase(SymbolTable.scala:235)
    at scala.reflect.internal.SymbolTable.exitingPhase(SymbolTable.scala:256)
    at scala.tools.nsc.transform.Mixin$MixinTransformer.transform(Mixin.scala:1261)
    at scala.tools.nsc.transform.Mixin$MixinTransformer.transform(Mixin.scala:468)
    at scala.reflect.api.Trees$Transformer.transformTemplate(Trees.scala:2563)
    at scala.reflect.internal.Trees$$anonfun$itransform$4.apply(Trees.scala:1408)
    at scala.reflect.internal.Trees$$anonfun$itransform$4.apply(Trees.scala:1407)
    at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2600)
    at scala.reflect.internal.Trees$class.itransform(Trees.scala:1406)
    at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
    at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
    at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2555)
    at scala.tools.nsc.transform.Mixin$MixinTransformer.transform(Mixin.scala:1258)
    at scala.tools.nsc.transform.Mixin$MixinTransformer.transform(Mixin.scala:468)
    at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:2589)
    at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:2587)
    at scala.collection.immutable.List.loop$1(List.scala:173)
    at scala.collection.immutable.List.mapConserve(List.scala:189)
    at scala.reflect.api.Trees$Transformer.transformStats(Trees.scala:2587)
    at scala.reflect.internal.Trees$$anonfun$itransform$7.apply(Trees.scala:1426)
    at scala.reflect.internal.Trees$$anonfun$itransform$7.apply(Trees.scala:1426)
    at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2600)
    at scala.reflect.internal.Trees$class.itransform(Trees.scala:1425)
    at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
    at scala.reflect.internal.SymbolTable.itransform(SymbolTable.scala:16)
    at scala.reflect.api.Trees$Transformer.transform(Trees.scala:2555)
    at scala.tools.nsc.transform.Mixin$MixinTransformer.transform(Mixin.scala:1258)
    at scala.tools.nsc.transform.Mixin$MixinTransformer.transform(Mixin.scala:468)
    at scala.tools.nsc.ast.Trees$Transformer.transformUnit(Trees.scala:147)
    at scala.tools.nsc.transform.Transform$Phase.apply(Transform.scala:30)
    at scala.tools.nsc.Global$GlobalPhase$$anonfun$applyPhase$1.apply$mcV$sp(Global.scala:441)
    at scala.tools.nsc.Global$GlobalPhase.withCurrentUnit(Global.scala:432)
    at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:441)
    at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:399)
    at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:399)
    at scala.collection.Iterator$class.foreach(Iterator.scala:750)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1202)
    at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:399)
    at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1500)
    at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1487)
    at scala.tools.nsc.Global$Run.compileSources(Global.scala:1482)
    at scala.tools.nsc.Global$Run.compile(Global.scala:1580)
    at xsbt.CachedCompiler0.run(CompilerInterface.scala:116)
    at xsbt.CachedCompiler0.run(CompilerInterface.scala:95)
    at xsbt.CompilerInterface.run(CompilerInterface.scala:26)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:101)
    at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:47)
    at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:41)
    at sbt.compiler.MixedAnalyzingCompiler$$anonfun$compileScala$1$1.apply$mcV$sp(MixedAnalyzingCompiler.scala:51)
    at sbt.compiler.MixedAnalyzingCompiler$$anonfun$compileScala$1$1.apply(MixedAnalyzingCompiler.scala:51)
    at sbt.compiler.MixedAnalyzingCompiler$$anonfun$compileScala$1$1.apply(MixedAnalyzingCompiler.scala:51)
    at sbt.compiler.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:75)
    at sbt.compiler.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:50)
    at sbt.compiler.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:65)
    at sbt.compiler.IC$$anonfun$compileInternal$1.apply(IncrementalCompiler.scala:160)
    at sbt.compiler.IC$$anonfun$compileInternal$1.apply(IncrementalCompiler.scala:160)
    at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:66)
    at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:64)
    at sbt.inc.IncrementalCommon.cycle(IncrementalCommon.scala:31)
    at sbt.inc.Incremental$$anonfun$1.apply(Incremental.scala:62)
    at sbt.inc.Incremental$$anonfun$1.apply(Incremental.scala:61)
    at sbt.inc.Incremental$.manageClassfiles(Incremental.scala:89)
    at sbt.inc.Incremental$.compile(Incremental.scala:61)
    at sbt.inc.IncrementalCompile$.apply(Compile.scala:54)
    at sbt.compiler.IC$.compileInternal(IncrementalCompiler.scala:160)
    at sbt.compiler.IC$.incrementalCompile(IncrementalCompiler.scala:138)
    at sbt.Compiler$.compile(Compiler.scala:128)
    at sbt.Compiler$.compile(Compiler.scala:114)
    at sbt.Defaults$.sbt$Defaults$$compileIncrementalTaskImpl(Defaults.scala:814)
    at sbt.Defaults$$anonfun$compileIncrementalTask$1.apply(Defaults.scala:805)
    at sbt.Defaults$$anonfun$compileIncrementalTask$1.apply(Defaults.scala:803)
    at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
    at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
    at sbt.std.Transform$$anon$4.work(System.scala:63)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
    at sbt.Execute.work(Execute.scala:235)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
@xeno-by
Copy link
Member

xeno-by commented Apr 26, 2015

This error looks really similar to owner chain corruption issues that can sometimes happen in def macros. Are you using any def macros in your project?

@fdietze
Copy link
Author

fdietze commented Apr 26, 2015

I'm only using one macro annotation which uses lots of quasiquotes to pattern match and generate code.

I think the biggest architectural difference to my previous version is that I introduced objects inside the macro which contain methods using the Tree type. Could that be the issue?

The objects are inside as I don't know yet how to use the Tree type outside the macro.

@xeno-by
Copy link
Member

xeno-by commented Apr 27, 2015

It looks like this crash is caused by the macro paradise compiler plugin. In the plugin, I've patched the naming/typing infrastructure to accommodate macro annotations, and as a side-effect that fixed SI-3772. Or I thought that it fixed it, because as your example shows that the fix sometimes crashes the backend.

If you try to compile your code without the macro paradise plugin enabled, you'll get a bunch of compilation errors along the following lines:

Test.scala:59: error: SchemaPattern is already defined as (compiler-generated) case class companion object SchemaPattern
    object SchemaPattern {
           ^
Test.scala:67: error: GroupPattern is already defined as (compiler-generated) case class companion object GroupPattern
    object GroupPattern {
           ^
...

The solution would be to avoid writing explicit companions below case classes. Just moving the definitions above should be enough.

Macro paradise makes the compilation error very mysterious, so it's definitely a bug on my side, so I'll keep it open for now.

@fdietze
Copy link
Author

fdietze commented Apr 28, 2015

I disabled the compiler plugin and fixed all the errors:
renesca/renesca-magic@a5e8259

But even now the compiler crashes with the same error.

Thanks for helping out!

@xeno-by
Copy link
Member

xeno-by commented Apr 28, 2015

Hmm, looks like this is a Scala backend bug (or, maybe, an issue with how quasiquotes are implemented, but that's less likely). Could you minimize the test file to something smaller that still exhibits the problem, and then we could submit the issue ot JIRA?

@fdietze
Copy link
Author

fdietze commented Apr 28, 2015

Sure, I will do that.

@fdietze
Copy link
Author

fdietze commented Apr 28, 2015

I was able to boil it down to a simple example:

import scala.language.experimental.macros
import scala.reflect.macros.whitebox

object Macro {
  def macroImpl(c: whitebox.Context)(annottees: c.Expr[Any]*): c.Expr[Any] = {
    import c.universe._

    trait A {
      def a_term = TermName("a")
    }
    trait B {
      def b_term = TermName("b")
    }

    case class C() extends A with B

    c.Expr[Any](q" object X ")
  }
}

sbt project: https://github.com/renesca/renesca-magic/tree/70ecadc90a55c9ad797662a82ef5fafdc540ff07

@xeno-by
Copy link
Member

xeno-by commented Apr 28, 2015

Here's an even smaller reproduction:

trait Context {
  val universe: Any  
}

object Macros {
  def impl(c: Context) = {
    trait A { def a = c.universe }
    trait B { def b = c.universe }
    case class C() extends A with B
    ??? 
  }
}

@xeno-by
Copy link
Member

xeno-by commented Apr 28, 2015

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants