Skip to content

Commit 75a615f

Browse files
committed
Fix #11774: only enable experimental features for snapshot and nightly
1 parent e7d7859 commit 75a615f

File tree

4 files changed

+34
-2
lines changed

4 files changed

+34
-2
lines changed

compiler/src/dotty/tools/dotc/Driver.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class Driver {
7777
val ictx = rootCtx.fresh
7878
val summary = command.distill(args, ictx.settings)(ictx.settingsState)(using ictx)
7979
ictx.setSettings(summary.sstate)
80+
Feature.checkExperimentalFlags(using ictx)
8081
MacroClassLoader.init(ictx)
8182
Positioned.init(using ictx)
8283

compiler/src/dotty/tools/dotc/ast/TreeInfo.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,11 @@ trait TreeInfo[T >: Untyped <: Type] { self: Trees.Instance[T] =>
279279

280280
def isLanguageImport(path: Tree): Boolean = languageImport(path).isDefined
281281

282+
def isExperimentalImport(path: Tree): Boolean =
283+
languageImport(path) match
284+
case Some(nme.experimental) => true
285+
case _ => false
286+
282287
/** The underlying pattern ignoring any bindings */
283288
def unbind(x: Tree): Tree = unsplice(x) match {
284289
case Bind(_, y) => unbind(y)

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,16 @@ object Feature:
2828
val symbolLiterals = deprecated("symbolLiterals")
2929
val fewerBraces = experimental("fewerBraces")
3030

31-
/** Is `feature` enabled by by a command-line setting? The enabling setting is
31+
val experimentalWarningMessage = "Experimental features may only be used with nightly or snapshot version of compiler."
32+
33+
/** Experimental features are only enabled for snapshot and nightly compiler versions
34+
*/
35+
def checkExperimentalFeature(feature: TermName): Boolean =
36+
feature match
37+
case QualifiedName(nme.experimental, _) => Properties.experimental
38+
case _ => true
39+
40+
/** Is `feature` enabled by by a command-line setting? The enabling setting is
3241
*
3342
* -language:<prefix>feature
3443
*
@@ -56,9 +65,11 @@ object Feature:
5665
* @param feature The name of the feature
5766
* @param owner The prefix symbol (nested in `scala.language`) where the
5867
* feature is defined.
68+
*
69+
* Note: Experimental features are only enabled for snapshot and nightly version of compiler.
5970
*/
6071
def enabled(feature: TermName)(using Context): Boolean =
61-
enabledBySetting(feature) || enabledByImport(feature)
72+
checkExperimentalFeature(feature) && (enabledBySetting(feature) || enabledByImport(feature))
6273

6374
/** Is auto-tupling enabled? */
6475
def autoTuplingEnabled(using Context): Boolean = !enabled(nme.noAutoTupling)
@@ -71,6 +82,8 @@ object Feature:
7182

7283
def genericNumberLiteralsEnabled(using Context) = enabled(genericNumberLiterals)
7384

85+
def erasedEnabled(using Context) = enabled(Feature.erasedDefinitions)
86+
7487
def scala2ExperimentalMacroEnabled(using Context) = enabled(scala2macros)
7588

7689
def sourceVersionSetting(using Context): SourceVersion =
@@ -97,4 +110,14 @@ object Feature:
97110
else
98111
false
99112

113+
/** Check that experimental compiler options are only set for snapshot or nightly compiler versions. */
114+
def checkExperimentalFlags(using Context): Unit =
115+
if !Properties.experimental then
116+
val features = ctx.settings.language.value.filter(_.contains(nme.experimental.toString))
117+
if features.nonEmpty then
118+
report.error(
119+
experimentalWarningMessage +
120+
"\nThe experimental language features are enabled via -language:" + features.mkString(",")
121+
)
122+
100123
end Feature

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import config.Feature
3232
import config.Feature.{sourceVersion, migrateTo3}
3333
import config.SourceVersion._
3434
import config.SourceVersion
35+
import config.Properties
3536

3637
object Parsers {
3738

@@ -3079,6 +3080,8 @@ object Parsers {
30793080
val imp = Import(tree, selectors)
30803081
if isLanguageImport(tree) then
30813082
in.languageImportContext = in.languageImportContext.importContext(imp, NoSymbol)
3083+
if isExperimentalImport(tree) && !Properties.experimental then
3084+
report.error(Feature.experimentalWarningMessage, imp.srcPos)
30823085
for
30833086
case ImportSelector(id @ Ident(imported), EmptyTree, _) <- selectors
30843087
if allSourceVersionNames.contains(imported)

0 commit comments

Comments
 (0)