flix icon indicating copy to clipboard operation
flix copied to clipboard

Polymorphic recursion breaks monomorphization

Open JonathanStarup opened this issue 5 months ago • 6 comments

pub def main(): Bool = f(32, 12)

pub def f(x: t, n: Int32): Bool = {
    if (n == 0) true else f(x :: Nil, n - 1)
}
Exception in thread "ForkJoinPool-3-worker-7" java.lang.OutOfMemoryError: Java heap space
	at ca.uwaterloo.flix.language.ast.Type.map(Type.scala:167)
	at ca.uwaterloo.flix.language.ast.Type.map$(Type.scala:164)
	at ca.uwaterloo.flix.language.ast.Type$Apply.map(Type.scala:451)
	at ca.uwaterloo.flix.language.ast.Type.map(Type.scala:167)
	at ca.uwaterloo.flix.language.ast.Type.map$(Type.scala:164)
	at ca.uwaterloo.flix.language.ast.Type$Apply.map(Type.scala:451)
	at ca.uwaterloo.flix.language.ast.Type.map(Type.scala:167)
	at ca.uwaterloo.flix.language.ast.Type.map$(Type.scala:164)
	at ca.uwaterloo.flix.language.ast.Type$Apply.map(Type.scala:451)
	at ca.uwaterloo.flix.language.ast.Type.map(Type.scala:167)
	at ca.uwaterloo.flix.language.ast.Type.map$(Type.scala:164)
	at ca.uwaterloo.flix.language.ast.Type$Apply.map(Type.scala:451)
	at ca.uwaterloo.flix.language.ast.Type.map(Type.scala:167)
	at ca.uwaterloo.flix.language.ast.Type.map$(Type.scala:164)
	at ca.uwaterloo.flix.language.ast.Type$Apply.map(Type.scala:451)

Notice this can also happen through mutual recursion

pub def main(): Bool = f(32, 12)

pub def g(x: t, n: Int32): Bool = f(x, n)

pub def f(x: t, n: Int32): Bool = {
    if (n == 0) true else g(x :: Nil, n - 1)
}

JonathanStarup avatar Jan 31 '24 15:01 JonathanStarup