Skip to content

Quotes.reflect.TreeTraverser causes a match error on some input trees (regression in 3.1.0 compared to 3.0.2) #15028

@rmgk

Description

@rmgk

Compiler version

broken in 3.1.{0,1,2} work in 3.0.2

Minimized code

import scala.quoted.*

inline def myTreeTraverse[T](inline expr: T): T = ${ treeTraverseImpl('expr) }

def treeTraverseImpl[T: Type](value: Expr[T])(using quotes: Quotes): Expr[T] = {
  import quotes.reflect.*
  (new TreeTraverser {}).traverseTree(value.asTerm)(Symbol.spliceOwner)
  value
}
// another file
def test() =
  myTreeTraverse {
    Option.empty[Int] match
      case Some(n) => 1
      case None => 5
  }

Output

[error] ./Test.scala:5:3: Exception occurred while executing macro expansion.
[error] scala.MatchError: Typed(UnApply(TypeApply(Select(Ident(Some),unapply),List(TypeTree[TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int)])),List(),List(Bind(n,Ident(_)))),TypeTree[AppliedType(TypeRef(ThisType(TypeRef(NoPrefix,module class scala)),class Some),List(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Int)))]) (of class dotty.tools.dotc.ast.Trees$Typed)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4454)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4367)
[error] 	at TreeTraverse$package$$anon$1.foldOverTree(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren(Quotes.scala:4476)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren$(Quotes.scala:4470)
[error] 	at TreeTraverse$package$$anon$1.traverseTreeChildren(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree(Quotes.scala:4472)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree$(Quotes.scala:4470)
[error] 	at TreeTraverse$package$$anon$1.traverseTree(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree(Quotes.scala:4474)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree$(Quotes.scala:4470)
[error] 	at TreeTraverse$package$$anon$1.foldTree(TreeTraverse.scala:7)
[error] 	at TreeTraverse$package$$anon$1.foldTree(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4450)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4367)
[error] 	at TreeTraverse$package$$anon$1.foldOverTree(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren(Quotes.scala:4476)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren$(Quotes.scala:4470)
[error] 	at TreeTraverse$package$$anon$1.traverseTreeChildren(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree(Quotes.scala:4472)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree$(Quotes.scala:4470)
[error] 	at TreeTraverse$package$$anon$1.traverseTree(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree(Quotes.scala:4474)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree$(Quotes.scala:4470)
[error] 	at TreeTraverse$package$$anon$1.foldTree(TreeTraverse.scala:7)
[error] 	at TreeTraverse$package$$anon$1.foldTree(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees$$anonfun$1(Quotes.scala:4372)
[error] 	at scala.collection.LinearSeqOps.foldLeft(LinearSeq.scala:169)
[error] 	at scala.collection.LinearSeqOps.foldLeft$(LinearSeq.scala:165)
[error] 	at scala.collection.immutable.List.foldLeft(List.scala:79)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees(Quotes.scala:4372)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldTrees$(Quotes.scala:4367)
[error] 	at TreeTraverse$package$$anon$1.foldTrees(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4407)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4367)
[error] 	at TreeTraverse$package$$anon$1.foldOverTree(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren(Quotes.scala:4476)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren$(Quotes.scala:4470)
[error] 	at TreeTraverse$package$$anon$1.traverseTreeChildren(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree(Quotes.scala:4472)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree$(Quotes.scala:4470)
[error] 	at TreeTraverse$package$$anon$1.traverseTree(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree(Quotes.scala:4474)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree$(Quotes.scala:4470)
[error] 	at TreeTraverse$package$$anon$1.foldTree(TreeTraverse.scala:7)
[error] 	at TreeTraverse$package$$anon$1.foldTree(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4399)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4367)
[error] 	at TreeTraverse$package$$anon$1.foldOverTree(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren(Quotes.scala:4476)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren$(Quotes.scala:4470)
[error] 	at TreeTraverse$package$$anon$1.traverseTreeChildren(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree(Quotes.scala:4472)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree$(Quotes.scala:4470)
[error] 	at TreeTraverse$package$$anon$1.traverseTree(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree(Quotes.scala:4474)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.foldTree$(Quotes.scala:4470)
[error] 	at TreeTraverse$package$$anon$1.foldTree(TreeTraverse.scala:7)
[error] 	at TreeTraverse$package$$anon$1.foldTree(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree(Quotes.scala:4415)
[error] 	at scala.quoted.Quotes$reflectModule$TreeAccumulator.foldOverTree$(Quotes.scala:4367)
[error] 	at TreeTraverse$package$$anon$1.foldOverTree(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren(Quotes.scala:4476)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTreeChildren$(Quotes.scala:4470)
[error] 	at TreeTraverse$package$$anon$1.traverseTreeChildren(TreeTraverse.scala:7)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree(Quotes.scala:4472)
[error] 	at scala.quoted.Quotes$reflectModule$TreeTraverser.traverseTree$(Quotes.scala:4470)
[error] 	at TreeTraverse$package$$anon$1.traverseTree(TreeTraverse.scala:7)
[error] 	at TreeTraverse$package$.treeTraverseImpl(TreeTraverse.scala:7)
[error] 

Expectation

Compiles just fine (like 3.0.2)

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions