diff --git a/compiler/src/dotty/tools/dotc/transform/SyntheticMembers.scala b/compiler/src/dotty/tools/dotc/transform/SyntheticMembers.scala index 21a88ec50e76..d964e5a6c585 100644 --- a/compiler/src/dotty/tools/dotc/transform/SyntheticMembers.scala +++ b/compiler/src/dotty/tools/dotc/transform/SyntheticMembers.scala @@ -174,7 +174,8 @@ class SyntheticMembers(thisPhase: DenotTransformer) { def productElementBody(arity: Int, index: Tree)(using Context): Tree = { // case N => _${N + 1} val cases = 0.until(arity).map { i => - CaseDef(Literal(Constant(i)), EmptyTree, Select(This(clazz), nme.selectorName(i))) + val sel = This(clazz).select(nme.selectorName(i), _.info.isParameterless) + CaseDef(Literal(Constant(i)), EmptyTree, sel) } Match(index, (cases :+ generateIOBECase(index)).toList) diff --git a/tests/pos/i11725.scala b/tests/pos/i11725.scala new file mode 100644 index 000000000000..1b1b61aafdc3 --- /dev/null +++ b/tests/pos/i11725.scala @@ -0,0 +1,17 @@ +sealed trait Expr[+A] extends ExprTuple[A] + +case class Lit[A](value: A) extends Expr[A] + +trait ExprTuple[+A] { + def _1(implicit ev: ExprTuple.Has2[A]): Expr[ev._1] = ??? + def _2(implicit ev: ExprTuple.Has2[A]): Expr[ev._2] = ??? +} + +object ExprTuple { + trait Has2[-A] { type _1; type _2 } + object Has2 { + type Aux[-A, A1, A2] = Has2[A] { type _1 = A1; type _2 = A2 } + } + + implicit def tuple2[A, B]: Has2.Aux[(A, B), A, B] = ??? +} \ No newline at end of file