Skip to content

Commit 9e1b2f3

Browse files
Merge pull request #9218 from dotty-staging/fix-#9068
Fix #9068: Don't duplicate _N selectors
2 parents 900025b + d17bbcb commit 9e1b2f3

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -559,9 +559,9 @@ object desugar {
559559
val copiedAccessFlags = if migrateTo3 then EmptyFlags else AccessFlags
560560

561561
// Methods to add to a case class C[..](p1: T1, ..., pN: Tn)(moreParams)
562-
// def _1: T1 = this.p1
562+
// def _1: T1 = this.p1
563563
// ...
564-
// def _N: TN = this.pN
564+
// def _N: TN = this.pN (unless already given as valdef or parameterless defdef)
565565
// def copy(p1: T1 = p1: @uncheckedVariance, ...,
566566
// pN: TN = pN: @uncheckedVariance)(moreParams) =
567567
// new C[...](p1, ..., pN)(moreParams)
@@ -572,12 +572,21 @@ object desugar {
572572
val caseClassMeths = {
573573
def syntheticProperty(name: TermName, tpt: Tree, rhs: Tree) =
574574
DefDef(name, Nil, Nil, tpt, rhs).withMods(synthetic)
575-
def productElemMeths = {
575+
576+
def productElemMeths =
576577
val caseParams = derivedVparamss.head.toArray
577-
for (i <- List.range(0, arity) if nme.selectorName(i) `ne` caseParams(i).name)
578-
yield syntheticProperty(nme.selectorName(i), caseParams(i).tpt,
578+
val selectorNamesInBody = normalizedBody.collect {
579+
case vdef: ValDef if vdef.name.isSelectorName =>
580+
vdef.name
581+
case ddef: DefDef if ddef.name.isSelectorName && ddef.tparams.isEmpty && ddef.vparamss.isEmpty =>
582+
ddef.name
583+
}
584+
for i <- List.range(0, arity)
585+
selName = nme.selectorName(i)
586+
if (selName ne caseParams(i).name) && !selectorNamesInBody.contains(selName)
587+
yield syntheticProperty(selName, caseParams(i).tpt,
579588
Select(This(EmptyTypeIdent), caseParams(i).name))
580-
}
589+
581590
def ordinalMeths = if (isEnumCase) ordinalMethLit(nextOrdinal(CaseKind.Class)._1) :: Nil else Nil
582591
def copyMeths = {
583592
val hasRepeatedParam = constrVparamss.exists(_.exists {

tests/run/i9068.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
case class MyClass(v1: Int, v2: Int, v3: Int, v4: Int) extends Product3[Int, Int, Int]:
2+
val _1: Int = v2
3+
def _2: Int = v3
4+
var _3: Int = v4
5+
def _4(x: Boolean): Int = 0
6+
7+
@main def Test =
8+
val c = MyClass(1, 2, 3, 4)
9+
assert(c._1 == 2)
10+
assert(c._2 == 3)
11+
assert(c._3 == 4)
12+
assert(c._4 == 4)

0 commit comments

Comments
 (0)