• Stefan Monnier's avatar
    Fix compilation error with simultaneous dynamic+lexical scoping. · 208d0342
    Stefan Monnier authored
    Add warning when a defvar appears after the first let-binding.
    * lisp/emacs-lisp/bytecomp.el (byte-compile-lexical-variables): New var.
    (byte-compile-close-variables): Initialize it.
    (byte-compile--declare-var): New function.
    (byte-compile-file-form-defvar)
    (byte-compile-file-form-define-abbrev-table)
    (byte-compile-file-form-custom-declare-variable): Use it.
    (byte-compile-make-lambda-lexenv): Change the argument.  Simplify.
    (byte-compile-lambda): Share call to byte-compile-arglist-vars.
    (byte-compile-bind): Handle dynamic bindings that shadow
    lexical bindings.
    (byte-compile-unbind): Make arg non-optional.
    (byte-compile-let): Simplify.
    * lisp/emacs-lisp/cconv.el (byte-compile-lexical-variables): Declare var.
    (cconv--analyse-function, cconv-analyse-form): Populate it.
    Protect byte-compile-bound-variables to limit the scope of defvars.
    (cconv-analyse-form): Add missing rule for (defvar <foo>).
    Remove unneeded rule for `declare'.
    
    * lisp/emacs-lisp/cl-macs.el (cl--compiler-macro-adjoin): Use macroexp-let2
    so as to avoid depending on cl-adjoin at run-time.
    * lisp/emacs-lisp/cl-lib.el (cl-pushnew): Use backquotes.
    
    * lisp/emacs-lisp/macroexp.el (macroexp--compiling-p): New function.
    (macroexp--warn-and-return): Use it.
    208d0342
cl-lib.el 27.3 KB