Okay, I think I found the problem. In case of a lambda lifted function we weren't doing this part of cconv--convert-function: (dolist (arg args) (if (not (member (cons (list arg) parentform) cconv-captured+mutated)) (if (assq arg new-env) (push `(,arg) new-env)) (push `(,arg . (car-safe ,arg)) new-env) (push `(,arg (list ,arg)) letbind))) so `params' wasn't handled properly. I copied and adapted that code to the corresponding place in cconv-convert, and it seems to work. Please review for sanity.