Skip to content

Commit d209f5a

Browse files
committed
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. [Cherry-picked 54a4863][modified]
1 parent 30127f0 commit d209f5a

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

150150
override def prepareForBind(tree: Bind)(using Context): Context =
151-
refInfos.register(tree)
151+
register(tree)
152152
ctx
153153
/* cf QuotePattern
154154
override def transformBind(tree: Bind)(using Context): tree.type =
@@ -166,7 +166,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
166166

167167
override def prepareForValDef(tree: ValDef)(using Context): Context =
168168
if !tree.symbol.is(Deferred) && tree.rhs.symbol != defn.Predef_undefined then
169-
refInfos.register(tree)
169+
register(tree)
170170
relax(tree.rhs, tree.tpt.tpe)
171171
ctx
172172
override def transformValDef(tree: ValDef)(using Context): tree.type =
@@ -190,7 +190,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
190190
if tree.symbol.is(Inline) then
191191
refInfos.inliners += 1
192192
else if !tree.symbol.is(Deferred) && tree.rhs.symbol != defn.Predef_undefined then
193-
refInfos.register(tree)
193+
register(tree)
194194
relax(tree.rhs, tree.tpt.tpe)
195195
ctx
196196
override def transformDefDef(tree: DefDef)(using Context): tree.type =
@@ -204,14 +204,13 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
204204
override def transformTypeDef(tree: TypeDef)(using Context): tree.type =
205205
traverseAnnotations(tree.symbol)
206206
if !tree.symbol.is(Param) then // type parameter to do?
207-
refInfos.register(tree)
207+
register(tree)
208208
tree
209209

210210
override def transformOther(tree: Tree)(using Context): tree.type =
211211
tree match
212212
case imp: Import =>
213-
if phaseMode eq PhaseMode.Aggregate then
214-
refInfos.register(imp)
213+
register(imp)
215214
transformAllDeep(imp.expr)
216215
for selector <- imp.selectors do
217216
if selector.isGiven then
@@ -353,7 +352,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
353352
while !done && ctxs.hasNext do
354353
val cur = ctxs.next()
355354
if cur.owner.userSymbol == sym && !sym.is(Package) then
356-
enclosed = true // found enclosing definition, don't register the reference
355+
enclosed = true // found enclosing definition, don't record the reference
357356
if isLocal then
358357
if cur.owner eq sym.owner then
359358
done = true // for local def, just checking that it is not enclosing
@@ -393,6 +392,12 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
393392
if imports && candidate != NoContext && candidate.isImportContext && importer != null then
394393
refInfos.sels.put(importer, ())
395394
end resolveUsage
395+
396+
/** Register new element for warnings only at typer */
397+
def register(tree: Tree)(using Context): Unit =
398+
if phaseMode eq PhaseMode.Aggregate then
399+
refInfos.register(tree)
400+
396401
end CheckUnused
397402

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