[#1279] | project: compiler | priority: low | category: bug | |
---|---|---|---|---|
submitter | assigned to | status | date submitted | |
Stephane | Martin | moved to trac | 2007-08-20 11:52:46.0 | |
subject | [contrib #753] Types$TypeRef Types$SubType stack overflow | |||
code |
// providing the type parameter in the recursive call to all4Impl // avoids the problem // covariant linked list abstract class M { self => type T final type selfType = M {type T <: self.T} type actualSelfType >: self.type <: selfType def next: selfType // I don't understand why this doesn't compile, but that's a separate matter // error: method all2 cannot be accessed in M.this.selfType // because its instance type => Stream[M{type T <: M.this.selfType#T}] // contains a malformed type: M.this.selfType#T // def all2: Stream[M {type T <: self.T}] = Stream.cons(self: actualSelfType, next.all2) // compiles successfully // def all3: Stream[M {type T <: self.T}] = all3Impl(self: actualSelfType) // private def all3Impl(first: M {type T <: self.T}): Stream[M {type T <: self.T}] = Stream.cons(first, all3Impl(first.next)) def all4: Stream[M {type T <: self.T}] = Unrelated.all4Impl[T](self: actualSelfType) } object Unrelated { def all4Impl[U](first: M {type T <: U}): Stream[M {type T <: U}] = Stream.cons(first, all4Impl(first.next)) // compiles successfully // def all4Impl[U](first: M {type T <: U}): Stream[M {type T <: U}] = Stream.cons(first, all4Impl[U](first.next)) } |
|||
what happened | Exception in thread "main" java.lang.StackOverflowError at scala.tools.nsc.symtab.Symbols$ClassSymbol.name(Symbols.scala:1335) at scala.tools.nsc.symtab.Symbols$Symbol.rawInfo(Symbols.scala:502) at scala.tools.nsc.symtab.Symbols$Symbol.info(Symbols.scala:473) at scala.tools.nsc.symtab.Symbols$Symbol.closureLength$0(Symbols.scala:624) at scala.tools.nsc.symtab.Symbols$Symbol.isLess(Symbols.scala:627) at scala.tools.nsc.symtab.Types$Type.closurePos(Types.scala:528) at scala.tools.nsc.symtab.Symbols$Symbol.isNonBottomSubClass(Symbols.scala:643) at scala.tools.nsc.symtab.Types$AsSeenFromMap.toPrefix$0(Types.scala:2229) at scala.tools.nsc.symtab.Types$AsSeenFromMap.apply(Types.scala:2236) at scala.tools.nsc.symtab.Types$AsSeenFromMap.apply(Types.scala:2210) at scala.tools.nsc.symtab.Types$TypeMap.mapOver(Types.scala:2087) at scala.tools.nsc.symtab.Types$AsSeenFromMap.apply(Types.scala:2281) at scala.tools.nsc.symtab.Types$AsSeenFromMap.apply(Types.scala:2210) at scala.tools.nsc.symtab.Types$TypeMap.mapOver(Types.scala:2100) at scala.tools.nsc.symtab.Types$AsSeenFromMap.apply(Types.scala:2281) at scala.tools.nsc.symtab.Types$Type.asSeenFrom(Types.scala:367) at scala.tools.nsc.symtab.Types$Type.memberInfo(Types.scala:374) at scala.tools.nsc.symtab.Types$TypeRef.relativeInfo(Types.scala:1283) at scala.tools.nsc.symtab.Types$TypeRef.baseType(Types.scala:1396) at scala.tools.nsc.symtab.Types$SubType.baseType(Types.scala:710) [...] |
|||
what expected | successful compilation | |||
[back to overview] |
Stephane edited on 2007-08-20 11:54:00.0 |
Shorter example: abstract class M { type T def all4Impl[U](first: M {type T <: U}): Stream[M {type T <: U}] = Stream.cons(first, all4Impl(Stream.empty)) } |
Martin edited on 2007-08-21 15:58:29.0 |
The example now causes a type error:
bug1279a.scala:34: error: no type parameters for method all4Impl#4259: (M#3759{type T#4288 <: U#4285})Stream#437[M#3759{type T#4291 <: U#4285}] exist so that it can be applied to arguments (first#4262.selfType#3770) --- because --- result type Stream#437[M#3759{type T#4291 <: U#4285}] is incompatible with expected type Stream#437[M#3759{type T#4264 <: U#4261}] def all4Impl[U](first: M {type T <: U}): Stream[M {type T <: U}] = Stream.cons(first, all4Impl(first.next))Not ideal, but workable. I lowered priority but leave it open. |
Gilles edited on 2007-08-29 09:58:42.0 |