Skip to content

100 implicits eat heap and slow down error reporting #9160

Closed
@anatoliykmetyuk

Description

@anatoliykmetyuk
Self-contained example
package foo

object Test {
  type F[T]
  val F: F[Int] = ???

  def f[T](t: T)(
    e1: F[T], e2: F[T], e3: F[T],
    e4: F[T], e5: F[T], e6: F[T],
    e7: F[T], e8: F[T], e9: F[T],
    e10: F[T], e11: F[T], e12: F[T],
  ) = ???
  f("foo")(
    F, F, F,
    F, F, F,
    F, F, F,
    F, F, F,
  )
}


object x extends X1 with X2

trait X1 extends Implicits
trait X2 extends Implicits

trait Implicits {
  type F[T]
  type G[T]

  given g1 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g2 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g3 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g4 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g5 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g6 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g7 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g8 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g9 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g10 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g11 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g12 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g13 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g14 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g15 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g16 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g17 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g18 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g19 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g20 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g21 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g22 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g23 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g24 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g25 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g26 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g27 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g28 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g29 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g30 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g31 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g32 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g33 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g34 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g35 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g36 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g37 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g38 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g39 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g40 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g41 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g42 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g43 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g44 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g45 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g46 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g47 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g48 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g49 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g50 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g51 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g52 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g53 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g54 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g55 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g56 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g57 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g58 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g59 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g60 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g61 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g62 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g63 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g64 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g65 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g66 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g67 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g68 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g69 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g70 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g71 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g72 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g73 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g74 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g75 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g76 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g77 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g78 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g79 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g80 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g81 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g82 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g83 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g84 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g85 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g86 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g87 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g88 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g89 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g90 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g91 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g92 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g93 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g94 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g95 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g96 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g97 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g98 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g99 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
  given g100 [T1: F, T2: F, T3: F, T4: F, T5: F, T6: F, T7: F, T8: F, T9: F, T10: F, T11: F, T12: F, T13: F, T14: F, T15: F, T16: F, T17: F, T18: F, T19: F, T20: F, T21: F, T22: F] as G[Int] = ???
}

Output (12 times):

-- [E007] Type Mismatch Error: /Users/kmetiuk/Projects/scala3/playground/upickle-oome/src/Test.scala:14:4
14 |    F, F, F,
   |    ^
   |    Found:    (foo.Test.F : foo.Test.F[Int])
   |    Required: foo.Test.F[T]
   |
   |    where:    T is a type variable with constraint >: ("foo" : String)

The error is correct, the time and space that the compilation takes up are inadequate:

Screenshot 2020-06-11 at 12 33 51

The culprit seems to be dotty.tools.dotc.core.Types$CachedAppliedType:

Screenshot 2020-06-11 at 12 34 54

I discovered it originally in upickle where I was getting an OOME from it:

java.lang.OutOfMemoryError: Java heap space: Java heap space
    HashSet.allocate compiler/src/dotty/tools/dotc/util/HashSet.scala:23
    HashSet.growTable compiler/src/dotty/tools/dotc/util/HashSet.scala:152
    HashSet.addEntryAt compiler/src/dotty/tools/dotc/util/HashSet.scala:61
    HashSet.addEntryAfterScan compiler/src/dotty/tools/dotc/util/HashSet.scala:138
    Uniques$AppliedUniques.enterIfNew compiler/src/dotty/tools/dotc/core/Uniques.scala:92
    Types$AppliedType$.apply compiler/src/dotty/tools/dotc/core/Types.scala:3965
    TypeApplications$.appliedTo$extension compiler/src/dotty/tools/dotc/core/TypeApplications.scala:346
    Types$AppliedType.derivedAppliedType compiler/src/dotty/tools/dotc/core/Types.scala:3939
    Types$TypeMap.derivedAppliedType compiler/src/dotty/tools/dotc/core/Types.scala:4885
    Types$TypeMap.mapOver compiler/src/dotty/tools/dotc/core/Types.scala:4943
    Substituters.substParams compiler/src/dotty/tools/dotc/core/Substituters.scala:157
    Contexts$Context.substParams compiler/src/dotty/tools/dotc/core/Contexts.scala:78
    Substituters$SubstParamsMap.apply compiler/src/dotty/tools/dotc/core/Substituters.scala:193
    Substituters$SubstParamsMap.apply compiler/src/dotty/tools/dotc/core/Substituters.scala:193
    List.mapConserve scala-library-2.13.2.jar/scala/collection/immutable/List.scala:472
    Types$TypeMap.mapOverLambda$1 compiler/src/dotty/tools/dotc/core/Types.scala:4972
    Types$TypeMap.mapOver compiler/src/dotty/tools/dotc/core/Types.scala:4976
    Substituters.substParams compiler/src/dotty/tools/dotc/core/Substituters.scala:157
    Contexts$Context.substParams compiler/src/dotty/tools/dotc/core/Contexts.scala:78
    Substituters$SubstParamsMap.apply compiler/src/dotty/tools/dotc/core/Substituters.scala:193
    Types$TypeMap.mapOverLambda$1 compiler/src/dotty/tools/dotc/core/Types.scala:4974
    Types$TypeMap.mapOver compiler/src/dotty/tools/dotc/core/Types.scala:4976
    Substituters.substParams compiler/src/dotty/tools/dotc/core/Substituters.scala:157
    Contexts$Context.substParams compiler/src/dotty/tools/dotc/core/Contexts.scala:78
    Types$Type.substParams compiler/src/dotty/tools/dotc/core/Types.scala:1579
    Types$LambdaType.instantiate compiler/src/dotty/tools/dotc/core/Types.scala:3169
    Types$MethodOrPoly.instantiate compiler/src/dotty/tools/dotc/core/Types.scala:3204
    TypeAssigner.assignType compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala:367
    Typer.assignType compiler/src/dotty/tools/dotc/typer/Typer.scala:84
    tpd$.TypeApply compiler/src/dotty/tools/dotc/ast/tpd.scala:51
    tpd$TreeOps$.appliedToTypeTrees$extension compiler/src/dotty/tools/dotc/ast/tpd.scala:932
    Typer.adapt1 compiler/src/dotty/tools/dotc/typer/Typer.scala:3481

It seems something to do with applied types being generated in excessive quantities. In this self-contained example, I was not able to get an OOME but I was able to grow the heap to the maximal size. Probably doesn't take much to tip the compiler to OOME beyond that.

What I discovered influences dotty.tools.dotc.core.Types$CachedAppliedType count and compilation times:

  1. Number of F[T] parameters to the f function – linear growth of object count
  2. Number of implicits in Implicits: increase from 30 to 60 gave 4 times more objects
  3. Number of traits x inherits from: with 1 or less X* trait, the slowdown disappears completely. 2 is the minimal number to reproduce the slowdown. Increasing the traits number seems to further increase time and heap usage.
  4. Inheritance depth: if X* do not directly inherit from Implicits but via other traits (e.g. X1 <: A1 <: B1 <: ... <: Implicits instead of X1 <: Implicits), this also seems to increase the time and space usage.
  5. The number of type parameters to the implicits must be big enough but I did not notice a significant time-space increase beyond 22.
  6. If you comment out object x, the behavior disappears.
  7. If you comment out package foo, the behavior disappears. You can bring object x under object Test for the behavior to reappear, however, it seems it is a bit weaker that way.
  8. The type parameters to the implicits must have context bounds – without the context bounds, the behavior disappears.

The described scenario can be encountered in practice e.g. when generating typeclasses for tuples. You can easily end up with a few dozen synthetic implicits that way, as was done in upickle.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions