Skip to content

Very slow compile time involving path-dependent types  #15525

Closed
@pweisenburger

Description

@pweisenburger

Compiler version

3.1.2

Minimized code

Given the minimized code:

class /[D, T]
class Delegating[D]

type Aux[E] = Container { type Elements = E }

class Container:
  type Elements = Delegating[Delegates]
  type Delegates

class Resolution[E](value: Aux[E]):
  type Type = Aux[E]

The following code compiles almost instantly (which is expected):

def element0: Container { type Delegates = Unit } = ???

def element16(
    transmittable0: Resolution[?], transmittable1: Resolution[?],
    transmittable2: Resolution[?], transmittable3: Resolution[?],
    transmittable4: Resolution[?], transmittable5: Resolution[?],
    transmittable6: Resolution[?], transmittable7: Resolution[?],
    transmittable8: Resolution[?], transmittable9: Resolution[?],
    transmittable10: Resolution[?], transmittable11: Resolution[?],
    transmittable12: Resolution[?], transmittable13: Resolution[?],
    transmittable14: Resolution[?], transmittable15: Resolution[?])
: Container {
    type Delegates =
      transmittable0.Type / transmittable1.Type /
      transmittable2.Type / transmittable3.Type /
      transmittable4.Type / transmittable5.Type /
      transmittable6.Type / transmittable7.Type /
      transmittable8.Type / transmittable9.Type /
      transmittable10.Type / transmittable11.Type /
      transmittable12.Type / transmittable13.Type /
      transmittable14.Type / transmittable15.Type
  } = ???

def test16 =
  Resolution(
    element16(
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0)))

But the following example, which is just a slightly bigger version of the previous example (22 instead of 16 parameters), takes 10+ seconds to compile on my machine:

def element22(
    transmittable0: Resolution[?], transmittable1: Resolution[?],
    transmittable2: Resolution[?], transmittable3: Resolution[?],
    transmittable4: Resolution[?], transmittable5: Resolution[?],
    transmittable6: Resolution[?], transmittable7: Resolution[?],
    transmittable8: Resolution[?], transmittable9: Resolution[?],
    transmittable10: Resolution[?], transmittable11: Resolution[?],
    transmittable12: Resolution[?], transmittable13: Resolution[?],
    transmittable14: Resolution[?], transmittable15: Resolution[?],
    transmittable16: Resolution[?], transmittable17: Resolution[?],
    transmittable18: Resolution[?], transmittable19: Resolution[?],
    transmittable20: Resolution[?], transmittable21: Resolution[?])
: Container {
    type Delegates =
      transmittable0.Type / transmittable1.Type /
      transmittable2.Type / transmittable3.Type /
      transmittable4.Type / transmittable5.Type /
      transmittable6.Type / transmittable7.Type /
      transmittable8.Type / transmittable9.Type /
      transmittable10.Type / transmittable11.Type /
      transmittable12.Type / transmittable13.Type /
      transmittable14.Type / transmittable15.Type /
      transmittable16.Type / transmittable17.Type /
      transmittable18.Type / transmittable19.Type /
      transmittable20.Type / transmittable21.Type
  } = ???

def test22 =
  Resolution(
    element22(
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0),
      Resolution(element0), Resolution(element0)))

My “real” (not minimized code) has a few more parameters and takes ages to compile (did not finish yet after a several minutes), which makes me think that code in this shape maybe triggers some kind of exponential explosion in the type checker.

Expectation

Scala 2.13 compiles the code instantly. The expectation would be the same for Scala 3.

Note

FYI, I found #14224, which may or may not have the same root cause.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions