diff --git a/compiler/src/dotty/tools/dotc/transform/PruneErasedDefs.scala b/compiler/src/dotty/tools/dotc/transform/PruneErasedDefs.scala index 12c6477262f8..7d8f0025eb15 100644 --- a/compiler/src/dotty/tools/dotc/transform/PruneErasedDefs.scala +++ b/compiler/src/dotty/tools/dotc/transform/PruneErasedDefs.scala @@ -55,7 +55,8 @@ class PruneErasedDefs extends MiniPhase with SymTransformer { thisTransform => tree def checkErasedInExperimental(sym: Symbol)(using Context): Unit = - if sym.is(Erased) && sym != defn.Compiletime_erasedValue && !sym.isInExperimentalScope then + // Make an exception for Scala 2 experimental macros to allow dual Scala 2/3 macros under non experimental mode + if sym.is(Erased, butNot = Macro) && sym != defn.Compiletime_erasedValue && !sym.isInExperimentalScope then Feature.checkExperimentalFeature("erased", sym.sourcePos) } diff --git a/tests/pos-custom-args/no-experimental/i8945.scala b/tests/pos-custom-args/no-experimental/i8945.scala new file mode 100644 index 000000000000..5dded16f0160 --- /dev/null +++ b/tests/pos-custom-args/no-experimental/i8945.scala @@ -0,0 +1,27 @@ +// src-2/MacroImpl.scala +trait Context { + object universe { + type Literal + } +} + +class MacroImpl(val c: Context) { + import c.universe.* + def mono: Literal = ??? +} + +// src-3/Macros.scala +import scala.language.experimental.macros + +object Macros { + + object Bundles { + def mono: Unit = macro MacroImpl.mono + inline def mono: Unit = ${ Macros3.monoImpl } + } + + object Macros3 { + def monoImpl(using quoted.Quotes) = '{()} + } + +} \ No newline at end of file