scala / bug

Scala 2 bug reports only. Please, no questions — proper bug reports only.
https://scala-lang.org
232 stars 21 forks source link

Compiler crash: no-symbol does not have owner #2994

Closed scabug closed 13 years ago

scabug commented 14 years ago

The following type level encoding of multiplication used to work on 2.7. With 2.8 beta 1 the compiler crashes with a Exception in thread "main" java.lang.Error: no-symbol does not have owner:

object Naturals {
  trait NAT {
    type a[s[_ <: NAT] <: NAT, z <: NAT] <: NAT
    type v = a[SUCC, ZERO]
  }
  final class ZERO extends NAT {
    type a[s[_ <: NAT] <: NAT, z <: NAT] = z
  }
  final class SUCC[n <: NAT] extends NAT {
    type a[s[_ <: NAT] <: NAT, z <: NAT] = s[n#a[s, z]]
  }
  type _0 = ZERO
  type _1 = SUCC[_0]
  type _2 = SUCC[_1]
  type _3 = SUCC[_2]
  type _4 = SUCC[_3]
  type _5 = SUCC[_4]
  type _6 = SUCC[_5]

  // crashes scala-2.8.0 beta1  
  trait MUL[n <: NAT, m <: NAT] extends NAT {
    trait curry[n[_[_], _], s[_]] { type f[z] = n[s, z] }
    type a[s[_ <: NAT] <: NAT, z <: NAT] = n#a[curry[m#a, s]#f, z]
  }

}
Exception in thread "main" java.lang.Error: no-symbol does not have owner
    at scala.tools.nsc.symtab.Symbols$$NoSymbol$$.owner(Symbols.scala:2051)
    at scala.tools.nsc.symtab.Types$$class.isHKSubType0(Types.scala:4139)
    at scala.tools.nsc.symtab.SymbolTable.isHKSubType0(SymbolTable.scala:13)
    at scala.tools.nsc.symtab.Types$$class.isSubType2(Types.scala:4192)
    at scala.tools.nsc.symtab.Types$$class.isSubType0(Types.scala:4175)
    at scala.tools.nsc.symtab.SymbolTable.isSubType0(SymbolTable.scala:13)
    at scala.tools.nsc.symtab.Types$$$$anonfun$$isSubType$$1.apply(Types.scala:4082)
    at scala.tools.nsc.symtab.Types$$$$anonfun$$isSubType$$1.apply(Types.scala:4070)
    at scala.tools.nsc.symtab.Types$$undoLog$$.undoUnless(Types.scala:127)
    at scala.tools.nsc.symtab.Types$$class.isSubType(Types.scala:4069)
    at scala.tools.nsc.symtab.SymbolTable.isSubType(SymbolTable.scala:13)
    at scala.tools.nsc.symtab.Types$$Type.$$less$$colon$$less(Types.scala:579)
    at scala.tools.nsc.symtab.Types$$TypeBounds.containsType(Types.scala:1118)
    at scala.tools.nsc.symtab.Types$$$$anonfun$$isWithinBounds$$3.apply(Types.scala:4602)
    at scala.tools.nsc.symtab.Types$$$$anonfun$$isWithinBounds$$3.apply(Types.scala:4602)
    at scala.Tuple2$$Zipped$$$$anonfun$$forall$$1.apply(Tuple2.scala:106)
    at scala.Tuple2$$Zipped$$$$anonfun$$forall$$1.apply(Tuple2.scala:104)
    at scala.collection.LinearSeqLike$$class.foreach(LinearSeqLike.scala:97)
    at scala.collection.immutable.List.foreach(List.scala:46)
    at scala.Tuple2$$Zipped.forall(Tuple2.scala:104)
    at scala.tools.nsc.symtab.Types$$class.isWithinBounds(Types.scala:4602)
    at scala.tools.nsc.symtab.SymbolTable.isWithinBounds(SymbolTable.scala:13)
    at scala.tools.nsc.typechecker.Infer$$Inferencer.checkBounds(Infer.scala:1088)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer.checkBounds(RefChecks.scala:889)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer.scala$$tools$$nsc$$typechecker$$RefChecks$$RefCheckTransformer$$$$checkTypeRef(RefChecks.scala:961)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer$$$$anonfun$$15.apply(RefChecks.scala:1106)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer$$$$anonfun$$15.apply(RefChecks.scala:1099)
    at scala.tools.nsc.symtab.Types$$ForEachTypeTraverser.traverse(Types.scala:3455)
    at scala.tools.nsc.symtab.Types$$TypeTraverser.apply(Types.scala:2941)
    at scala.tools.nsc.symtab.Types$$TypeTraverser.apply(Types.scala:2939)
    at scala.tools.nsc.symtab.Types$$TypeMap.mapOver(Types.scala:2765)
    at scala.tools.nsc.symtab.Types$$ForEachTypeTraverser.traverse(Types.scala:3456)
    at scala.tools.nsc.symtab.Types$$TypeTraverser.apply(Types.scala:2941)
    at scala.tools.nsc.symtab.Types$$TypeTraverser.apply(Types.scala:2939)
    at scala.tools.nsc.symtab.Types$$TypeMap$$$$anonfun$$mapOverArgs$$1.apply(Types.scala:2835)
    at scala.tools.nsc.symtab.Types$$TypeMap$$$$anonfun$$mapOverArgs$$1.apply(Types.scala:2831)
    at scala.tools.nsc.symtab.Types$$class.map2Conserve(Types.scala:4511)
    at scala.tools.nsc.symtab.SymbolTable.map2Conserve(SymbolTable.scala:13)
    at scala.tools.nsc.symtab.Types$$TypeMap.mapOverArgs(Types.scala:2831)
    at scala.tools.nsc.symtab.Types$$TypeMap.mapOver(Types.scala:2741)
    at scala.tools.nsc.symtab.Types$$ForEachTypeTraverser.traverse(Types.scala:3456)
    at scala.tools.nsc.symtab.Types$$Type.foreach(Types.scala:557)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer.doTypeTraversal(RefChecks.scala:966)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer.transform(RefChecks.scala:1099)
    at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$6.apply(Trees.scala:1467)
    at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$6.apply(Trees.scala:1466)
    at scala.tools.nsc.ast.Trees$$Transformer.atOwner(Trees.scala:1580)
    at scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:1465)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer.transform(RefChecks.scala:1150)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer.transformStat(RefChecks.scala:877)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer$$$$anonfun$$8.apply(RefChecks.scala:795)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer$$$$anonfun$$8.apply(RefChecks.scala:795)
    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.RefChecks$$RefCheckTransformer.transformStats(RefChecks.scala:795)
    at scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:1476)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer.transform(RefChecks.scala:1150)
    at scala.tools.nsc.ast.Trees$$Transformer.transformTemplate(Trees.scala:1556)
    at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$2.apply(Trees.scala:1446)
    at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$2.apply(Trees.scala:1445)
    at scala.tools.nsc.ast.Trees$$Transformer.atOwner(Trees.scala:1580)
    at scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:1444)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer.transform(RefChecks.scala:1150)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer.transformStat(RefChecks.scala:877)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer$$$$anonfun$$8.apply(RefChecks.scala:795)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer$$$$anonfun$$8.apply(RefChecks.scala:795)
    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.RefChecks$$RefCheckTransformer.transformStats(RefChecks.scala:795)
    at scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:1476)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer.transform(RefChecks.scala:1150)
    at scala.tools.nsc.ast.Trees$$Transformer.transformTemplate(Trees.scala:1556)
    at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$2.apply(Trees.scala:1446)
    at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$2.apply(Trees.scala:1445)
    at scala.tools.nsc.ast.Trees$$Transformer.atOwner(Trees.scala:1580)
    at scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:1444)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer.transform(RefChecks.scala:1150)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer.transformStat(RefChecks.scala:827)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer$$$$anonfun$$8.apply(RefChecks.scala:795)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer$$$$anonfun$$8.apply(RefChecks.scala:795)
    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.RefChecks$$RefCheckTransformer.transformStats(RefChecks.scala:795)
    at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$1.apply(Trees.scala:1440)
    at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$1.apply(Trees.scala:1440)
    at scala.tools.nsc.ast.Trees$$Transformer.atOwner(Trees.scala:1580)
    at scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:1439)
    at scala.tools.nsc.typechecker.RefChecks$$RefCheckTransformer.transform(RefChecks.scala:1150)
    at scala.tools.nsc.ast.Trees$$Transformer.transformUnit(Trees.scala:1573)
    at scala.tools.nsc.transform.Transform$$Phase.apply(Transform.scala:31)
    at scala.tools.nsc.Global$$GlobalPhase$$$$anonfun$$applyPhase$$1.apply(Global.scala:281)
    at scala.tools.nsc.Global$$GlobalPhase$$$$anonfun$$applyPhase$$1.apply(Global.scala:281)
    at scala.tools.nsc.reporters.Reporter.withSource(Reporter.scala:48)
    at scala.tools.nsc.Global$$GlobalPhase.applyPhase(Global.scala:281)
    at scala.tools.nsc.Global$$GlobalPhase$$$$anonfun$$run$$1.apply(Global.scala:259)
    at scala.tools.nsc.Global$$GlobalPhase$$$$anonfun$$run$$1.apply(Global.scala:259)
    at scala.collection.Iterator$$class.foreach(Iterator.scala:582)
    at scala.collection.mutable.ListBuffer$$$$anon$$1.foreach(ListBuffer.scala:285)
    at scala.tools.nsc.Global$$GlobalPhase.run(Global.scala:259)
    at scala.tools.nsc.Global$$Run.compileSources(Global.scala:749)
    at scala.tools.nsc.Global$$Run.compile(Global.scala:839)
    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)
