Skip to content

Compiler loops when compiling a pattern match with a large number of patterns #12241

Closed
@adamw

Description

@adamw

Compiler version

3.0.0-RC3

Minimized code

That's as far as I've been able to minimize. Removing some of the cases, or matching against a single EndpointInput, not a tuple, makes the code compile.

I suspect it's a loop, as I can wait for a couple of minutes and compilation doesn't complete, CPU usage is high.

I'm running compilation through sbt.

sealed trait EndpointInput[T]

object EndpointInput {
  case class Pair[T]() extends EndpointInput[T]
  case class MappedPair[T]() extends EndpointInput[T]
  case class Pair2[T]() extends EndpointInput[T]
  case class MappedPair2[T]() extends EndpointInput[T]
  case class FixedMethod[T]() extends EndpointInput[T]
  case class FixedPath[T]() extends EndpointInput[T]
  case class PathCapture[T]() extends EndpointInput[T]
  case class PathsCapture[T]() extends EndpointInput[T]
  case class Query[T]() extends EndpointInput[T]
  case class QueryParams[T]() extends EndpointInput[T]
  case class Cookie[T]() extends EndpointInput[T]
  case class ExtractFromRequest[T]() extends EndpointInput[T]
  case class ApiKey[T]() extends EndpointInput[T]
  case class Http[T]() extends EndpointInput[T]
  case class Body[R, T]() extends EndpointInput[T]
  case class FixedHeader[T]() extends EndpointInput[T]
  case class Header[T]() extends EndpointInput[T]
  case class Headers[T]() extends EndpointInput[T]
  case class StatusCode[T]() extends EndpointInput[T]
  case class Empty[T]() extends EndpointInput[T]
}

object Test extends App {
  import EndpointInput._

  def compare(left: EndpointInput[_], right: EndpointInput[_]): Boolean =
    (left, right) match {
      case (Pair(), Pair()) => true
      case (MappedPair(), MappedPair()) => true
      case (Pair2(), Pair2()) => true
      case (MappedPair2(), MappedPair2()) => true
      case (FixedMethod(), FixedMethod()) => true
      case (FixedPath(), FixedPath()) => true
      case (PathCapture(), PathCapture()) => true
      case (PathsCapture(), PathsCapture()) => true
      case (Query(), Query()) => true
      case (QueryParams(), QueryParams()) => true
      case (Cookie(), Cookie()) => true
      case (ExtractFromRequest(), ExtractFromRequest()) => true
      case (ApiKey(), ApiKey()) => true
      case (Http(), Http()) => true
      case (Body(), Body()) => true
      case (FixedHeader(), FixedHeader()) => true
      case (Header(), Header()) => true
      case (Headers(), Headers()) => true
      case (StatusCode(), StatusCode()) => true
      case (_, _) => false
    }
}

Output

Fragment of the stack trace: https://gist.github.com/adamw/d06722ab6826aad108beca979065a90b

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions