Skip to content

Duplicate pattern variable when working with try from tasty reflect #7011

Closed
@anatoliykmetyuk

Description

@anatoliykmetyuk

Macro:

package playground

import scala.quoted._, scala.quoted.matching._
import delegate scala.quoted._
import scala.tasty._

inline def mcr(body: => Any): Unit = ${mcrImpl('body)}

def mcrImpl[T](body: Expr[Any]) given (ctx: QuoteContext): Expr[Any] = {
  import ctx.tasty._

  val bTree = body.unseal
  val under = bTree.underlyingArgument

  println(s"\nbTree:\n$bTree\n${bTree.show}")
  println(s"\nunder:\n$under\n${under.show}")

  val res = '{Box(${under.asInstanceOf[Term].seal})}
  println(s"\nOut:\n${res.show}\n")
  res
}

class Box(inner: => Any)

Main:

package playground

@main def main = mcr { try () catch { case x => } }

Output:

[info] Compiling 1 Scala source to /Users/anatolii/Projects/dotty/playground/core/target/scala-0.18/classes ...

bTree:
Inlined(EmptyTree,List(),Block(List(),Try(Literal(Constant(())),List(CaseDef(Bind(x,Ident(_)),EmptyTree,Block(List(),Literal(Constant(()))))),EmptyTree)))
try () catch {
  case x =>
    ()
}

under:
Try(Literal(Constant(())),List(CaseDef(Bind(x,Ident(_)),EmptyTree,Literal(Constant(())))),EmptyTree)
try () catch {
  case x =>
    ()
}

Out:
new playground.Box(try () catch {
  case x =>
    ()
})

[error] -- [E005] Naming Error: /Users/anatolii/Projects/dotty/playground/core/src/main/scala/playground/Main.scala:3:43
[error] 3 |@main def main = mcr { try () catch { case x => } }
[error]   |                                           ^
[error]   |                                           duplicate pattern variable: x
[error]   | This location is in code that was inlined at Main.scala:3
[error] one error found

Metadata

Metadata

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions