From 108be2517049ce566f14cdf41924d0206eeddd60 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Mon, 8 Jun 2020 11:43:50 +0200 Subject: [PATCH] Fix #9100: Add error when experimental macros are not enabled --- compiler/src/dotty/tools/dotc/config/Feature.scala | 3 +++ compiler/src/dotty/tools/dotc/typer/Typer.scala | 10 ++++++++++ tests/neg/i9100.scala | 3 +++ tests/semanticdb/expect/Classes.expect.scala | 2 +- tests/semanticdb/expect/Classes.scala | 2 +- tests/semanticdb/metac.expect | 6 +++++- 6 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 tests/neg/i9100.scala diff --git a/compiler/src/dotty/tools/dotc/config/Feature.scala b/compiler/src/dotty/tools/dotc/config/Feature.scala index 933fd0f372c4..25d79bc50f2f 100644 --- a/compiler/src/dotty/tools/dotc/config/Feature.scala +++ b/compiler/src/dotty/tools/dotc/config/Feature.scala @@ -60,6 +60,9 @@ object Feature: def dependentEnabled(using Context) = enabled(nme.dependent, defn.LanguageExperimentalModule.moduleClass) + def scala2ExperimentalMacroEnabled(using Context) = + enabled("macros".toTermName, defn.LanguageExperimentalModule.moduleClass) + def sourceVersionSetting(using Context): SourceVersion = SourceVersion.valueOf(ctx.settings.source.value) diff --git a/compiler/src/dotty/tools/dotc/typer/Typer.scala b/compiler/src/dotty/tools/dotc/typer/Typer.scala index b89d878e03c1..6d7e9aff4c7a 100644 --- a/compiler/src/dotty/tools/dotc/typer/Typer.scala +++ b/compiler/src/dotty/tools/dotc/typer/Typer.scala @@ -3581,6 +3581,16 @@ class Typer extends Namer } } if ctx.phase.isTyper then + call match + case untpd.Ident(nme.???) => // Instinsic macros ignored + case _ => + if !config.Feature.scala2ExperimentalMacroEnabled then + ctx.error( + """Scala 2 macro definition needs to be enabled + |by making the implicit value scala.language.experimental.macros visible. + |This can be achieved by adding the import clause 'import scala.language.experimental.macros' + |or by setting the compiler option -language:experimental.macros. + """.stripMargin, call.sourcePos) call match case call: untpd.Ident => typedIdent(call, defn.AnyType) diff --git a/tests/neg/i9100.scala b/tests/neg/i9100.scala new file mode 100644 index 000000000000..e830ee40b022 --- /dev/null +++ b/tests/neg/i9100.scala @@ -0,0 +1,3 @@ +object FooMacros { + def foo[T]: String = macro Foo.fooImpl[T] // error: Scala 2 macro definition needs to be enabled +} diff --git a/tests/semanticdb/expect/Classes.expect.scala b/tests/semanticdb/expect/Classes.expect.scala index 70bc27506c5d..7df634e2808a 100644 --- a/tests/semanticdb/expect/Classes.expect.scala +++ b/tests/semanticdb/expect/Classes.expect.scala @@ -1,5 +1,5 @@ package classes - +import scala.language/*->scalaShadowing::language.*/.experimental/*->scalaShadowing::language.experimental.*/.macros/*->scalaShadowing::language.experimental.macros.*/ class C1/*<-classes::C1#*/(val x1/*<-classes::C1#x1.*/: Int/*->scala::Int#*/) extends AnyVal/*->scala::AnyVal#*//*->scala::AnyVal#``().*/ class C2/*<-classes::C2#*/(val x2/*<-classes::C2#x2.*/: Int/*->scala::Int#*/) extends AnyVal/*->scala::AnyVal#*//*->scala::AnyVal#``().*/ diff --git a/tests/semanticdb/expect/Classes.scala b/tests/semanticdb/expect/Classes.scala index 510c853c0fda..ac0266142174 100644 --- a/tests/semanticdb/expect/Classes.scala +++ b/tests/semanticdb/expect/Classes.scala @@ -1,5 +1,5 @@ package classes - +import scala.language.experimental.macros class C1(val x1: Int) extends AnyVal class C2(val x2: Int) extends AnyVal diff --git a/tests/semanticdb/metac.expect b/tests/semanticdb/metac.expect index 6bf2e8fe4e3f..32ec79eb6fd4 100644 --- a/tests/semanticdb/metac.expect +++ b/tests/semanticdb/metac.expect @@ -340,7 +340,7 @@ Uri => Classes.scala Text => empty Language => Scala Symbols => 106 entries -Occurrences => 126 entries +Occurrences => 130 entries Symbols: classes/C1# => final class C1 @@ -452,6 +452,10 @@ local3 => val local local Occurrences: [0:8..0:15): classes <- classes/ +[1:7..1:12): scala -> scala/ +[1:13..1:21): language -> scalaShadowing/language. +[1:22..1:34): experimental -> scalaShadowing/language.experimental. +[1:35..1:41): macros -> scalaShadowing/language.experimental.macros. [2:6..2:8): C1 <- classes/C1# [2:8..2:21): <- classes/C1#``(). [2:13..2:15): x1 <- classes/C1#x1.