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

unsatisfiable cyclic dependency #2940

Closed
scabug opened this issue Jan 21, 2010 · 3 comments
Closed

unsatisfiable cyclic dependency #2940

scabug opened this issue Jan 21, 2010 · 3 comments
Assignees

Comments

@scabug
Copy link

scabug commented Jan 21, 2010

I'm attempting to use the EntityFS library (http://entityfs.sourceforge.net/) from Scala and it declares an interface with self-referential generics:

Interface EntityLocation<T extends EntityLocation<?>>

With the latest nightly version of scalac:

Scala compiler version 2.8.0.r20627-b20100121020117 -- Copyright 2002-2010, LAMP/EPFL

this results in the error:

Exception in thread "main" java.lang.AssertionError: assertion failed: unsatisfiable cyclic dependency in 'trait Cycle'
	at scala.tools.nsc.symtab.classfile.ClassfileParser.parse(ClassfileParser.scala:69)
	at scala.tools.nsc.symtab.SymbolLoaders$$ClassfileLoader.doComplete(SymbolLoaders.scala:249)
	at scala.tools.nsc.symtab.SymbolLoaders$$SymbolLoader.complete(SymbolLoaders.scala:62)
	at scala.tools.nsc.symtab.SymbolLoaders$$SymbolLoader.load(SymbolLoaders.scala:81)
	at scala.tools.nsc.symtab.Symbols$$Symbol.typeParams(Symbols.scala:938)
	at scala.tools.nsc.symtab.Types$$TypeMap.mapOver(Types.scala:2760)
	at scala.tools.nsc.symtab.Types$$deAlias$$.apply(Types.scala:2623)
	at scala.tools.nsc.symtab.Types$$class.existentialAbstraction(Types.scala:2549)
	at scala.tools.nsc.symtab.SymbolTable.existentialAbstraction(SymbolTable.scala:13)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.processClassType$$1(ClassfileParser.scala:640)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.sig2type$$1(ClassfileParser.scala:658)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.sig2typeBounds$$1(ClassfileParser.scala:703)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.scala$$tools$$nsc$$symtab$$classfile$$ClassfileParser$$$$sigToType(ClassfileParser.scala:718)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.parseAttribute$$1(ClassfileParser.scala:764)
	at scala.tools.nsc.symtab.classfile.ClassfileParser$$$$anonfun$$parseAttributes$$1.apply(ClassfileParser.scala:918)
	at scala.tools.nsc.symtab.classfile.ClassfileParser$$$$anonfun$$parseAttributes$$1.apply(ClassfileParser.scala:918)
	at scala.collection.immutable.Range$$ByOne$$class.foreach(Range.scala:171)
	at scala.collection.immutable.Range$$$$anon$$2.foreach(Range.scala:153)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.parseAttributes(ClassfileParser.scala:918)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.parseClass(ClassfileParser.scala:465)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.parse(ClassfileParser.scala:98)
	at scala.tools.nsc.symtab.SymbolLoaders$$ClassfileLoader.doComplete(SymbolLoaders.scala:249)
	at scala.tools.nsc.symtab.SymbolLoaders$$SymbolLoader.complete(SymbolLoaders.scala:62)
	at scala.tools.nsc.symtab.SymbolLoaders$$SymbolLoader.load(SymbolLoaders.scala:81)
	at scala.tools.nsc.typechecker.Typers$$Typer.isStale(Typers.scala:554)
	at scala.tools.nsc.typechecker.Typers$$Typer.reallyExists(Typers.scala:545)
	at scala.tools.nsc.typechecker.Typers$$Typer.qualifies$$1(Typers.scala:3569)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedIdent$$1(Typers.scala:3586)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:4016)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:4098)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedType(Typers.scala:4201)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedType(Typers.scala:4204)
	at scala.tools.nsc.typechecker.Namers$$Namer.typeSig(Namers.scala:1160)
	at scala.tools.nsc.typechecker.Namers$$Namer$$$$anonfun$$getterTypeCompleter$$1.apply(Namers.scala:548)
	at scala.tools.nsc.typechecker.Namers$$Namer$$$$anonfun$$getterTypeCompleter$$1.apply(Namers.scala:546)
	at scala.tools.nsc.typechecker.Namers$$$$anon$$1.complete(Namers.scala:1304)
	at scala.tools.nsc.symtab.Symbols$$Symbol.info(Symbols.scala:758)
	at scala.tools.nsc.symtab.Symbols$$Symbol.initialize(Symbols.scala:867)
	at scala.tools.nsc.symtab.Symbols$$Symbol.annotations(Symbols.scala:114)
	at scala.tools.nsc.typechecker.Typers$$Typer.addGetterSetter(Typers.scala:1346)
	at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$9.apply(Typers.scala:1511)
	at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$9.apply(Typers.scala:1511)
	at scala.collection.TraversableLike$$$$anonfun$$flatMap$$1.apply(TraversableLike.scala:259)
	at scala.collection.TraversableLike$$$$anonfun$$flatMap$$1.apply(TraversableLike.scala:259)
	at scala.collection.LinearSeqLike$$class.foreach(LinearSeqLike.scala:97)
	at scala.collection.immutable.List.foreach(List.scala:46)
	at scala.collection.TraversableLike$$class.flatMap(TraversableLike.scala:259)
	at scala.collection.immutable.List.flatMap(List.scala:46)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedTemplate(Typers.scala:1511)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedClassDef(Typers.scala:1296)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:3753)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:4098)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:4151)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedStat$$1(Typers.scala:2109)
	at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$22.apply(Typers.scala:2177)
	at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$22.apply(Typers.scala:2177)
	at scala.collection.immutable.List.loop$$1(List.scala:116)
	at scala.collection.immutable.List.mapConserve(List.scala:133)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedStats(Typers.scala:2177)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:3749)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:4098)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:4151)
	at scala.tools.nsc.typechecker.Analyzer$$typerFactory$$$$anon$$3.apply(Analyzer.scala:82)
	at scala.tools.nsc.Global$$GlobalPhase$$$$anonfun$$applyPhase$$1.apply(Global.scala:278)
	at scala.tools.nsc.Global$$GlobalPhase$$$$anonfun$$applyPhase$$1.apply(Global.scala:278)
	at scala.tools.nsc.reporters.Reporter.withSource(Reporter.scala:48)
	at scala.tools.nsc.Global$$GlobalPhase.applyPhase(Global.scala:278)
	at scala.tools.nsc.typechecker.Analyzer$$typerFactory$$$$anon$$3$$$$anonfun$$run$$1.apply(Analyzer.scala:77)
	at scala.tools.nsc.typechecker.Analyzer$$typerFactory$$$$anon$$3$$$$anonfun$$run$$1.apply(Analyzer.scala:77)
	at scala.collection.Iterator$$class.foreach(Iterator.scala:582)
	at scala.collection.mutable.ListBuffer$$$$anon$$1.foreach(ListBuffer.scala:285)
	at scala.tools.nsc.typechecker.Analyzer$$typerFactory$$$$anon$$3.run(Analyzer.scala:77)
	at scala.tools.nsc.Global$$Run.compileSources(Global.scala:746)
	at scala.tools.nsc.Global$$Run.compile(Global.scala:836)
	at scala.tools.nsc.Main$$.process(Main.scala:110)
	at scala.tools.nsc.Main$$.main(Main.scala:124)
	at scala.tools.nsc.Main.main(Main.scala)

With 2.7.7.final it returns a slightly different error in the same situation:

Exception in thread "main" java.lang.AssertionError: assertion failed: internal error: illegal class file dependency
	at scala.Predef$$.assert(Predef.scala:92)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.parse(ClassfileParser.scala:62)
	at scala.tools.nsc.symtab.SymbolLoaders$$ClassfileLoader$$$$anonfun$$doComplete$$3.apply(SymbolLoaders.scala:290)
	at scala.tools.nsc.symtab.SymbolLoaders$$ClassfileLoader$$$$anonfun$$doComplete$$3.apply(SymbolLoaders.scala:290)
	at scala.tools.nsc.symtab.SymbolLoaders.completeClassfile(SymbolLoaders.scala:276)
	at scala.tools.nsc.symtab.SymbolLoaders$$ClassfileLoader.doComplete(SymbolLoaders.scala:289)
	at scala.tools.nsc.symtab.SymbolLoaders$$SymbolLoader.complete(SymbolLoaders.scala:77)
	at scala.tools.nsc.symtab.SymbolLoaders$$SymbolLoader.load(SymbolLoaders.scala:97)
	at scala.tools.nsc.symtab.Symbols$$Symbol.typeParams(Symbols.scala:702)
	at scala.tools.nsc.symtab.Types$$TypeMap.mapOver(Types.scala:2361)
	at scala.tools.nsc.symtab.Types$$ForEachTypeTraverser.traverse(Types.scala:3100)
	at scala.tools.nsc.symtab.Types$$Type.foreach(Types.scala:484)
	at scala.tools.nsc.symtab.Types$$class.existentialAbstraction(Types.scala:2187)
	at scala.tools.nsc.symtab.SymbolTable.existentialAbstraction(SymbolTable.scala:12)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.processClassType$$1(ClassfileParser.scala:583)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.sig2type$$1(ClassfileParser.scala:601)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.sig2typeBounds$$1(ClassfileParser.scala:638)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.scala$$tools$$nsc$$symtab$$classfile$$ClassfileParser$$$$sigToType(ClassfileParser.scala:653)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.parseAttribute$$1(ClassfileParser.scala:699)
	at scala.tools.nsc.symtab.classfile.ClassfileParser$$$$anonfun$$parseAttributes$$1.apply(ClassfileParser.scala:834)
	at scala.tools.nsc.symtab.classfile.ClassfileParser$$$$anonfun$$parseAttributes$$1.apply(ClassfileParser.scala:834)
	at scala.Range.foreach(Range.scala:44)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.parseAttributes(ClassfileParser.scala:834)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.parseClass(ClassfileParser.scala:403)
	at scala.tools.nsc.symtab.classfile.ClassfileParser.parse(ClassfileParser.scala:86)
	at scala.tools.nsc.symtab.SymbolLoaders$$ClassfileLoader$$$$anonfun$$doComplete$$3.apply(SymbolLoaders.scala:290)
	at scala.tools.nsc.symtab.SymbolLoaders$$ClassfileLoader$$$$anonfun$$doComplete$$3.apply(SymbolLoaders.scala:290)
	at scala.tools.nsc.symtab.SymbolLoaders.completeClassfile(SymbolLoaders.scala:276)
	at scala.tools.nsc.symtab.SymbolLoaders$$ClassfileLoader.doComplete(SymbolLoaders.scala:289)
	at scala.tools.nsc.symtab.SymbolLoaders$$SymbolLoader.complete(SymbolLoaders.scala:77)
	at scala.tools.nsc.symtab.SymbolLoaders$$SymbolLoader.load(SymbolLoaders.scala:97)
	at scala.tools.nsc.symtab.Symbols$$Symbol.exists(Symbols.scala:425)
	at scala.tools.nsc.typechecker.Typers$$Typer.qualifies$$1(Typers.scala:2894)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedIdent$$1(Typers.scala:2911)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:3290)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3358)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedType(Typers.scala:3429)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedType(Typers.scala:3432)
	at scala.tools.nsc.typechecker.Namers$$Namer.typeSig(Namers.scala:864)
	at scala.tools.nsc.typechecker.Namers$$Namer$$$$anonfun$$getterTypeCompleter$$1.apply(Namers.scala:450)
	at scala.tools.nsc.typechecker.Namers$$Namer$$$$anonfun$$getterTypeCompleter$$1.apply(Namers.scala:448)
	at scala.tools.nsc.typechecker.Namers$$$$anon$$1.complete(Namers.scala:982)
	at scala.tools.nsc.symtab.Symbols$$Symbol.info(Symbols.scala:555)
	at scala.tools.nsc.symtab.Symbols$$Symbol.initialize(Symbols.scala:669)
	at scala.tools.nsc.typechecker.Typers$$Typer.addGetterSetter(Typers.scala:1139)
	at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$10.apply(Typers.scala:1219)
	at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$10.apply(Typers.scala:1219)
	at scala.List.flatMap(List.scala:1132)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedTemplate(Typers.scala:1219)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedClassDef(Typers.scala:1090)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:3088)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3358)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3395)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedStat$$1(Typers.scala:1598)
	at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$19.apply(Typers.scala:1643)
	at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$19.apply(Typers.scala:1643)
	at scala.List$$.loop$$1(List.scala:300)
	at scala.List$$.mapConserve(List.scala:317)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedStats(Typers.scala:1643)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:3084)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3358)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3395)
	at scala.tools.nsc.typechecker.Analyzer$$typerFactory$$$$anon$$2.apply(Analyzer.scala:41)
	at scala.tools.nsc.Global$$GlobalPhase.applyPhase(Global.scala:267)
	at scala.tools.nsc.Global$$GlobalPhase$$$$anonfun$$run$$1.apply(Global.scala:246)
	at scala.tools.nsc.Global$$GlobalPhase$$$$anonfun$$run$$1.apply(Global.scala:246)
	at scala.Iterator$$class.foreach(Iterator.scala:414)
	at scala.collection.mutable.ListBuffer$$$$anon$$1.foreach(ListBuffer.scala:266)
	at scala.tools.nsc.Global$$GlobalPhase.run(Global.scala:246)
	at scala.tools.nsc.Global$$Run.compileSources(Global.scala:574)
	at scala.tools.nsc.Global$$Run.compile(Global.scala:667)
	at scala.tools.nsc.Main$$.process(Main.scala:73)
	at scala.tools.nsc.Main$$.main(Main.scala:87)
	at scala.tools.nsc.Main.main(Main.scala)

