Skip to content

Commit 108be25

Browse files
committed
Fix #9100: Add error when experimental macros are not enabled
1 parent 345c8bc commit 108be25

File tree

6 files changed

+23
-3
lines changed

6 files changed

+23
-3
lines changed

compiler/src/dotty/tools/dotc/config/Feature.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ object Feature:
6060
def dependentEnabled(using Context) =
6161
enabled(nme.dependent, defn.LanguageExperimentalModule.moduleClass)
6262

63+
def scala2ExperimentalMacroEnabled(using Context) =
64+
enabled("macros".toTermName, defn.LanguageExperimentalModule.moduleClass)
65+
6366
def sourceVersionSetting(using Context): SourceVersion =
6467
SourceVersion.valueOf(ctx.settings.source.value)
6568

compiler/src/dotty/tools/dotc/typer/Typer.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3581,6 +3581,16 @@ class Typer extends Namer
35813581
}
35823582
}
35833583
if ctx.phase.isTyper then
3584+
call match
3585+
case untpd.Ident(nme.???) => // Instinsic macros ignored
3586+
case _ =>
3587+
if !config.Feature.scala2ExperimentalMacroEnabled then
3588+
ctx.error(
3589+
"""Scala 2 macro definition needs to be enabled
3590+
|by making the implicit value scala.language.experimental.macros visible.
3591+
|This can be achieved by adding the import clause 'import scala.language.experimental.macros'
3592+
|or by setting the compiler option -language:experimental.macros.
3593+
""".stripMargin, call.sourcePos)
35843594
call match
35853595
case call: untpd.Ident =>
35863596
typedIdent(call, defn.AnyType)

tests/neg/i9100.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
object FooMacros {
2+
def foo[T]: String = macro Foo.fooImpl[T] // error: Scala 2 macro definition needs to be enabled
3+
}

tests/semanticdb/expect/Classes.expect.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package classes
2-
2+
import scala.language/*->scalaShadowing::language.*/.experimental/*->scalaShadowing::language.experimental.*/.macros/*->scalaShadowing::language.experimental.macros.*/
33
class C1/*<-classes::C1#*/(val x1/*<-classes::C1#x1.*/: Int/*->scala::Int#*/) extends AnyVal/*->scala::AnyVal#*//*->scala::AnyVal#`<init>`().*/
44

55
class C2/*<-classes::C2#*/(val x2/*<-classes::C2#x2.*/: Int/*->scala::Int#*/) extends AnyVal/*->scala::AnyVal#*//*->scala::AnyVal#`<init>`().*/

tests/semanticdb/expect/Classes.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package classes
2-
2+
import scala.language.experimental.macros
33
class C1(val x1: Int) extends AnyVal
44

55
class C2(val x2: Int) extends AnyVal

tests/semanticdb/metac.expect

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ Uri => Classes.scala
340340
Text => empty
341341
Language => Scala
342342
Symbols => 106 entries
343-
Occurrences => 126 entries
343+
Occurrences => 130 entries
344344

345345
Symbols:
346346
classes/C1# => final class C1
@@ -452,6 +452,10 @@ local3 => val local local
452452

453453
Occurrences:
454454
[0:8..0:15): classes <- classes/
455+
[1:7..1:12): scala -> scala/
456+
[1:13..1:21): language -> scalaShadowing/language.
457+
[1:22..1:34): experimental -> scalaShadowing/language.experimental.
458+
[1:35..1:41): macros -> scalaShadowing/language.experimental.macros.
455459
[2:6..2:8): C1 <- classes/C1#
456460
[2:8..2:21): <- classes/C1#`<init>`().
457461
[2:13..2:15): x1 <- classes/C1#x1.

0 commit comments

Comments
 (0)