From 8d3954f8095a6705c0aaaf103245f071943c48a3 Mon Sep 17 00:00:00 2001 From: Som Snytt Date: Mon, 3 Feb 2025 16:24:56 -0800 Subject: [PATCH] Don't warn retainedBody --- .../dotty/tools/dotc/transform/CheckUnused.scala | 3 ++- tests/warn/t22507.scala | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 tests/warn/t22507.scala diff --git a/compiler/src/dotty/tools/dotc/transform/CheckUnused.scala b/compiler/src/dotty/tools/dotc/transform/CheckUnused.scala index 22d91b929df5..0a1058782447 100644 --- a/compiler/src/dotty/tools/dotc/transform/CheckUnused.scala +++ b/compiler/src/dotty/tools/dotc/transform/CheckUnused.scala @@ -8,7 +8,7 @@ import dotty.tools.dotc.core.Contexts.* import dotty.tools.dotc.core.Flags.* import dotty.tools.dotc.core.Names.{Name, SimpleName, DerivedName, TermName, termName} import dotty.tools.dotc.core.NameOps.{isAnonymousFunctionName, isReplWrapperName} -import dotty.tools.dotc.core.NameKinds.{ContextBoundParamName, ContextFunctionParamName, WildcardParamName} +import dotty.tools.dotc.core.NameKinds.{BodyRetainerName, ContextBoundParamName, ContextFunctionParamName, WildcardParamName} import dotty.tools.dotc.core.StdNames.nme import dotty.tools.dotc.core.Symbols.{ClassSymbol, NoSymbol, Symbol, defn, isDeprecated, requiredClass, requiredModule} import dotty.tools.dotc.core.Types.* @@ -511,6 +511,7 @@ object CheckUnused: if ctx.settings.WunusedHas.privates && !sym.isPrimaryConstructor && sym.is(Private, butNot = SelfName | Synthetic | CaseAccessor) + && !sym.name.is(BodyRetainerName) && !sym.isSerializationSupport && !(sym.is(Mutable) && sym.isSetter && sym.owner.is(Trait)) // tracks sym.underlyingSymbol sibling getter then diff --git a/tests/warn/t22507.scala b/tests/warn/t22507.scala new file mode 100644 index 000000000000..76ae9a2b9a8b --- /dev/null +++ b/tests/warn/t22507.scala @@ -0,0 +1,14 @@ + +//> using options -Werror -Wunused:privates + +case class BinaryFen(value: Array[Byte]) extends AnyVal: + + def read: Unit = + val reader = new Iterator[Byte]: + val inner = value.iterator + override inline def hasNext: Boolean = inner.hasNext // nowarn + override inline def next: Byte = if hasNext then inner.next else 0.toByte // nowarn + + if reader.hasNext then + val b: Byte = reader.next + println(b)