Skip to content

Commit 54a4863

Browse files
authored
Register no elements for lint after inlining (#24279)
Fixes #24265 The lint previously registered imports only after typer, but no new symbols after inlining should be subject to the unused lint.
1 parent 2f320b8 commit 54a4863

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}
@@ -165,7 +165,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
165165
tree
166166

167167
override def prepareForBind(tree: Bind)(using Context): Context =
168-
refInfos.register(tree)
168+
register(tree)
169169
ctx
170170
/* cf QuotePattern
171171
override def transformBind(tree: Bind)(using Context): tree.type =
@@ -183,7 +183,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
183183

184184
override def prepareForValDef(tree: ValDef)(using Context): Context =
185185
if !tree.symbol.is(Deferred) && tree.rhs.symbol != defn.Predef_undefined then
186-
refInfos.register(tree)
186+
register(tree)
187187
relax(tree.rhs, tree.tpt.tpe)
188188
ctx
189189
override def transformValDef(tree: ValDef)(using Context): tree.type =
@@ -207,7 +207,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
207207
if tree.symbol.is(Inline) then
208208
refInfos.inliners += 1
209209
else if !tree.symbol.is(Deferred) && tree.rhs.symbol != defn.Predef_undefined then
210-
refInfos.register(tree)
210+
register(tree)
211211
relax(tree.rhs, tree.tpt.tpe)
212212
ctx
213213
override def transformDefDef(tree: DefDef)(using Context): tree.type =
@@ -221,7 +221,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
221221
override def transformTypeDef(tree: TypeDef)(using Context): tree.type =
222222
traverseAnnotations(tree.symbol)
223223
if !tree.symbol.is(Param) then // type parameter to do?
224-
refInfos.register(tree)
224+
register(tree)
225225
tree
226226

227227
override def prepareForStats(trees: List[Tree])(using Context): Context =
@@ -237,8 +237,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
237237
override def transformOther(tree: Tree)(using Context): tree.type =
238238
tree match
239239
case imp: Import =>
240-
if phaseMode eq PhaseMode.Aggregate then
241-
refInfos.register(imp)
240+
register(imp)
242241
transformAllDeep(imp.expr)
243242
for selector <- imp.selectors do
244243
if selector.isGiven then
@@ -403,7 +402,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
403402
while !done && ctxs.hasNext do
404403
val cur = ctxs.next()
405404
if cur.owner.userSymbol == sym && !sym.is(Package) then
406-
enclosed = true // found enclosing definition, don't register the reference
405+
enclosed = true // found enclosing definition, don't record the reference
407406
if isLocal then
408407
if cur.owner eq sym.owner then
409408
done = true // for local def, just checking that it is not enclosing
@@ -475,6 +474,12 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
475474
return
476475
case _ =>
477476
end resolveScoped
477+
478+
/** Register new element for warnings only at typer */
479+
def register(tree: Tree)(using Context): Unit =
480+
if phaseMode eq PhaseMode.Aggregate then
481+
refInfos.register(tree)
482+
478483
end CheckUnused
479484

480485
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)