@@ -530,7 +530,7 @@ object CheckUnused:
530530 // A class param is unused if its param accessor is unused.
531531 // (The class param is not assigned to a field until constructors.)
532532 // A local param accessor warns as a param; a private accessor as a private member.
533- // Avoid warning for case class elements because they are aliased via unapply.
533+ // Avoid warning for case class elements because they are aliased via unapply (i.e. may be extracted) .
534534 if m.isPrimaryConstructor then
535535 val alias = m.owner.info.member(sym.name)
536536 if alias.exists then
@@ -551,6 +551,7 @@ object CheckUnused:
551551 )
552552 && ! sym.name.isInstanceOf [DerivedName ]
553553 && ! ctx.platform.isMainMethod(m)
554+ && ! usedByDefaultGetter(sym, m)
554555 then
555556 warnAt(pos)(UnusedSymbol .explicitParams(sym))
556557 end checkExplicit
@@ -562,6 +563,16 @@ object CheckUnused:
562563 checkExplicit()
563564 end checkParam
564565
566+ // does the param have an alias in a default arg method that is used?
567+ def usedByDefaultGetter (param : Symbol , meth : Symbol ): Boolean =
568+ val cls = meth.enclosingClass
569+ val MethName = meth.name
570+ cls.info.decls.exists: d =>
571+ d.name match
572+ case DefaultGetterName (MethName , _) =>
573+ d.paramSymss.exists(_.exists(p => p.name == param.name && infos.refs(p)))
574+ case _ => false
575+
565576 def checkImplicit (sym : Symbol , pos : SrcPos ) =
566577 val m = sym.owner
567578 def allowed =
@@ -593,7 +604,7 @@ object CheckUnused:
593604 || aliasSym.isAllOf(Protected | ParamAccessor , butNot = CaseAccessor ) && m.owner.is(Given )
594605 if checking && ! infos.refs(alias.symbol) then
595606 warnAt(pos)(UnusedSymbol .implicitParams(aliasSym))
596- else
607+ else if ! usedByDefaultGetter(sym, m) then
597608 warnAt(pos)(UnusedSymbol .implicitParams(sym))
598609
599610 def checkLocal (sym : Symbol , pos : SrcPos ) =
0 commit comments