@@ -534,7 +534,7 @@ object CheckUnused:
534534 // A class param is unused if its param accessor is unused.
535535 // (The class param is not assigned to a field until constructors.)
536536 // A local param accessor warns as a param; a private accessor as a private member.
537- // Avoid warning for case class elements because they are aliased via unapply.
537+ // Avoid warning for case class elements because they are aliased via unapply (i.e. may be extracted) .
538538 if m.isPrimaryConstructor then
539539 val alias = m.owner.info.member(sym.name)
540540 if alias.exists then
@@ -555,6 +555,7 @@ object CheckUnused:
555555 )
556556 && ! sym.name.isInstanceOf [DerivedName ]
557557 && ! ctx.platform.isMainMethod(m)
558+ && ! usedByDefaultGetter(sym, m)
558559 then
559560 warnAt(pos)(UnusedSymbol .explicitParams(sym))
560561 end checkExplicit
@@ -566,6 +567,16 @@ object CheckUnused:
566567 checkExplicit()
567568 end checkParam
568569
570+ // does the param have an alias in a default arg method that is used?
571+ def usedByDefaultGetter (param : Symbol , meth : Symbol ): Boolean =
572+ val cls = meth.enclosingClass
573+ val MethName = meth.name
574+ cls.info.decls.exists: d =>
575+ d.name match
576+ case DefaultGetterName (MethName , _) =>
577+ d.paramSymss.exists(_.exists(p => p.name == param.name && infos.refs(p)))
578+ case _ => false
579+
569580 def checkImplicit (sym : Symbol , pos : SrcPos ) =
570581 val m = sym.owner
571582 def allowed =
@@ -597,7 +608,7 @@ object CheckUnused:
597608 || aliasSym.isAllOf(Protected | ParamAccessor , butNot = CaseAccessor ) && m.owner.is(Given )
598609 if checking && ! infos.refs(alias.symbol) then
599610 warnAt(pos)(UnusedSymbol .implicitParams(aliasSym))
600- else
611+ else if ! usedByDefaultGetter(sym, m) then
601612 warnAt(pos)(UnusedSymbol .implicitParams(sym))
602613
603614 def checkLocal (sym : Symbol , pos : SrcPos ) =
0 commit comments