@@ -530,7 +530,7 @@ object CheckUnused:
530
530
// A class param is unused if its param accessor is unused.
531
531
// (The class param is not assigned to a field until constructors.)
532
532
// 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) .
534
534
if m.isPrimaryConstructor then
535
535
val alias = m.owner.info.member(sym.name)
536
536
if alias.exists then
@@ -551,6 +551,7 @@ object CheckUnused:
551
551
)
552
552
&& ! sym.name.isInstanceOf [DerivedName ]
553
553
&& ! ctx.platform.isMainMethod(m)
554
+ && ! usedByDefaultGetter(sym, m)
554
555
then
555
556
warnAt(pos)(UnusedSymbol .explicitParams(sym))
556
557
end checkExplicit
@@ -562,6 +563,16 @@ object CheckUnused:
562
563
checkExplicit()
563
564
end checkParam
564
565
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
+
565
576
def checkImplicit (sym : Symbol , pos : SrcPos ) =
566
577
val m = sym.owner
567
578
def allowed =
@@ -593,7 +604,7 @@ object CheckUnused:
593
604
|| aliasSym.isAllOf(Protected | ParamAccessor , butNot = CaseAccessor ) && m.owner.is(Given )
594
605
if checking && ! infos.refs(alias.symbol) then
595
606
warnAt(pos)(UnusedSymbol .implicitParams(aliasSym))
596
- else
607
+ else if ! usedByDefaultGetter(sym, m) then
597
608
warnAt(pos)(UnusedSymbol .implicitParams(sym))
598
609
599
610
def checkLocal (sym : Symbol , pos : SrcPos ) =
0 commit comments