@@ -568,7 +568,7 @@ object CheckUnused:
568
568
// A class param is unused if its param accessor is unused.
569
569
// (The class param is not assigned to a field until constructors.)
570
570
// A local param accessor warns as a param; a private accessor as a private member.
571
- // Avoid warning for case class elements because they are aliased via unapply.
571
+ // Avoid warning for case class elements because they are aliased via unapply (i.e. may be extracted) .
572
572
if m.isPrimaryConstructor then
573
573
val alias = m.owner.info.member(sym.name)
574
574
if alias.exists then
@@ -589,6 +589,7 @@ object CheckUnused:
589
589
)
590
590
&& ! sym.name.isInstanceOf [DerivedName ]
591
591
&& ! ctx.platform.isMainMethod(m)
592
+ && ! usedByDefaultGetter(sym, m)
592
593
then
593
594
warnAt(pos)(UnusedSymbol .explicitParams(sym))
594
595
end checkExplicit
@@ -600,6 +601,16 @@ object CheckUnused:
600
601
checkExplicit()
601
602
end checkParam
602
603
604
+ // does the param have an alias in a default arg method that is used?
605
+ def usedByDefaultGetter (param : Symbol , meth : Symbol ): Boolean =
606
+ val cls = meth.enclosingClass
607
+ val MethName = meth.name
608
+ cls.info.decls.exists: d =>
609
+ d.name match
610
+ case DefaultGetterName (MethName , _) =>
611
+ d.paramSymss.exists(_.exists(p => p.name == param.name && infos.refs(p)))
612
+ case _ => false
613
+
603
614
def checkImplicit (sym : Symbol , pos : SrcPos ) =
604
615
val m = sym.owner
605
616
def allowed =
@@ -631,7 +642,7 @@ object CheckUnused:
631
642
|| aliasSym.isAllOf(Protected | ParamAccessor , butNot = CaseAccessor ) && m.owner.is(Given )
632
643
if checking && ! infos.refs(alias.symbol) then
633
644
warnAt(pos)(UnusedSymbol .implicitParams(aliasSym))
634
- else
645
+ else if ! usedByDefaultGetter(sym, m) then
635
646
warnAt(pos)(UnusedSymbol .implicitParams(sym))
636
647
637
648
def checkLocal (sym : Symbol , pos : SrcPos ) =
0 commit comments