Skip to content

Commit 363654c

Browse files
som-snytttgodzik
authored andcommitted
Check if class param was used in default arg getter
[Cherry-picked c02dea2]
1 parent 1ea615f commit 363654c

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
@@ -573,7 +573,10 @@ object CheckUnused:
573573
val alias = m.owner.info.member(sym.name)
574574
if alias.exists then
575575
val aliasSym = alias.symbol
576-
if aliasSym.isAllOf(PrivateParamAccessor, butNot = CaseAccessor) && !infos.refs(alias.symbol) then
576+
if aliasSym.isAllOf(PrivateParamAccessor, butNot = CaseAccessor)
577+
&& !infos.refs(alias.symbol)
578+
&& !usedByDefaultGetter(sym, m)
579+
then
577580
if aliasSym.is(Local) then
578581
if ctx.settings.WunusedHas.explicits then
579582
warnAt(pos)(UnusedSymbol.explicitParams(aliasSym))
@@ -603,7 +606,7 @@ object CheckUnused:
603606

604607
// does the param have an alias in a default arg method that is used?
605608
def usedByDefaultGetter(param: Symbol, meth: Symbol): Boolean =
606-
val cls = meth.enclosingClass
609+
val cls = if meth.isPrimaryConstructor then meth.enclosingClass.companionModule else meth.enclosingClass
607610
val MethName = meth.name
608611
cls.info.decls.exists: d =>
609612
d.name match
@@ -640,7 +643,10 @@ object CheckUnused:
640643
val checking =
641644
aliasSym.isAllOf(PrivateParamAccessor, butNot = CaseAccessor)
642645
|| aliasSym.isAllOf(Protected | ParamAccessor, butNot = CaseAccessor) && m.owner.is(Given)
643-
if checking && !infos.refs(alias.symbol) then
646+
if checking
647+
&& !infos.refs(alias.symbol)
648+
&& !usedByDefaultGetter(sym, m)
649+
then
644650
warnAt(pos)(UnusedSymbol.implicitParams(aliasSym))
645651
else if !usedByDefaultGetter(sym, m) then
646652
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)