scabug commented 14 years ago

Imported From: https://issues.scala-lang.org/browse/SI-2994?orig=1 Reporter: michid4

scabug commented 14 years ago

@paulp said: It is hard to pinpoint this regression because it took a windy path. There are two key inflections. It worked until r17556, and in r17557 started tripping an assertion in the typer:

Exception in thread "main" java.lang.AssertionError: assertion failed
    at scala.Predef$$.assert(Predef.scala:87)
    at scala.tools.nsc.typechecker.Typers$$Typer.adapt(Typers.scala:742)
    at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3486)
    at scala.tools.nsc.typechecker.Typers$$Typer.typedHigherKindedType(Typers.scala:3564)
    at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$51.apply(Typers.scala:3164)
    at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$51.apply(Typers.scala:3163)

Then after bouncing around a bit, in r18858 it would not compile:

/scala/trac/2994/a.scala:24: error: type arguments [s,z] do not conform to type a's type parameter bounds [s[_ <: Naturals.NAT] <: Naturals.NAT,z <: Naturals.NAT]
    type a[s[_ <: NAT] <: NAT, z <: NAT] = n#a[curry[m#a, s]#f, z]
                                             ^
one error found

In r18859 it became what is presumably the current crasher.

Exception in thread "main" java.lang.Error: no-symbol does not have owner
    at scala.tools.nsc.symtab.Symbols$$NoSymbol$$.owner(Symbols.scala:1870)
    at scala.tools.nsc.symtab.Types$$class.isHKSubType0(Types.scala:3746)
    at scala.tools.nsc.symtab.SymbolTable.isHKSubType0(SymbolTable.scala:13)
    at scala.tools.nsc.symtab.Types$$class.isSubType2(Types.scala:3798)
    at scala.tools.nsc.symtab.Types$$class.isSubType0(Types.scala:3782)
    at scala.tools.nsc.symtab.SymbolTable.isSubType0(SymbolTable.scala:13)