Both using OS X 10.6.2 with Java:

java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04-248-10M3025)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01-101, mixed mode)

The following two files can reproduce the issue reliably. Cycle.java:

public interface Cycle<T extends Cycle<?>> {
    void doStuff();
}

Error.scala:

class Error {
	val c: Cycle
}
@scabug
Copy link
Author

scabug commented Jan 21, 2010

Imported From: https://issues.scala-lang.org/browse/SI-2940?orig=1
Reporter: Adrian Sutton (ajsutton)
Attachments:

  • cyclic.zip (created on Jan 21, 2010 12:35:04 PM UTC, 885 bytes)

@scabug
Copy link
Author

scabug commented Jan 21, 2010

Adrian Sutton (ajsutton) said:
Reproducible test case.

@scabug
Copy link
Author

scabug commented Mar 11, 2010

@odersky said:
(In r21135) Closes #2940. Review by extempore. My original idea to replace existrentialAbstraction by existentialType in ClassfileParsers was correct after all. However this change triggered another landmine in Definitions, where ClassType queried unsafeTypeParams. I think that was only needed for the migration to Java generics in 2.7, so it can safely go away now. Because the change in classfile parsers forces less of a type, unsafeTtpeParams returned the wrong result, which caused the build to fail. The modifications in Erasure and Implicits were attempts to isolate the problem before. They seem to be unnecessary to make the build go through, but are cleaner than the previous versions they replace.

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