Closed
Description
minimized code
import scala.{Tuple => STuple}
enum Datatype[T] {
case Tuple[T <: STuple](elems: STuple.Map[T, Datatype]) extends Datatype[T]
}
object Datatype {
given [H, T <: STuple](using ht: Datatype[H], tt: Datatype[T]) as Datatype[H *: T] = tt match {
case Datatype.Tuple(elems) => Datatype.Tuple(ht *: elems)
}
}
Crash output (click arrow to expand)
[info] Compiling 1 Scala source to E:\dotty-hft\target\scala-0.22\classes ...
java.lang.StackOverflowError while compiling E:\dotty-hft\src\main\scala\Datatype.scala
[error] ## Exception when compiling 1 sources to E:\dotty-hft\target\scala-0.22\classes
[error] null
[error] dotty.tools.dotc.core.TypeOps$AbstractTypeMap$1.apply(TypeOps.scala:604)
[error] dotty.tools.dotc.core.Types$TypeMap.mapOver(Types.scala:4805)
[error] dotty.tools.dotc.core.TypeOps$AbstractTypeMap$1.apply(TypeOps.scala:604)
[error] dotty.tools.dotc.core.Types$TypeMap.op$4(Types.scala:4797)
[error] dotty.tools.dotc.core.Types$TypeMap.mapArgs$1(Types.scala:4797)
[error] dotty.tools.dotc.core.Types$TypeMap.mapOver(Types.scala:4805)
[error] dotty.tools.dotc.core.TypeOps$AbstractTypeMap$1.apply(TypeOps.scala:604)
[error] dotty.tools.dotc.core.Types$TypeMap.op$4(Types.scala:4797)
[error] dotty.tools.dotc.core.Types$TypeMap.mapArgs$1(Types.scala:4797)
[error] dotty.tools.dotc.core.Types$TypeMap.mapArgs$1(Types.scala:4799)
[error] dotty.tools.dotc.core.Types$TypeMap.mapOver(Types.scala:4805)
[error] dotty.tools.dotc.core.TypeOps$AbstractTypeMap$1.apply(TypeOps.scala:604)
...
[error] at dotty.tools.dotc.core.TypeOps$AbstractTypeMap$1.apply(TypeOps.scala:586)
[error] (Compile / compileIncremental) java.lang.StackOverflowError
[error] Total time: 3 s, completed 2020-2-19 18:23:41
The compiler also crash if change the enum
to sealed trait
or sealed abstract class
, e.g.:
import scala.{Tuple => STuple}
sealed trait Datatype[T]
object Datatype {
case class Tuple[T <: STuple](elems: STuple.Map[T, Datatype]) extends Datatype[T]
given [H, T <: STuple](using ht: Datatype[H], tt: Datatype[T]) as Datatype[H *: T] = tt match {
case Datatype.Tuple(elems) => Datatype.Tuple(ht *: elems)
}
}
However, if I move the sealed
then everything works fine:
import scala.{Tuple => STuple}
trait Datatype[T]
object Datatype {
case class Tuple[T <: STuple](elems: STuple.Map[T, Datatype]) extends Datatype[T]
given [H, T <: STuple](using ht: Datatype[H], tt: Datatype[T]) as Datatype[H *: T] = tt match {
case Datatype.Tuple(elems) => Datatype.Tuple(ht *: elems)
}
}