Closed
Description
Minimized code
trait Foo[A <: Foo[A]]
trait FooCreator[A <: Foo[A]] {
def createFoo(): A
}
trait FooWrapper {
type A <: Foo[A]
def foo: A
}
object FooWrapper {
def apply[A0 <: Foo[A0]](toWrap: A0): FooWrapper { type A = A0 } = new FooWrapper {
type A = A0
def foo: A0 = toWrap
}
}
trait FooCreatorWrapper {
type A <: Foo[A]
def fooCreator: FooCreator[A]
}
sealed trait Bar
object Bar {
case class Baz(wrapper: FooCreatorWrapper) extends Bar
}
def process(bar: Bar): FooWrapper = bar match {
case Bar.Baz(wrapper) => FooWrapper(wrapper.fooCreator.createFoo())
}
Stuff which does not produce the error. No match, no creator, breaking out the expression into two lines with a val inbetween.
Output (click arrow to expand)
[error] java.lang.StackOverflowError
[error] dotty.tools.dotc.core.Types$NamedType.denot(Types.scala:2085)
[error] dotty.tools.dotc.core.TypeApplications$.safeDealias$extension(TypeApplications.scala:271)
[error] dotty.tools.dotc.core.TypeApplications$.appliedTo$extension(TypeApplications.scala:311)
[error] dotty.tools.dotc.core.Types$AppliedType.derivedAppliedType(Types.scala:4074)
[error] dotty.tools.dotc.core.Types$ApproximatingTypeMap.derivedAppliedType(Types.scala:5439)
[error] dotty.tools.dotc.core.Types$TypeMap.mapOver(Types.scala:5120)
[error] dotty.tools.dotc.core.TypeOps$$anon$1.apply(TypeOps.scala:442)
[error] dotty.tools.dotc.core.Types$ApproximatingTypeMap.reapply(Types.scala:5492)
[error] dotty.tools.dotc.core.Types$ApproximatingTypeMap.expandBounds(Types.scala:5293)
[error] dotty.tools.dotc.core.Types$ApproximatingTypeMap.tryWiden(Types.scala:5309)
[error] dotty.tools.dotc.core.TypeOps$$anon$1.derivedSelect(TypeOps.scala:457)
[error] dotty.tools.dotc.core.Types$TypeMap.mapOver(Types.scala:5117)
[error] dotty.tools.dotc.core.TypeOps$$anon$1.apply(TypeOps.scala:442)
[error] dotty.tools.dotc.core.Types$TypeMap.mapOver$$anonfun$1(Types.scala:5167)
[error] dotty.tools.dotc.core.Types$LazyRef$.apply$$anonfun$1(Types.scala:2735)
[error] dotty.tools.dotc.core.Types$LazyRef.ref(Types.scala:2748)
[error] dotty.tools.dotc.core.Types$TypeMap.mapOver$$anonfun$1(Types.scala:5166)
[error] dotty.tools.dotc.core.Types$LazyRef$.apply$$anonfun$1(Types.scala:2735)
[error] dotty.tools.dotc.core.Types$LazyRef.ref(Types.scala:2748)
[error] dotty.tools.dotc.core.Types$TypeMap.mapOver$$anonfun$1(Types.scala:5166)
[error] dotty.tools.dotc.core.Types$LazyRef$.apply$$anonfun$1(Types.scala:2735)
[error] dotty.tools.dotc.core.Types$LazyRef.ref(Types.scala:2748)
[error] dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:5605)
[error] dotty.tools.dotc.core.Types$NamedPartsAccumulator.apply(Types.scala:5661)
[error] dotty.tools.dotc.core.Types$NamedPartsAccumulator.apply(Types.scala:5639)
[error] dotty.tools.dotc.core.Types$TypeAccumulator.op$proxy19$1(Types.scala:5535)
[error] dotty.tools.dotc.core.Types$TypeAccumulator.foldArgs$1(Types.scala:5535)
[error] dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:5539)
[error] dotty.tools.dotc.core.Types$NamedPartsAccumulator.apply(Types.scala:5653)
[error] dotty.tools.dotc.core.Types$NamedPartsAccumulator.apply(Types.scala:5639)
[error] dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:5605)
[error] dotty.tools.dotc.core.Types$NamedPartsAccumulator.apply(Types.scala:5661)
[error] dotty.tools.dotc.core.Types$NamedPartsAccumulator.apply(Types.scala:5639)
[error] dotty.tools.dotc.core.Types$TypeAccumulator.op$proxy19$1(Types.scala:5535)
[error] dotty.tools.dotc.core.Types$TypeAccumulator.foldArgs$1(Types.scala:5535)
[error] dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:5539)
...