Closed
Description
import scala.quoted._
object Test {
implicit val toolbox: scala.quoted.Toolbox = scala.quoted.Toolbox.make
enum Exp {
case Int2(x: Int)
case Add(e1: Exp, e2: Exp)
}
import Exp._
def evalTest(e: Exp): Expr[Option[Int]] = e match {
case Int2(x) => '(Some(~x.toExpr))
case Add(e1, e2) =>
'{
(~evalTest(e1), ~evalTest(e2)) match {
case (Some(x), Some(y)) => Some(x+y)
case _ => None
}
}
case null => '(None)
}
def main(args: Array[String]): Unit = {
val test = Add(Int2(1), Int2(1))
val res = evalTest(test)
println("run : " + res.run)
println("show : " + res.show)
}
}
fails at runtime with
run : Some(2)
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 39
at dotty.tools.dotc.core.Periods.hasSameBaseTypesAs(Periods.scala:48)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.baseTypeCache(SymDenotations.scala:1326)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.baseTypeOf(SymDenotations.scala:1632)
at dotty.tools.dotc.core.Types$Type.baseType(Types.scala:901)
at dotty.tools.dotc.core.TypeComparer.tryBaseType$1(TypeComparer.scala:612)
at dotty.tools.dotc.core.TypeComparer.compareAppliedType2$1(TypeComparer.scala:853)
at dotty.tools.dotc.core.TypeComparer.thirdTry$1(TypeComparer.scala:426)
at dotty.tools.dotc.core.TypeComparer.secondTry$1(TypeComparer.scala:317)
at dotty.tools.dotc.core.TypeComparer.firstTry$1(TypeComparer.scala:305)
at dotty.tools.dotc.core.TypeComparer.recur(TypeComparer.scala:936)
at dotty.tools.dotc.core.TypeComparer.isSubType(TypeComparer.scala:130)
at dotty.tools.dotc.core.TypeComparer.isSubType(TypeComparer.scala:137)
at dotty.tools.dotc.core.ConstraintHandling.isSubTypeWhenFrozen(ConstraintHandling.scala:187)
at dotty.tools.dotc.core.ConstraintHandling.isSubType(ConstraintHandling.scala:170)
at dotty.tools.dotc.core.TypeComparer.mergeIfSuper(TypeComparer.scala:1523)
at dotty.tools.dotc.core.TypeComparer.lub(TypeComparer.scala:1404)
at dotty.tools.dotc.core.TypeComparer.lub$$anonfun$1(TypeComparer.scala:1421)
at scala.collection.LinearSeqOptimized.foldLeft(LinearSeqOptimized.scala:122)
at scala.collection.LinearSeqOptimized.foldLeft$(LinearSeqOptimized.scala:118)
at scala.collection.immutable.List.foldLeft(List.scala:86)
at scala.collection.TraversableOnce.$div$colon(TraversableOnce.scala:151)
at scala.collection.TraversableOnce.$div$colon$(TraversableOnce.scala:151)
at scala.collection.AbstractTraversable.$div$colon(Traversable.scala:104)
at dotty.tools.dotc.core.TypeComparer.lub(TypeComparer.scala:1421)
at dotty.tools.dotc.typer.TypeAssigner.assignType(TypeAssigner.scala:481)
at dotty.tools.dotc.ast.tpd$.Match(tpd.scala:121)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readLengthTerm$1(TreeUnpickler.scala:1078)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readTerm(TreeUnpickler.scala:1156)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readBlock$1(TreeUnpickler.scala:1045)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readLengthTerm$1(TreeUnpickler.scala:1067)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readTerm(TreeUnpickler.scala:1156)
at dotty.tools.dotc.core.tasty.TreeUnpickler.unpickle(TreeUnpickler.scala:100)
at dotty.tools.dotc.core.tasty.DottyUnpickler.computeTrees(DottyUnpickler.scala:64)
at dotty.tools.dotc.ast.tpd$TreeProvider.trees(tpd.scala:960)
at dotty.tools.dotc.ast.tpd$TreeProvider.tree(tpd.scala:964)
at dotty.tools.dotc.core.quoted.PickledQuotes$.unpickle(PickledQuotes.scala:113)
at dotty.tools.dotc.core.quoted.PickledQuotes$.unpickleExpr(PickledQuotes.scala:70)
at dotty.tools.dotc.core.quoted.PickledQuotes$.quotedExprToTree(PickledQuotes.scala:44)
...