Skip to content

Regression in 3.5: Infinite recursion during typecheck of polymorphic-recursion with match types #21015

Closed
@Odomontois

Description

@Odomontois

Compiler version

This code breaks compilation on 3.5.0-RC2 but works on 3.4.2

Minimized code

type Init[Coll[_], A, T <: Tuple] = T match
  case EmptyTuple   => A
  case head *: rest => InitCons[Coll, A, head, rest]

type InitCons[Coll[_], A, H, Rest <: Tuple] = H match
  case Int => Init[Coll, Coll[A], Rest]
  case _   => Unit

def fillVector[A, T <: Tuple](dims: T)(x: => A): Init[Vector, A, T] =
  dims match
    case _: EmptyTuple                => x
    case (p : (head *: rest)) =>
      val (head *: rest) = p
      head match
        case size: Int => fillVector(rest)(Vector.fill(size)(x))
        case _         => ()

Output

Recursion limit exceeded
If that's not the case, you could also try to increase the stacksize using the -Xss JVM option.
For the unprocessed stack trace, compile with -Xno-decode-stacktraces.
A recurring operation is (inner to outer):

  subtype Vector[A] <:< Vector[Vector[A]]
  subtype Vector[Vector[A]] <:< Vector[Vector[Vector[A]]]
  subtype Vector[Vector[Vector[A]]] <:< Vector[Vector[Vector[Vector[A]]]]
  subtype Vector[Vector[Vector[Vector[A]]]] <:< Vector[Vector[Vector[Vector[Vector[A]]]]]
  subtype Vector[Vector[Vector[Vector[Vector[A]]]]] <:< Vector[Vector[Vector[Vector[Vector[Vector[A]]]]]]
  subtype Vector[Vector[Vector[Vector[Vector[Vector[A]]]]]] <:< Vector[Vector[Vector[Vector[Vector[Vector[Vector[A]]]]]]]
  subtype Vector[Vector[Vector[Vector[Vector[Vector[Vector[A]]]]]]] <:< Vector[Vector[Vector[Vector[Vector[Vector[Vector[Vector[A]]]]]]]]
  subtype Vector[Vector[Vector[Vector[Vector[Vector[Vector[Vector[A]]]]]]]] <:< Vector[Vector[Vector[Vector[Vector[Vector[Vector[Vector[Vector[A]]]]]]]]]
  subtype Vector[Vector[Vector[Vector[Vector[Vector[Vector[Vector[Vector[A]]]]]]]]] <:< Vector[Vector[Vector[Vector[Vector[Vector[Vector[Vector[Vector[Vector[A]]]]]]]]]

Expectation

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions