Skip to content

Commit

Permalink
fix scala 2 macros in traits with type parameters (#18663)
Browse files Browse the repository at this point in the history
Fixes #16630

This PR fixes the above issue which affects cross scala2/3 projects that
use a common macro library as per
https://docs.scala-lang.org/scala3/guides/migration/tutorial-macro-mixing.html
, e.g. scala-logging is blocked from fixing this issue
lightbend-labs/scala-logging#317

The fix makes the scala 2 macro check read the Erased flag from the
initial flags rather than completing the RHS first. This will work in
the case of scala 2 macros because the erased flag is explicitly added
rather than being in the source code. However it relies on using an
"UNSAFE" value.
  • Loading branch information
bishabosha authored Oct 12, 2023
2 parents 85d55e7 + 974e4d3 commit d0fb2b3
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 1 deletion.
2 changes: 1 addition & 1 deletion compiler/src/dotty/tools/dotc/core/SymDenotations.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1030,7 +1030,7 @@ object SymDenotations {

/** Is this a Scala 2 macro defined */
final def isScala2MacroInScala3(using Context): Boolean =
is(Macro, butNot = Inline) && is(Erased)
is(Macro, butNot = Inline) && flagsUNSAFE.is(Erased) // flag is set initially for macros - we check if it's a scala 2 macro before completing the type constructor so do not force the info to check the flag
// Consider the macros of StringContext as plain Scala 2 macros when
// compiling the standard library with Dotty.
// This should be removed on Scala 3.x
Expand Down
14 changes: 14 additions & 0 deletions tests/pos-macros/i16630.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import scala.language.experimental.macros
import scala.quoted.{Quotes, Expr, Type}

trait TraitWithTypeParam[A]:
inline def foo: Option[A] = ${ MacrosImpl.fooImpl[A] }
def foo: Option[A] = macro MacrosImpl.compatFooImpl[A]

object MacrosImpl:
def fooImpl[A: Type](using quotes: Quotes): Expr[Option[A]] = ???
def compatFooImpl[A: c.WeakTypeTag](c: Context): c.Tree = ???

trait Context:
type WeakTypeTag[A]
type Tree

0 comments on commit d0fb2b3

Please sign in to comment.