Skip to content

Commit 3ade37d

Browse files
committed
Check if class param was used in default arg getter
1 parent 2dc97d9 commit 3ade37d

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
@@ -539,7 +539,10 @@ object CheckUnused:
539539
val alias = m.owner.info.member(sym.name)
540540
if alias.exists then
541541
val aliasSym = alias.symbol
542-
if aliasSym.isAllOf(PrivateParamAccessor, butNot = CaseAccessor) && !infos.refs(alias.symbol) then
542+
if aliasSym.isAllOf(PrivateParamAccessor, butNot = CaseAccessor)
543+
&& !infos.refs(alias.symbol)
544+
&& !usedByDefaultGetter(sym, m)
545+
then
543546
if aliasSym.is(Local) then
544547
if ctx.settings.WunusedHas.explicits then
545548
warnAt(pos)(UnusedSymbol.explicitParams(aliasSym))
@@ -569,7 +572,7 @@ object CheckUnused:
569572

570573
// does the param have an alias in a default arg method that is used?
571574
def usedByDefaultGetter(param: Symbol, meth: Symbol): Boolean =
572-
val cls = meth.enclosingClass
575+
val cls = if meth.isPrimaryConstructor then meth.enclosingClass.companionModule else meth.enclosingClass
573576
val MethName = meth.name
574577
cls.info.decls.exists: d =>
575578
d.name match
@@ -606,7 +609,10 @@ object CheckUnused:
606609
val checking =
607610
aliasSym.isAllOf(PrivateParamAccessor, butNot = CaseAccessor)
608611
|| aliasSym.isAllOf(Protected | ParamAccessor, butNot = CaseAccessor) && m.owner.is(Given)
609-
if checking && !infos.refs(alias.symbol) then
612+
if checking
613+
&& !infos.refs(alias.symbol)
614+
&& !usedByDefaultGetter(sym, m)
615+
then
610616
warnAt(pos)(UnusedSymbol.implicitParams(aliasSym))
611617
else if !usedByDefaultGetter(sym, m) then
612618
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)