Skip to content

Commit fddc4a4

Browse files
committed
Register no elements for lint after inlining
1 parent ce57b71 commit fddc4a4

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

compiler/src/dotty/tools/dotc/transform/CheckUnused.scala

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package transform
33

44
import ast.*, desugar.{ForArtifact, PatternVar}, tpd.*, untpd.ImportSelector
55
import config.ScalaSettings
6-
import core.*, Contexts.*, Flags.*
6+
import core.*, Contexts.*, Decorators.*, Flags.*
77
import Names.{Name, SimpleName, DerivedName, TermName, termName}
88
import NameKinds.{BodyRetainerName, ContextBoundParamName, ContextFunctionParamName, DefaultGetterName, WildcardParamName}
99
import NameOps.{isAnonymousFunctionName, isReplWrapperName, setterName}
@@ -161,7 +161,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
161161
tree
162162

163163
override def prepareForBind(tree: Bind)(using Context): Context =
164-
refInfos.register(tree)
164+
register(tree)
165165
ctx
166166
/* cf QuotePattern
167167
override def transformBind(tree: Bind)(using Context): tree.type =
@@ -179,7 +179,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
179179

180180
override def prepareForValDef(tree: ValDef)(using Context): Context =
181181
if !tree.symbol.is(Deferred) && tree.rhs.symbol != defn.Predef_undefined then
182-
refInfos.register(tree)
182+
register(tree)
183183
relax(tree.rhs, tree.tpt.tpe)
184184
ctx
185185
override def transformValDef(tree: ValDef)(using Context): tree.type =
@@ -203,7 +203,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
203203
if tree.symbol.is(Inline) then
204204
refInfos.inliners += 1
205205
else if !tree.symbol.is(Deferred) && tree.rhs.symbol != defn.Predef_undefined then
206-
refInfos.register(tree)
206+
register(tree)
207207
relax(tree.rhs, tree.tpt.tpe)
208208
ctx
209209
override def transformDefDef(tree: DefDef)(using Context): tree.type =
@@ -217,7 +217,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
217217
override def transformTypeDef(tree: TypeDef)(using Context): tree.type =
218218
traverseAnnotations(tree.symbol)
219219
if !tree.symbol.is(Param) then // type parameter to do?
220-
refInfos.register(tree)
220+
register(tree)
221221
tree
222222

223223
override def prepareForStats(trees: List[Tree])(using Context): Context =
@@ -233,8 +233,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
233233
override def transformOther(tree: Tree)(using Context): tree.type =
234234
tree match
235235
case imp: Import =>
236-
if phaseMode eq PhaseMode.Aggregate then
237-
refInfos.register(imp)
236+
register(imp)
238237
transformAllDeep(imp.expr)
239238
for selector <- imp.selectors do
240239
if selector.isGiven then
@@ -399,7 +398,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
399398
while !done && ctxs.hasNext do
400399
val cur = ctxs.next()
401400
if cur.owner.userSymbol == sym && !sym.is(Package) then
402-
enclosed = true // found enclosing definition, don't register the reference
401+
enclosed = true // found enclosing definition, don't record the reference
403402
if isLocal then
404403
if cur.owner eq sym.owner then
405404
done = true // for local def, just checking that it is not enclosing
@@ -471,6 +470,12 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
471470
return
472471
case _ =>
473472
end resolveScoped
473+
474+
/** Register new element for warnings only at typer */
475+
def register(tree: Tree)(using Context): Unit =
476+
if phaseMode eq PhaseMode.Aggregate then
477+
refInfos.register(tree)
478+
474479
end CheckUnused
475480

476481
object CheckUnused:

tests/warn/i24265.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//> using options -Wall -Werror
2+
3+
object test {
4+
inline def f(testFun: => Any) = testFun
5+
6+
f {
7+
val i = 1
8+
summon[i.type <:< Int]
9+
}
10+
}

0 commit comments

Comments
 (0)