diff --git a/compiler/src/dotty/tools/dotc/transform/CheckUnused.scala b/compiler/src/dotty/tools/dotc/transform/CheckUnused.scala index 32ec1ce7c87d..9b734e9ea3a9 100644 --- a/compiler/src/dotty/tools/dotc/transform/CheckUnused.scala +++ b/compiler/src/dotty/tools/dotc/transform/CheckUnused.scala @@ -3,7 +3,7 @@ package transform import ast.*, desugar.{ForArtifact, PatternVar}, tpd.*, untpd.ImportSelector import config.ScalaSettings -import core.*, Contexts.*, Flags.* +import core.*, Contexts.*, Decorators.*, Flags.* import Names.{Name, SimpleName, DerivedName, TermName, termName} import NameKinds.{BodyRetainerName, ContextBoundParamName, ContextFunctionParamName, DefaultGetterName, WildcardParamName} import NameOps.{isAnonymousFunctionName, isReplWrapperName, setterName} @@ -161,7 +161,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha tree override def prepareForBind(tree: Bind)(using Context): Context = - refInfos.register(tree) + register(tree) ctx /* cf QuotePattern override def transformBind(tree: Bind)(using Context): tree.type = @@ -179,7 +179,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha override def prepareForValDef(tree: ValDef)(using Context): Context = if !tree.symbol.is(Deferred) && tree.rhs.symbol != defn.Predef_undefined then - refInfos.register(tree) + register(tree) relax(tree.rhs, tree.tpt.tpe) ctx override def transformValDef(tree: ValDef)(using Context): tree.type = @@ -203,7 +203,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha if tree.symbol.is(Inline) then refInfos.inliners += 1 else if !tree.symbol.is(Deferred) && tree.rhs.symbol != defn.Predef_undefined then - refInfos.register(tree) + register(tree) relax(tree.rhs, tree.tpt.tpe) ctx override def transformDefDef(tree: DefDef)(using Context): tree.type = @@ -217,7 +217,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha override def transformTypeDef(tree: TypeDef)(using Context): tree.type = traverseAnnotations(tree.symbol) if !tree.symbol.is(Param) then // type parameter to do? - refInfos.register(tree) + register(tree) tree override def prepareForStats(trees: List[Tree])(using Context): Context = @@ -233,8 +233,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha override def transformOther(tree: Tree)(using Context): tree.type = tree match case imp: Import => - if phaseMode eq PhaseMode.Aggregate then - refInfos.register(imp) + register(imp) transformAllDeep(imp.expr) for selector <- imp.selectors do if selector.isGiven then @@ -399,7 +398,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha while !done && ctxs.hasNext do val cur = ctxs.next() if cur.owner.userSymbol == sym && !sym.is(Package) then - enclosed = true // found enclosing definition, don't register the reference + enclosed = true // found enclosing definition, don't record the reference if isLocal then if cur.owner eq sym.owner then 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 return case _ => end resolveScoped + + /** Register new element for warnings only at typer */ + def register(tree: Tree)(using Context): Unit = + if phaseMode eq PhaseMode.Aggregate then + refInfos.register(tree) + end CheckUnused object CheckUnused: diff --git a/tests/warn/i24265.scala b/tests/warn/i24265.scala new file mode 100644 index 000000000000..9c5f189b26d6 --- /dev/null +++ b/tests/warn/i24265.scala @@ -0,0 +1,10 @@ +//> using options -Wall -Werror + +object test { + inline def f(testFun: => Any) = testFun + + f { + val i = 1 + summon[i.type <:< Int] + } +}