diff --git a/compiler/src/dotty/tools/dotc/ast/Desugar.scala b/compiler/src/dotty/tools/dotc/ast/Desugar.scala index 2f937946cc71..d356d1039ece 100644 --- a/compiler/src/dotty/tools/dotc/ast/Desugar.scala +++ b/compiler/src/dotty/tools/dotc/ast/Desugar.scala @@ -431,9 +431,9 @@ object desugar { lazy val creatorExpr = New(classTypeRef, constrVparamss nestedMap refOfDef) // Methods to add to a case class C[..](p1: T1, ..., pN: Tn)(moreParams) - // def _1 = this.p1 + // def _1: T1 = this.p1 // ... - // def _N = this.pN + // def _N: TN = this.pN // def copy(p1: T1 = p1: @uncheckedVariance, ..., // pN: TN = pN: @uncheckedVariance)(moreParams) = // new C[...](p1, ..., pN)(moreParams) @@ -442,12 +442,13 @@ object desugar { // neg/t1843-variances.scala for a test case. The test would give // two errors without @uncheckedVariance, one of them spurious. val caseClassMeths = { - def syntheticProperty(name: TermName, rhs: Tree) = - DefDef(name, Nil, Nil, TypeTree(), rhs).withMods(synthetic) + def syntheticProperty(name: TermName, tpt: Tree, rhs: Tree) = + DefDef(name, Nil, Nil, tpt, rhs).withMods(synthetic) def productElemMeths = { - val caseParams = constrVparamss.head.toArray + val caseParams = derivedVparamss.head.toArray for (i <- 0 until arity if nme.selectorName(i) `ne` caseParams(i).name) - yield syntheticProperty(nme.selectorName(i), Select(This(EmptyTypeIdent), caseParams(i).name)) + yield syntheticProperty(nme.selectorName(i), caseParams(i).tpt, + Select(This(EmptyTypeIdent), caseParams(i).name)) } def enumTagMeths = if (isEnumCase) enumTagMeth(CaseKind.Class)._1 :: Nil else Nil def copyMeths = { diff --git a/tests/neg/t1843-variances.scala b/tests/neg/t1843-variances.scala index 65e3addf0b34..a6bdd686feec 100644 --- a/tests/neg/t1843-variances.scala +++ b/tests/neg/t1843-variances.scala @@ -6,7 +6,7 @@ object Crash { trait UpdateType[A] - case class StateUpdate[+A](updateType : UpdateType[A], value : A) // error // error + case class StateUpdate[+A](updateType : UpdateType[A], value : A) // error case object IntegerUpdateType extends UpdateType[Integer] //However this method will cause a crash diff --git a/tests/pos/case-getters.scala b/tests/pos/case-getters.scala new file mode 100644 index 000000000000..e79267c7e9c0 --- /dev/null +++ b/tests/pos/case-getters.scala @@ -0,0 +1,8 @@ +case class Foo(x: 1, y: implicit Int => Int) +object Test { + val f = Foo(1, implicit (i: Int) => i) + val fx1: 1 = f.x + val fx2: 1 = f._1 + val fy1: Int = f.y(1) + val fy2: Int = f._2(1) +}