Skip to content

Compiler crash when enum class combine with given instance #8344

Closed
@Eastsun

Description

@Eastsun

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)
  }
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions