Skip to content

Commit e7f4db5

Browse files
Merge pull request #15147 from dotty-staging/fix-15133
Fix check experimental inline references
2 parents 31be2b0 + 0ce5de5 commit e7f4db5

File tree

4 files changed

+41
-10
lines changed

4 files changed

+41
-10
lines changed

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import ast.tpd
1212

1313
class CrossVersionChecks extends MiniPhase:
1414
import tpd.*
15+
import CrossVersionChecks.*
1516

1617
override def phaseName: String = CrossVersionChecks.name
1718

@@ -27,7 +28,7 @@ class CrossVersionChecks extends MiniPhase:
2728
// arbitrarily choose one as more important than the other.
2829
private def checkUndesiredProperties(sym: Symbol, pos: SrcPos)(using Context): Unit =
2930
checkDeprecated(sym, pos)
30-
checkExperimental(sym, pos)
31+
checkExperimentalRef(sym, pos)
3132
checkSinceAnnot(sym, pos)
3233

3334
val xMigrationValue = ctx.settings.Xmigration.value
@@ -69,10 +70,6 @@ class CrossVersionChecks extends MiniPhase:
6970
val since = annot.argumentConstant(1).map(" since " + _.stringValue).getOrElse("")
7071
report.deprecationWarning(s"${sym.showLocated} is deprecated${since}${msg}", pos)
7172

72-
private def checkExperimental(sym: Symbol, pos: SrcPos)(using Context): Unit =
73-
if sym.isExperimental && !ctx.owner.isInExperimentalScope then
74-
Feature.checkExperimentalDef(sym, pos)
75-
7673
private def checkExperimentalSignature(sym: Symbol, pos: SrcPos)(using Context): Unit =
7774
class Checker extends TypeTraverser:
7875
def traverse(tp: Type): Unit =
@@ -192,11 +189,11 @@ class CrossVersionChecks extends MiniPhase:
192189
tpe.foreachPart {
193190
case TypeRef(_, sym: Symbol) =>
194191
checkDeprecated(sym, tree.srcPos)
195-
checkExperimental(sym, tree.srcPos)
192+
checkExperimentalRef(sym, tree.srcPos)
196193
checkSinceAnnot(sym, tree.srcPos)
197194
case TermRef(_, sym: Symbol) =>
198195
checkDeprecated(sym, tree.srcPos)
199-
checkExperimental(sym, tree.srcPos)
196+
checkExperimentalRef(sym, tree.srcPos)
200197
checkSinceAnnot(sym, tree.srcPos)
201198
case _ =>
202199
}
@@ -214,3 +211,10 @@ end CrossVersionChecks
214211
object CrossVersionChecks:
215212
val name: String = "crossVersionChecks"
216213
val description: String = "check issues related to deprecated and experimental"
214+
215+
/** Check that a reference to an experimental definition with symbol `sym` is only
216+
* used in an experimental scope
217+
*/
218+
def checkExperimentalRef(sym: Symbol, pos: SrcPos)(using Context): Unit =
219+
if sym.isExperimental && !ctx.owner.isInExperimentalScope then
220+
Feature.checkExperimentalDef(sym, pos)

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import ErrorReporting.errorTree
2525
import dotty.tools.dotc.util.{SimpleIdentityMap, SimpleIdentitySet, SourceFile, SourcePosition, SrcPos}
2626
import dotty.tools.dotc.parsing.Parsers.Parser
2727
import Nullables._
28-
import transform.{PostTyper, Inlining}
28+
import transform.{PostTyper, Inlining, CrossVersionChecks}
2929

3030
import collection.mutable
3131
import reporting.trace
@@ -102,8 +102,7 @@ object Inliner {
102102
if (tree.symbol == defn.CompiletimeTesting_typeChecks) return Intrinsics.typeChecks(tree)
103103
if (tree.symbol == defn.CompiletimeTesting_typeCheckErrors) return Intrinsics.typeCheckErrors(tree)
104104

105-
if tree.symbol.isExperimental then
106-
Feature.checkExperimentalDef(tree.symbol, tree)
105+
CrossVersionChecks.checkExperimentalRef(tree.symbol, tree.srcPos)
107106

108107
if tree.symbol.isConstructor then return tree // error already reported for the inline constructor definition
109108

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import scala.annotation.experimental
2+
3+
@experimental
4+
inline def foo: Any = ???
5+
6+
@experimental
7+
object Test {
8+
val x = foo
9+
10+
def bar() = {
11+
foo
12+
}
13+
14+
foo
15+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import scala.annotation.experimental
2+
3+
@experimental
4+
inline def foo: Any = ???
5+
6+
object Test {
7+
@experimental val x = foo
8+
9+
@experimental
10+
def bar() = {
11+
foo
12+
}
13+
}

0 commit comments

Comments
 (0)