scabug commented 14 years ago

@adriaanm said: thanks for narrowing it down, Paul It looks like cloning is producing orphans (as one might expect).

scabug commented 14 years ago

Christian Hofer (chmh) said: The following code and its variant cause the same error and look related.

Tested on: 2.8.0Beta1-prerelease and scala-2.8.0.r20879-b20100214020153

object Test {
    trait Bar[X[_]]
    trait Baz[S[_] <: Bar[S]] {
        type Apply[T]
    }
    trait Foo[V[E[_]]] extends Bar[Baz[V]#Apply]
}

The variant is:

object Test {
    trait Bar[X[_]]
    trait Qux[S[_] <: Bar[S], T]
    trait Baz[S[_] <: Bar[S]] {
        type Apply[T] = Qux[S,T]
    }
    trait Foo[V[E[_]]] extends Bar[Baz[V]#Apply]
}
scabug commented 14 years ago

@adriaanm said: ok, fix will be in trunk later today if my local test suite passes

btw, there are kinding errors in all these examples, for example, for the OP, curry should be defined as:

    trait curry[n[_[_], _], s[_]] { type f[z/**/ <: NAT/**/] = n[s, z] }

and in the FooBarBaz example:

   trait Foo[/**/V[_] <: Bar[V]/**/] extends Bar[Baz[V]#Apply]
scabug commented 14 years ago

@adriaanm said: (In r21105) closes #2994

make normalize slightly more aggressive in loading symbol info, while tolerating the righteous cycle (use sym.info.typeParameters instead of unsafeParams) this is needed to make sure higher-kinded types have their type parameters (otherwise we'd get a PolyType with NoSymbol for typeParams)