Skip to content

Commit c02dea2

Browse files
committed
Check if class param was used in default arg getter
1 parent 0cbe43b commit c02dea2

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

compiler/src/dotty/tools/dotc/transform/CheckUnused.scala

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,10 @@ object CheckUnused:
535535
val alias = m.owner.info.member(sym.name)
536536
if alias.exists then
537537
val aliasSym = alias.symbol
538-
if aliasSym.isAllOf(PrivateParamAccessor, butNot = CaseAccessor) && !infos.refs(alias.symbol) then
538+
if aliasSym.isAllOf(PrivateParamAccessor, butNot = CaseAccessor)
539+
&& !infos.refs(alias.symbol)
540+
&& !usedByDefaultGetter(sym, m)
541+
then
539542
if aliasSym.is(Local) then
540543
if ctx.settings.WunusedHas.explicits then
541544
warnAt(pos)(UnusedSymbol.explicitParams(aliasSym))
@@ -565,7 +568,7 @@ object CheckUnused:
565568

566569
// does the param have an alias in a default arg method that is used?
567570
def usedByDefaultGetter(param: Symbol, meth: Symbol): Boolean =
568-
val cls = meth.enclosingClass
571+
val cls = if meth.isPrimaryConstructor then meth.enclosingClass.companionModule else meth.enclosingClass
569572
val MethName = meth.name
570573
cls.info.decls.exists: d =>
571574
d.name match
@@ -602,7 +605,10 @@ object CheckUnused:
602605
val checking =
603606
aliasSym.isAllOf(PrivateParamAccessor, butNot = CaseAccessor)
604607
|| aliasSym.isAllOf(Protected | ParamAccessor, butNot = CaseAccessor) && m.owner.is(Given)
605-
if checking && !infos.refs(alias.symbol) then
608+
if checking
609+
&& !infos.refs(alias.symbol)
610+
&& !usedByDefaultGetter(sym, m)
611+
then
606612
warnAt(pos)(UnusedSymbol.implicitParams(aliasSym))
607613
else if !usedByDefaultGetter(sym, m) then
608614
warnAt(pos)(UnusedSymbol.implicitParams(sym))

tests/warn/i23349.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,9 @@ class C:
1818
def copyFoo(foo: Foo, bar: String)(a: String = foo.a, b: Int = foo.b)(c: String = bar): Foo = Foo(a, b) // warn c
1919
def copyUsing(using foo: Foo, bar: String)(a: String = foo.a, b: Int = foo.b)(c: String = bar): Foo = // warn c
2020
Foo(a, b)
21+
22+
class K(k: Int)(s: String = "*"*k):
23+
override val toString = s
24+
25+
class KU(using k: Int)(s: String = "*"*k):
26+
override val toString = s

0 commit comments

Comments
 (0)