GNU bug report logs - #26960
26.0.50; Complaints about unused variable in cl-destructuring-bind

Previous Next

Package: emacs;

Reported by: Philipp Stephani <p.stephani2 <at> gmail.com>

Date: Wed, 17 May 2017 09:24:01 UTC

Severity: minor

Found in versions 24.0.50, 26.0.50

To reply to this bug, email your comments to 26960 AT debbugs.gnu.org.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#26960; Package emacs. (Wed, 17 May 2017 09:24:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Philipp Stephani <p.stephani2 <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Wed, 17 May 2017 09:24:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Philipp Stephani <p.stephani2 <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: 26.0.50; Complaints about unused variable in cl-destructuring-bind
Date: Wed, 17 May 2017 11:23:27 +0200
Create a file with the following contents (here /tmp/destr.el):

;;; -*- lexical-binding: t; -*-
(require 'cl-lib)
(cl-destructuring-bind (&whole a b &rest _) '(1 2)
  (print (list a b)))

Then run

emacs -Q -batch -f batch-byte-compile /tmp/destr.el

The byte compiler will complain:

In toplevel form:
/tmp/destr.el:3:1:Warning: variable ‘_’ not left unused

even though the variable is clearly unused.


In GNU Emacs 26.0.50 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.10.8)
 of 2017-05-17 built on localhost
Repository revision: f7c07930b581b1bcfdfb1874b6883233516bdf11
Windowing system distributor 'The X.Org Foundation', version 11.0.11803000
System Description:	Ubuntu 14.04 LTS

Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.

Configured using:
 'configure --without-pop --with-mailutils --enable-checking
 --enable-check-lisp-object-type --with-modules 'CFLAGS=-O0 -ggdb3''

Configured features:
XPM JPEG TIFF GIF PNG SOUND GSETTINGS NOTIFY GNUTLS FREETYPE XFT ZLIB
TOOLKIT_SCROLL_BARS GTK3 X11 MODULES

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  transient-mark-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message subr-x puny seq byte-opt gv
bytecomp byte-compile cconv cl-loaddefs cl-lib dired dired-loaddefs
format-spec rfc822 mml easymenu mml-sec password-cache epa derived epg
epg-config gnus-util rmail rmail-loaddefs mm-decode mm-bodies mm-encode
mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047
rfc2045 ietf-drums mm-util mail-prsvr mail-utils time-date mule-util
tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type
mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image
regexp-opt fringe tabulated-list replace newcomment text-mode elisp-mode
lisp-mode prog-mode register page menu-bar rfn-eshadow isearch timer
select scroll-bar mouse jit-lock font-lock syntax facemenu font-core
term/tty-colors frame cl-generic cham georgian utf-8-lang misc-lang
vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932
hebrew greek romanian slovak czech european ethiopic indian cyrillic
chinese composite charscript charprop case-table epa-hook jka-cmpr-hook
help simple abbrev obarray minibuffer cl-preloaded 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 inotify dynamic-setting system-font-setting
font-render-setting move-toolbar gtk x-toolkit x multi-tty
make-network-process emacs)

Memory information:
((conses 16 94336 9026)
 (symbols 48 20116 1)
 (miscs 40 39 145)
 (strings 32 17446 3603)
 (string-bytes 1 571028)
 (vectors 16 13884)
 (vector-slots 8 481230 5848)
 (floats 8 48 108)
 (intervals 56 216 0)
 (buffers 976 12)
 (heap 1024 34121 952))

-- 
Google Germany GmbH
Erika-Mann-Straße 33
80636 München

Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg
Geschäftsführer: Matthew Scott Sucherman, Paul Terence Manicle

Diese E-Mail ist vertraulich.  Wenn Sie nicht der richtige Adressat sind,
leiten Sie diese bitte nicht weiter, informieren Sie den Absender und löschen
Sie die E-Mail und alle Anhänge.  Vielen Dank.

This e-mail is confidential.  If you are not the right addressee please do not
forward it, please inform the sender, and please erase this e-mail including
any attachments.  Thanks.




