Skip to content

Duplicate pattern variable on generated variables #4030

Closed
@Blaisorblade

Description

@Blaisorblade

Pattern matches have to be linear in type variables. But apparently Dotty demands the same in generated type variables as well, at least if they come from a single type variable.

Sample code:

sealed trait Root[T]
case object C1 extends Root[Int]
case object C2 extends Root[String]
//case class C3[X, Y]() extends Root[X|Y|(X => X)]
case class C3[X, Y]() extends Root[(X => X)|(Y => Y)|(X => Y)]
case class C4[X, Y]() extends Root[(X => X)|(Y => Y)|(X => Y)]

object TestGADT {
  //type Foo // abstract

  def f[A <: Seq[_], B, Foo >: A => B](v: Root[Foo], u: Root[Foo]) = (v, u) match {
    //case C1 =>
    //case C2 =>
    case (C3(), C3()) =>
  }
  //f(C3[Int, Int]())
  //implicitly[Int <:< Int|(Int => Int)]
  //implicitly[(Int => Int) <:< String|(Int => Int)]//($conforms[Int => Int])
  //f[Int, Int, Int|(Int => Int)](C3[Int, Int]())
  //f(C3[Int, Int]())
  f(C3[Seq[_], Long](), C4[Seq[_], Long]())
}

Error (with -explain, on commit 4149833):

-- [E005] Naming Error: /Users/pgiarrusso/git/dotty/tests/IterableTest.scala:157:12
157 |    case (C3(), C3()) =>
    |            ^
    |            duplicate pattern variable: `_$6`

Explanation
===========
For each case bound variable names have to be unique. In:

case (C3(), C3()) =>

`_$6` is not unique. Rename one of the bound variables!

one error found

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions