bug#18971: 25.0.50; incorrect warning from byte compiler

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

bug#18971: 25.0.50; incorrect warning from byte compiler

Tom Tromey-4

Byte compile this file:

; -*- lexical-binding:t -*-
(require 'bytecomp)
(defun z ()
  (byte-compile-close-variables
   (message "hi")))

I get:

In toplevel form:
q.el:3:1:Warning: Unused lexical variable `byte-compile-free-assignments'
q.el:3:1:Warning: Unused lexical variable `byte-compile-free-references'
q.el:3:1:Warning: Unused lexical variable `byte-compile--outbuffer'

I think the warning seems wrong.  bytecomp.el has a defvar for each of
these variables, so I expected them not to be considered lexical.




In GNU Emacs 25.0.50.8 (x86_64-unknown-linux-gnu, GTK+ Version 3.10.9)
 of 2014-11-05 on bapiya
Repository revision: 118301 [hidden email]-20141106032723-sooywb316jlfcpd9
Windowing system distributor `Fedora Project', version 11.0.11404000
Configured using:
 `configure --prefix=/home/tromey/Emacs/install'

Configured features:
XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS GCONF GSETTINGS
NOTIFY LIBSELINUX GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB

Important settings:
  value of $LANG: en_US.UTF-8
  value of $XMODIFIERS: @im=none
  locale-coding-system: utf-8-unix

Major mode: Emacs-Lisp

Minor modes in effect:
  shell-dirtrack-mode: t
  diff-auto-refine-mode: t
  flyspell-mode: t
  which-function-mode: t
  global-auto-revert-mode: t
  desktop-save-mode: t
  erc-services-mode: t
  erc-list-mode: t
  erc-menu-mode: t
  erc-autojoin-mode: t
  erc-ring-mode: t
  erc-networks-mode: t
  erc-pcomplete-mode: t
  erc-track-mode: t
  erc-match-mode: t
  erc-button-mode: t
  erc-fill-mode: t
  erc-stamp-mode: t
  erc-netsplit-mode: t
  erc-irccontrols-mode: t
  erc-noncommands-mode: t
  erc-move-to-prompt-mode: t
  erc-readonly-mode: t
  savehist-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  column-number-mode: t
  line-number-mode: t
  auto-fill-function: do-auto-fill

Recent messages:
C-x C-g is undefined
Saving file /home/tromey/Emacs/ET/q.el...
Wrote /home/tromey/Emacs/ET/q.el
Saving file /home/tromey/Emacs/ET/q.el...
Wrote /home/tromey/Emacs/ET/q.el
Making completion list...
Mark saved where search started [2 times]
Mark set
Mark saved where search started
Mark set [2 times]
Quit

Load-path shadows:
/home/tromey/.emacs.d/elpa/css-mode-1.0/css-mode hides /home/tromey/Emacs/install/share/emacs/25.0.50/lisp/textmodes/css-mode
/home/tromey/.emacs.d/elpa/bubbles-0.5/bubbles hides /home/tromey/Emacs/install/share/emacs/25.0.50/lisp/play/bubbles

Features:
(shadow sort mail-extr warnings emacsbug sendmail copyright dabbrev
misearch multi-isearch shell message dired rfc822 mml mml-sec mm-decode
mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045 ietf-drums
mailabbrev mail-utils gmm-utils mailheader make-mode texinfo sh-script
smie executable sgml-mode smerge-mode bug-reference goto-addr add-log
cc-mode cc-fonts cc-guess cc-menus cc-cmds vc-arch vc-mtn vc-hg vc-sccs
vc-svn vc-cvs vc-rcs jka-compr vc-bzr vc-git diff-mode easy-mmode
flyspell ispell diminish projectile edmacro kmacro pkg-info find-func
lisp-mnt epl grep compile dash s appt diary-lib diary-loaddefs cal-menu
calendar cal-loaddefs which-func imenu minimap autorevert filenotify
desktop frameset cus-start cus-load status erc-services erc-list
erc-menu erc-join erc-ring erc-networks erc-pcomplete pcomplete
erc-track erc-match erc-button wid-edit erc-fill erc-stamp erc-netsplit
erc-goodies erc erc-backend erc-compat format-spec auth-source cl-macs
gv eieio byte-opt bytecomp byte-compile cl-extra cconv eieio-core
gnus-util mm-util mail-prsvr password-cache thingatpt pp advice help-fns
vc-dir ewoc vc cl-loaddefs cl-lib vc-dispatcher cc-styles cc-align
cc-engine cc-vars cc-defs bbdb timezone ange-ftp comint ansi-color ring
server savehist dwarf-mode-autoloads gdb-shell-autoloads
jabber-autoloads lisppaste-autoloads pydoc-info-autoloads info-look info
easymenu weblogger-autoloads package epg-config bbdb-autoloads time-date
tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type
mwheel x-win x-dnd tool-bar dnd fontset image regexp-opt fringe
tabulated-list newcomment elisp-mode lisp-mode prog-mode register page
menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock font-lock
syntax facemenu font-core frame cham georgian utf-8-lang misc-lang
vietnamese tibetan thai tai-viet lao korean japanese hebrew greek
romanian slovak czech european ethiopic indian cyrillic chinese
case-table epa-hook jka-cmpr-hook help simple abbrev minibuffer nadvice
loaddefs button faces cus-face macroexp files text-properties overlay
sha1 md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote make-network-process dbusbind
gfilenotify dynamic-setting system-font-setting font-render-setting
move-toolbar gtk x-toolkit x multi-tty emacs)

Memory information:
((conses 16 421995 36333)
 (symbols 48 36948 0)
 (miscs 40 21361 845)
 (strings 32 76233 10784)
 (string-bytes 1 2288448)
 (vectors 16 30564)
 (vector-slots 8 656796 18204)
 (floats 8 151 435)
 (intervals 56 16761 235)
 (buffers 976 171)
 (heap 1024 59018 1707))



Reply | Threaded
Open this post in threaded view
|

bug#18971: 25.0.50; incorrect warning from byte compiler

Stefan Monnier
> ; -*- lexical-binding:t -*-
> (require 'bytecomp)
> (defun z ()
>   (byte-compile-close-variables
>    (message "hi")))

If it hurts, don't do that.

`byte-compile-close-variables' is an internal macro in bytecomp.el.
Why do you need to use it elsewhere?


        Stefan



Reply | Threaded
Open this post in threaded view
|

bug#18971: 25.0.50; incorrect warning from byte compiler

Tom Tromey-4
>>>>> "Stefan" == Stefan Monnier <[hidden email]> writes:

>> ; -*- lexical-binding:t -*-
>> (require 'bytecomp)
>> (defun z ()
>> (byte-compile-close-variables
>> (message "hi")))

Stefan> If it hurts, don't do that.

Stefan> `byte-compile-close-variables' is an internal macro in bytecomp.el.
Stefan> Why do you need to use it elsewhere?

I want to be able to call byte-optimize-form and was under the
impression that byte-compile-close-variables was needed.  I'm doing this
for a project I'm working on where it is convenient to let the byte
compiler code macroexpand a form and do some simple optimizations on it.

I guess I don't understand why this would not be a bug, though.
Or at least it perplexes me why this happens; my only theory is that
somehow the defvars aren't seen when byte-compiling my file.  I suppose
if I wanted to export a macro like this, I would need it to come with
special declarations for the variables?  Except I didn't see a way to do
that either.

Tom



Reply | Threaded
Open this post in threaded view
|

bug#18971: 25.0.50; incorrect warning from byte compiler

Stefan Monnier
> I want to be able to call byte-optimize-form and was under the
> impression that byte-compile-close-variables was needed.  I'm doing this
> for a project I'm working on where it is convenient to let the byte
> compiler code macroexpand a form and do some simple optimizations on it.

Just curious: why do you need those simple optimizations performed by
byte-optimize-form?

> I guess I don't understand why this would not be a bug, though.
> Or at least it perplexes me why this happens; my only theory is that
> somehow the defvars aren't seen when byte-compiling my file.  I suppose
> if I wanted to export a macro like this, I would need it to come with
> special declarations for the variables?  Except I didn't see a way to do
> that either.

Those vars are not globally bound, i.e. they are only declared with
(defvar <var>) and this only affects the file in which they appear (or
even the scope, in case they appear within a defun body).

So the macro would need to expand to something like

   (progn
     (defvar byte-compile-free-assignments)
     ...
     (defvar byte-compile-free-references)
     (let (...) ...))

if it was meant to be used outside of bytecomp.el.


        Stefan



Reply | Threaded
Open this post in threaded view
|

bug#18971: 25.0.50; incorrect warning from byte compiler

Tom Tromey-4
>> I want to be able to call byte-optimize-form and was under the
>> impression that byte-compile-close-variables was needed.  I'm doing this
>> for a project I'm working on where it is convenient to let the byte
>> compiler code macroexpand a form and do some simple optimizations on it.

Stefan> Just curious: why do you need those simple optimizations performed by
Stefan> byte-optimize-form?

I'm writing an elisp compiler and it just seemed handy.
I can probably reimplement the optimizations though.

Tom



Reply | Threaded
Open this post in threaded view
|

bug#18971: 25.0.50; incorrect warning from byte compiler

Stefan Monnier
> I'm writing an elisp compiler and it just seemed handy.
> I can probably reimplement the optimizations though.

Or you can add all the corresponding (defvar <foo>), of course.


        Stefan



Reply | Threaded
Open this post in threaded view
|

bug#18971: 25.0.50; incorrect warning from byte compiler

Lars Ingebrigtsen
Stefan Monnier <[hidden email]> writes:

>> I'm writing an elisp compiler and it just seemed handy.
>> I can probably reimplement the optimizations though.
>
> Or you can add all the corresponding (defvar <foo>), of course.

So there doesn't seem to be a bug here, and I'm closing this bug report.

--
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no