Forcibly Merged 8711 26960. Request was from npostavs <at> users.sourceforge.net to control <at> debbugs.gnu.org. (Wed, 17 May 2017 11:59:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#26960; Package emacs. (Sun, 08 May 2022 12:35:02 GMT) Full text and rfc822 format available.

Message #10 received at 26960 <at> debbugs.gnu.org (full text, mbox):

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Helmut Eller <eller.helmut <at> gmail.com>
Cc: 26960 <at> debbugs.gnu.org, 8711 <at> debbugs.gnu.org,
 Stefan Monnier <monnier <at> iro.umontreal.ca>
Subject: Re: bug#26960: 26.0.50; Complaints about unused variable in
 cl-destructuring-bind
Date: Sun, 08 May 2022 14:33:49 +0200
Helmut Eller <eller.helmut <at> gmail.com> writes:

> There seems be no way to avoid a warning in code like this:
>
> ;; -*- lexical-binding: t -*-
> (eval-when-compile (require 'cl))
> (defun foo (x) (destructuring-bind (_) x))
> (defun bar (x) (destructuring-bind (_) x (ignore _)))
>
> In foo the compiler complains because _ is never used and
> it bar it complains because it is used.

(I'm going through old bug reports that unfortunately weren't resolved
at the time.)

I can reproduce this in Emacs 25.1, but not in Emacs 29.  That is,
there's no warning for `foo'.  There's still a warning for `bar', but
that's correct, isn't it?  `ignore' is just a normal function, so _ is
used there.

However, this example from a merged bug report is giving a warning:

> ;;; -*- lexical-binding: t; -*-
> (require 'cl-lib)
> (cl-destructuring-bind (&whole a b &rest _) '(1 2)
>   (print (list a b)))

And that seems like a bug?

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




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#26960; Package emacs. (Sun, 08 May 2022 13:33:02 GMT) Full text and rfc822 format available.

Message #13 received at 26960 <at> debbugs.gnu.org (full text, mbox):

From: Stefan Monnier <monnier <at> iro.umontreal.ca>
To: Lars Ingebrigtsen <larsi <at> gnus.org>
Cc: 26960 <at> debbugs.gnu.org, 8711 <at> debbugs.gnu.org,
 Helmut Eller <eller.helmut <at> gmail.com>
Subject: Re: bug#26960: 26.0.50; Complaints about unused variable in
 cl-destructuring-bind
Date: Sun, 08 May 2022 09:32:01 -0400
> I can reproduce this in Emacs 25.1, but not in Emacs 29.  That is,
> there's no warning for `foo'.  There's still a warning for `bar', but
> that's correct, isn't it?

Yes.

> `ignore' is just a normal function, so _ is used there.

It's not 100% normal, but yes.

> However, this example from a merged bug report is giving a warning:
>
>> ;;; -*- lexical-binding: t; -*-
>> (require 'cl-lib)
>> (cl-destructuring-bind (&whole a b &rest _) '(1 2)
>>   (print (list a b)))
>
> And that seems like a bug?

Indeed.  If you look at the macroexpanded code, you see that
`cl-destructuring-bind` uses:

    (let* ((_ '(1 2))
           (a _)
           (b (if _ (pop _)
                (signal 'wrong-number-of-arguments
                        (list '(&whole a b &rest _) (length _))))))
      (print (list a b)))

so, you can see that the problem is that `cl-destructuring-bind` tries
to avoid using gensym and "abuses" the &rest var as the "iterator"
variable while parsing the list.

It might have been useful back in the dynbinding days because `setq`
might have been a bit cheaper than `let`, but with lexical scoping
`let` byte-compiles to virtually nothing.


        Stefan





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#26960; Package emacs. (Mon, 09 May 2022 09:26:01 GMT) Full text and rfc822 format available.

Message #16 received at 26960 <at> debbugs.gnu.org (full text, mbox):

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: 26960 <at> debbugs.gnu.org, 8711 <at> debbugs.gnu.org,
 Helmut Eller <eller.helmut <at> gmail.com>
Subject: Re: bug#26960: 26.0.50; Complaints about unused variable in
 cl-destructuring-bind
Date: Mon, 09 May 2022 11:25:38 +0200
Stefan Monnier <monnier <at> iro.umontreal.ca> writes:

> Indeed.  If you look at the macroexpanded code, you see that
> `cl-destructuring-bind` uses:
>
>     (let* ((_ '(1 2))
>            (a _)
>            (b (if _ (pop _)
>                 (signal 'wrong-number-of-arguments
>                         (list '(&whole a b &rest _) (length _))))))
>       (print (list a b)))
>
> so, you can see that the problem is that `cl-destructuring-bind` tries
> to avoid using gensym and "abuses" the &rest var as the "iterator"
> variable while parsing the list.

Hm, right.

I had a quick peek at `cl--do-arglist' (which I guess is what's creating
this form), and...  I think I'll leave this for somebody else to fix.  🫠

In any case, I'm unmerging these two bug reports, and closing the one
that's fixed.

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




Disconnected #26960 from all other report(s). Request was from Lars Ingebrigtsen <larsi <at> gnus.org> to control <at> debbugs.gnu.org. (Mon, 09 May 2022 09:27:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#26960; Package emacs. (Mon, 09 May 2022 12:27:01 GMT) Full text and rfc822 format available.

Message #21 received at 26960 <at> debbugs.gnu.org (full text, mbox):

From: Stefan Monnier <monnier <at> iro.umontreal.ca>
To: Lars Ingebrigtsen <larsi <at> gnus.org>
Cc: 26960 <at> debbugs.gnu.org, 8711 <at> debbugs.gnu.org,
 Helmut Eller <eller.helmut <at> gmail.com>
Subject: Re: bug#26960: 26.0.50; Complaints about unused variable in
 cl-destructuring-bind
Date: Mon, 09 May 2022 08:26:21 -0400
> I had a quick peek at `cl--do-arglist' (which I guess is what's creating
> this form), and...  I think I'll leave this for somebody else to fix.  🫠

I did the same some years ago, FWIW :-)


        Stefan





This bug report was last modified 3 years and 36 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.