GNU bug report logs -
#6376
23.2; byte compile add-to-list report free variable
Previous Next
Reported by: Kevin Ryde <user42 <at> zip.com.au>
Date: Tue, 8 Jun 2010 01:56:01 UTC
Severity: wishlist
Found in version 23.2
Done: Lars Ingebrigtsen <larsi <at> gnus.org>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
I made a mistake with a variable name to add-to-list and wondered if the
byte compiler might report
(add-to-list 'nosuchvariable ...)
as a free variable, similar to the report for
(set 'nosuchvariable ...)
The few lines below get the desired effect, but might be a bit rough.
The separate check-assign is with a view to sharing among set, setq,
set-default and maybe others.
Something specific for add-to-list would be vaguely reasonable since
it's a builtin, but it could be worth trying a general way to flag an
arg number as the name of a variable either referenced or assigned.
Something like that might also allow "function not known to be defined"
for quoted symbol args to mapcar, sort, etc.
I suppose this sort of thing might be analysed by elint instead or as
well, but the byte compiler has good information about bindings
available after macro expansion etc and it's much more often run than
elint.
(defun byte-compile-check-assign (symbol)
(cond ((and (byte-compile-warning-enabled-p 'constants)
(byte-compile-const-symbol-p symbol t))
(byte-compile-warn "variable assignment to constant `%s'" symbol))
((and (byte-compile-warning-enabled-p 'free-vars)
(not (memq symbol byte-compile-bound-variables))
(not (memq symbol byte-compile-free-assignments)))
(byte-compile-warn "assignment to free variable `%s'" symbol)
(push symbol byte-compile-free-assignments))))
(defun byte-compile-varsym1 (form)
;; arg 1 is a symbol which is the name of a variable which must be found
;; eg. (foo 'var ...)
(cond ((eq 'quote (car-safe (nth 1 form)))
(let ((var (car-safe (cdr (nth 1 form)))))
(if (symbolp var)
(byte-compile-check-assign var))))
;; (add-to-list 'nil ...) reaches here as (add-to-list nil ...),
;; call the check so as to report nil as a constant
((null (nth 1 form))
(byte-compile-check-assign nil)))
(byte-compile-normal-call form))
(byte-defop-compiler-1 add-to-list byte-compile-varsym1)
(byte-defop-compiler-1 add-to-ordered-list byte-compile-varsym1)
In GNU Emacs 23.2.1 (i486-pc-linux-gnu, GTK+ Version 2.20.0)
of 2010-05-16 on raven, modified by Debian
configured using `configure '--build' 'i486-linux-gnu' '--build' 'i486-linux-gnu' '--prefix=/usr' '--sharedstatedir=/var/lib' '--libexecdir=/usr/lib' '--localstatedir=/var/lib' '--infodir=/usr/share/info' '--mandir=/usr/share/man' '--with-pop=yes' '--enable-locallisppath=/etc/emacs23:/etc/emacs:/usr/local/share/emacs/23.2/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/23.2/site-lisp:/usr/share/emacs/site-lisp:/usr/share/emacs/23.2/leim' '--with-x=yes' '--with-x-toolkit=gtk' '--with-toolkit-scroll-bars' 'build_alias=i486-linux-gnu' 'CFLAGS=-DDEBIAN -g -O2' 'LDFLAGS=-g' 'CPPFLAGS=''
Important settings:
value of $LC_ALL: nil
value of $LC_COLLATE: nil
value of $LC_CTYPE: nil
value of $LC_MESSAGES: nil
value of $LC_MONETARY: nil
value of $LC_NUMERIC: nil
value of $LC_TIME: nil
value of $LANG: en_AU
value of $XMODIFIERS: nil
locale-coding-system: iso-latin-1-unix
default enable-multibyte-characters: t
This bug report was last modified 3 years and 170 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.