Skip to content

ArrayIndexOutOfBoundsException while unpickling quote #5161

Closed
@nicolasstucki

Description

@nicolasstucki
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)
	...

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions