@@ -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 {
0 commit comments