;; The same line drawn in return position, which is the half that is easy to ;; miss: a (Fn [] (Fn [] $t)) parameter handed a (CFn [] (CFn [] i32)) needs ;; the inner widening built by whatever calls the *argument*, and that is the ;; generic's own body, which was compiled against the parameter's type and not ;; against this caller's. (defn inner [] i32 3) (defn outer [] (CFn [] i32) inner) (defn call-twice [g (Fn [] (Fn [] $t))] $t ((g))) (defn main [] i32 (println (call-twice outer)) 0)