Skip to content

Commit

Permalink
Fix erasure crash for Inlined rhs of a ctxfun closure
Browse files Browse the repository at this point in the history
This is achieved by safely removing Inlined nodes at that point,
in the same manner they would be removed later in `typedInlined`` in
the same phase.
  • Loading branch information
jchyb committed May 13, 2024
1 parent 4bd3369 commit fbc0bef
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 0 deletions.
2 changes: 2 additions & 0 deletions compiler/src/dotty/tools/dotc/transform/Erasure.scala
Original file line number Diff line number Diff line change
Expand Up @@ -945,6 +945,8 @@ object Erasure {
vparams = vparams :+ param
if crCount == 1 then meth.rhs.changeOwnerAfter(meth.symbol, sym, erasurePhase)
else skipContextClosures(meth.rhs, crCount - 1)
case inlined: Inlined =>
skipContextClosures(Inlines.dropInlined(inlined), crCount)

var rhs1 = skipContextClosures(ddef.rhs.asInstanceOf[Tree], contextResultCount(sym))

Expand Down
14 changes: 14 additions & 0 deletions tests/pos-macros/i16963/Macro_1.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import scala.quoted.*

inline def myMacro = ${ myMacroExpr }

def myMacroExpr(using Quotes) =
import quotes.reflect.*

'{ def innerMethod = (_: String) ?=> ???; () }.asTerm match
case block @ Inlined(_, _, Block(List(defdef: DefDef), _)) =>
val rhs =
given Quotes = defdef.symbol.asQuotes
'{ (x: String) ?=> ??? }.asTerm

Block(List(DefDef(defdef.symbol, _ => Some(rhs))), '{}.asTerm).asExprOf[Unit]
1 change: 1 addition & 0 deletions tests/pos-macros/i16963/Test_2.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
def method: Unit = myMacro

0 comments on commit fbc0bef

Please sign in to comment.