From c43a861814c2cbe65c67d0bfa5523b50eba1419f Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 22 Jul 2013 13:24:31 -0400 Subject: [PATCH] * lisp/subr.el (add-to-list): Fix compiler-macro when `append' is not constant. Don't use `cl-member' for the base case. --- lisp/ChangeLog | 3 +++ lisp/subr.el | 21 +++++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index bf243febe4..38c79fc427 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,8 @@ 2013-07-22 Stefan Monnier + * subr.el (add-to-list): Fix compiler-macro when `append' is + not constant. Don't use `cl-member' for the base case. + * progmodes/subword.el: Fix boundary case (bug#13758). (subword-forward-regexp): Make it a constant. Wrap optional \\W in its own group. diff --git a/lisp/subr.el b/lisp/subr.el index 75c6b3a062..7130639dbe 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -1498,9 +1498,10 @@ other hooks, such as major mode hooks, can do the job." ;; FIXME: Something like this could be used for `set' as well. (if (or (not (eq 'quote (car-safe list-var))) (special-variable-p (cadr list-var)) - (and append compare-fn)) + (not (macroexp-const-p append))) exp (let* ((sym (cadr list-var)) + (append (eval append)) (msg (format "`add-to-list' can't use lexical var `%s'; use `push' or `cl-pushnew'" sym)) ;; Big ugly hack so we only output a warning during @@ -1513,13 +1514,17 @@ other hooks, such as major mode hooks, can do the job." (when (assq sym byte-compile--lexical-environment) (byte-compile-log-warning msg t :error)))) (code - (if append - (macroexp-let2 macroexp-copyable-p x element - `(unless (member ,x ,sym) - (setq ,sym (append ,sym (list ,x))))) - (require 'cl-lib) - `(cl-pushnew ,element ,sym - :test ,(or compare-fn '#'equal))))) + (macroexp-let2 macroexp-copyable-p x element + `(unless ,(if compare-fn + (progn + (require 'cl-lib) + `(cl-member ,x ,sym :test ,compare-fn)) + ;; For bootstrapping reasons, don't rely on + ;; cl--compiler-macro-member for the base case. + `(member ,x ,sym)) + ,(if append + `(setq ,sym (append ,sym (list ,x))) + `(push ,x ,sym)))))) (if (not (macroexp--compiling-p)) code `(progn -- 2.20.1