Skip to content

Commit 0f8335e

Browse files
som-snytttgodzik
authored andcommitted
Register no elements for lint after inlining (scala#24279)
Fixes scala#24265 The lint previously registered imports only after typer, but no new symbols after inlining should be subject to the unused lint.
1 parent 4a59f61 commit 0f8335e

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

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

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import dotty.tools.dotc.ast.tpd.*
66
import dotty.tools.dotc.ast.untpd, untpd.ImportSelector
77
import dotty.tools.dotc.config.ScalaSettings
88
import dotty.tools.dotc.core.Contexts.*
9+
import dotty.tools.dotc.core.Decorators.*
910
import dotty.tools.dotc.core.Flags.*
1011
import dotty.tools.dotc.core.Names.{Name, SimpleName, DerivedName, TermName, termName}
1112
import dotty.tools.dotc.core.NameKinds.{
@@ -169,12 +170,12 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
169170
tree
170171

171172
override def prepareForBind(tree: Bind)(using Context): Context =
172-
refInfos.register(tree)
173+
register(tree)
173174
ctx
174175

175176
override def prepareForValDef(tree: ValDef)(using Context): Context =
176177
if !tree.symbol.is(Deferred) && tree.rhs.symbol != defn.Predef_undefined then
177-
refInfos.register(tree)
178+
register(tree)
178179
relax(tree.rhs, tree.tpt.tpe)
179180
ctx
180181
override def transformValDef(tree: ValDef)(using Context): tree.type =
@@ -196,7 +197,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
196197
if tree.symbol.is(Inline) then
197198
refInfos.inliners += 1
198199
else if !tree.symbol.is(Deferred) && tree.rhs.symbol != defn.Predef_undefined then
199-
refInfos.register(tree)
200+
register(tree)
200201
relax(tree.rhs, tree.tpt.tpe)
201202
ctx
202203
override def transformDefDef(tree: DefDef)(using Context): tree.type =
@@ -208,7 +209,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
208209
override def transformTypeDef(tree: TypeDef)(using Context): tree.type =
209210
traverseAnnotations(tree.symbol)
210211
if !tree.symbol.is(Param) then // type parameter to do?
211-
refInfos.register(tree)
212+
register(tree)
212213
tree
213214

214215
override def prepareForStats(trees: List[Tree])(using Context): Context =
@@ -224,8 +225,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
224225
override def transformOther(tree: Tree)(using Context): tree.type =
225226
tree match
226227
case imp: Import =>
227-
if phaseMode eq PhaseMode.Aggregate then
228-
refInfos.register(imp)
228+
register(imp)
229229
transformAllDeep(imp.expr)
230230
for selector <- imp.selectors do
231231
if selector.isGiven then
@@ -375,7 +375,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
375375
while !done && ctxs.hasNext do
376376
val cur = ctxs.next()
377377
if cur.owner.userSymbol == sym && !sym.is(Package) then
378-
enclosed = true // found enclosing definition, don't register the reference
378+
enclosed = true // found enclosing definition, don't record the reference
379379
if isLocal then
380380
if cur.owner eq sym.owner then
381381
done = true // for local def, just checking that it is not enclosing
@@ -447,6 +447,12 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
447447
return
448448
case _ =>
449449
end resolveScoped
450+
451+
/** Register new element for warnings only at typer */
452+
def register(tree: Tree)(using Context): Unit =
453+
if phaseMode eq PhaseMode.Aggregate then
454+
refInfos.register(tree)
455+
450456
end CheckUnused
451457

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