From e3bad2efa3abf4884e07c6222f5d152e18c64b2d Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 22 Feb 2017 16:15:30 +0100 Subject: [PATCH] Fix #2020: Only the first parameters of a case class are caseaccessors Only the parameters in the first parameter list of a case class should get the `CaseAccessor` flag. Fixes #2020. --- compiler/src/dotty/tools/dotc/ast/Desugar.scala | 8 +++++++- tests/run/i2020.scala | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 tests/run/i2020.scala diff --git a/compiler/src/dotty/tools/dotc/ast/Desugar.scala b/compiler/src/dotty/tools/dotc/ast/Desugar.scala index deb2391432f2..b5be894402fa 100644 --- a/compiler/src/dotty/tools/dotc/ast/Desugar.scala +++ b/compiler/src/dotty/tools/dotc/ast/Desugar.scala @@ -469,7 +469,13 @@ object desugar { val originalVparams = constr1.vparamss.toIterator.flatten val tparamAccessors = derivedTparams.map(_.withMods(originalTparams.next.mods)) val caseAccessor = if (isCaseClass) CaseAccessor else EmptyFlags - val vparamAccessors = derivedVparamss.flatten.map(_.withMods(originalVparams.next.mods | caseAccessor)) + val vparamAccessors = derivedVparamss match { + case first :: rest => + first.map(_.withMods(originalVparams.next.mods | caseAccessor)) ++ + rest.flatten.map(_.withMods(originalVparams.next.mods)) + case _ => + Nil + } cpy.TypeDef(cdef)( name = className, rhs = cpy.Template(impl)(constr, parents1, self1, diff --git a/tests/run/i2020.scala b/tests/run/i2020.scala new file mode 100644 index 000000000000..78794a59001a --- /dev/null +++ b/tests/run/i2020.scala @@ -0,0 +1,8 @@ +object Test { + + case class Foo(x: Int)(y: Int) + + def main(args: Array[String]) = + assert(Foo(1)(1) == Foo(1)(2)) + +}