Closed
Description
Compiler version
3.1.0
Minimized code
abstract class LazyList[+T] {
def head: T
def tail: LazyList[T]
def isEmpty: Boolean
def push[E >: T](top: => E): LazyList[E] =
new Push[E](top, this)
//def map[R](f: T => R): LazyList[R]
def append[E >: T](that: => LazyList[E]): LazyList[E]
}
private class Push[+T](top: => T, stack: => LazyList[T]) extends LazyList[T] {
override def head: T =
top
override def tail: LazyList[T] =
stack
override def isEmpty: Boolean =
false
//override def map[R](f: T => R): LazyList[R] =
// new Push[R](f(top), stack.map(f)) {
// override def map[R2](f2: R => R2): LazyList[R2] =
// Push.this.map(f2 compose f)
// }
override def append[E >: T](that: => LazyList[E]): LazyList[E] =
new Push[E](top, stack.append(that)) {
override def append[E2 >: E](that2: => LazyList[E2]): LazyList[E2] =
Push.this.append(that.append(that2))
}
}
object LazyList {
val empty =
new LazyList[Nothing] {
override def head: Nothing =
throw new NoSuchElementException
override def tail: LazyList[Nothing] =
throw new UnsupportedOperationException
override def isEmpty: Boolean =
true
//override def map[R](f: _ => R): LazyList[R] =
// this
override def append[E](that: => LazyList[E]): LazyList[E] =
that
}
def apply[T](elements: T*): LazyList[T] =
elements.foldRight[LazyList[T]](empty)(new Push(_, _))
}
Output
exception occurred while compiling LazyList.scala
java.lang.UnsupportedOperationException: mkClosure($anon$superArg$1()) while compiling LazyList.scala
Exception in thread "main" java.lang.UnsupportedOperationException: mkClosure($anon$superArg$1())
at dotty.tools.package$.unsupported(package.scala:25)
at dotty.tools.dotc.transform.TransformByNameApply.mkByNameClosure(TransformByNameApply.scala:37)
at dotty.tools.dotc.transform.TransformByNameApply.transformArg$1(TransformByNameApply.scala:55)
at dotty.tools.dotc.transform.TransformByNameApply.$anonfun$1(TransformByNameApply.scala:62)
at dotty.tools.dotc.core.Decorators$ListDecorator$.zipWithConserve$extension(Decorators.scala:153)
at dotty.tools.dotc.transform.TransformByNameApply.transformApply(TransformByNameApply.scala:62)
at dotty.tools.dotc.transform.MegaPhase.goApply(MegaPhase.scala:644)
at dotty.tools.dotc.transform.MegaPhase.goApply(MegaPhase.scala:645)
at dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:281)
at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:429)
at dotty.tools.dotc.transform.MegaPhase.recur$2(MegaPhase.scala:453)
at dotty.tools.dotc.transform.MegaPhase.transformTrees(MegaPhase.scala:453)
at dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:360)
at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:429)
at dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:256)
at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:427)
at dotty.tools.dotc.transform.MegaPhase.transformStat$2(MegaPhase.scala:437)
at dotty.tools.dotc.transform.MegaPhase.recur$1(MegaPhase.scala:442)
at dotty.tools.dotc.transform.MegaPhase.transformStats(MegaPhase.scala:442)
at dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:299)
at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:429)
at dotty.tools.dotc.transform.MegaPhase.mapDefDef$1(MegaPhase.scala:249)
at dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:252)
at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:427)
at dotty.tools.dotc.transform.MegaPhase.transformStat$2(MegaPhase.scala:437)
at dotty.tools.dotc.transform.MegaPhase.recur$1(MegaPhase.scala:442)
at dotty.tools.dotc.transform.MegaPhase.recur$1(MegaPhase.scala:442)
at dotty.tools.dotc.transform.MegaPhase.recur$1(MegaPhase.scala:442)
at dotty.tools.dotc.transform.MegaPhase.recur$1(MegaPhase.scala:442)
at dotty.tools.dotc.transform.MegaPhase.recur$1(MegaPhase.scala:442)
at dotty.tools.dotc.transform.MegaPhase.recur$1(MegaPhase.scala:442)
at dotty.tools.dotc.transform.MegaPhase.recur$1(MegaPhase.scala:442)
at dotty.tools.dotc.transform.MegaPhase.transformStats(MegaPhase.scala:442)
at dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:362)
at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:429)
at dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:256)
at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:427)
at dotty.tools.dotc.transform.MegaPhase.transformStat$2(MegaPhase.scala:437)
at dotty.tools.dotc.transform.MegaPhase.recur$1(MegaPhase.scala:442)
at dotty.tools.dotc.transform.MegaPhase.recur$1(MegaPhase.scala:442)
at dotty.tools.dotc.transform.MegaPhase.transformStats(MegaPhase.scala:442)
at dotty.tools.dotc.transform.MegaPhase.mapPackage$1(MegaPhase.scala:382)
at dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:385)
at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:429)
at dotty.tools.dotc.transform.MegaPhase.transformUnit(MegaPhase.scala:448)
at dotty.tools.dotc.transform.MegaPhase.run(MegaPhase.scala:460)
at dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:308)
at scala.collection.immutable.List.map(List.scala:246)
at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:309)
at dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:261)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
at dotty.tools.dotc.Run.runPhases$5(Run.scala:272)
at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:280)
at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:68)
at dotty.tools.dotc.Run.compileUnits(Run.scala:289)
at dotty.tools.dotc.Run.compileSources(Run.scala:222)
at dotty.tools.dotc.Run.compile(Run.scala:206)
at dotty.tools.dotc.Driver.doCompile(Driver.scala:39)
at dotty.tools.dotc.Driver.process(Driver.scala:199)
at dotty.tools.dotc.Driver.process(Driver.scala:167)
at dotty.tools.dotc.Driver.process(Driver.scala:179)
at dotty.tools.dotc.Driver.main(Driver.scala:209)
at dotty.tools.dotc.Main.main(Main.scala)
Expectation
I think, the code should compile (or at least cause some legible error message). ;)
The culprit is the first parameter, top, to class Push. With a plain parameter instead of a by-name, the code compiles.
In the example, there are other by-name parameters commented out, which work just fine. Also commented out is another method, map, which looks quite similar to method append and doesn't cause problems. It is possible to replace class Push with an anonymous subclass of LazyList, and everything will work just fine.
I've seen earlier bug reports which looked a bit similar, but they seem to be closed already.