GNU bug report logs - #21983
emacs-25: cconv-convert makes invalid transformations on `setq' forms.

Previous Next

Package: emacs;

Reported by: Alan Mackenzie <acm <at> muc.de>

Date: Sun, 22 Nov 2015 18:09:01 UTC

Severity: normal

Done: Alan Mackenzie <acm <at> muc.de>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: help-debbugs <at> gnu.org (GNU bug Tracking System)
To: Alan Mackenzie <acm <at> muc.de>
Cc: tracker <at> debbugs.gnu.org
Subject: bug#21983: closed (emacs-25: cconv-convert makes invalid
 transformations on `setq' forms.)
Date: Mon, 23 Nov 2015 14:14:01 +0000
[Message part 1 (text/plain, inline)]
Your message dated 23 Nov 2015 14:13:13 -0000
with message-id <20151123141313.79086.qmail <at> mail.muc.de>
and subject line Re: bug#21983: emacs-25: cconv-convert makes invalid transformations on `setq' forms.
has caused the debbugs.gnu.org bug report #21983,
regarding emacs-25: cconv-convert makes invalid transformations on `setq' forms.
to be marked as done.

(If you believe you have received this mail in error, please contact
help-debbugs <at> gnu.org.)


-- 
21983: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=21983
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
From: Alan Mackenzie <acm <at> muc.de>
To: bug-gnu-emacs <at> gnu.org
Subject: emacs-25: cconv-convert makes invalid transformations on `setq' forms.
Date: Sun, 22 Nov 2015 18:10:43 +0000
Hello, Emacs.

It is desirable for the byte compiler to detect `setq' forms with an odd
number of arguments.

However, when lexical binding is enabled, this is prevented by
cconv-convert.  This converts a `setq' form into several single `setq's,
and crucially, takes the liberty of supplying a nil argument to the last
`setq' should no argument have been present.  This is a bug.

Here's a patch which appears to fix the problem:



diff --git a/lisp/emacs-lisp/cconv.el b/lisp/emacs-lisp/cconv.el
index efa9a3d..4a3c273 100644
--- a/lisp/emacs-lisp/cconv.el
+++ b/lisp/emacs-lisp/cconv.el
@@ -477,17 +477,19 @@ cconv-convert
        (while forms
          (let* ((sym (pop forms))
                 (sym-new (or (cdr (assq sym env)) sym))
-                (value (cconv-convert (pop forms) env extend)))
+                (value-in-list
+                 (and forms
+                      (list (cconv-convert (pop forms) env extend)))))
            (push (pcase sym-new
-                   ((pred symbolp) `(setq ,sym-new ,value))
-                   (`(car-safe ,iexp) `(setcar ,iexp ,value))
+                   ((pred symbolp) `(setq ,sym-new ,@value-in-list))
+                   (`(car-safe ,iexp) `(setcar ,iexp ,@value-in-list))
                    ;; This "should never happen", but for variables which are
                    ;; mutated+captured+unused, we may end up trying to `setq'
                    ;; on a closed-over variable, so just drop the setq.
                    (_ ;; (byte-compile-report-error
                     ;;  (format "Internal error in cconv of (setq %s ..)"
                     ;;          sym-new))
-                    value))
+                    (car value-in-list)))
                  prognlist)))
        (if (cdr prognlist)
            `(progn . ,(nreverse prognlist))



Because cconv-convert is written in pcase rather than elisp, I may have
slipped up on some subtlety.  Would somebody please check I haven't.

Thanks!

-- 
Alan Mackenzie (Nuremberg, Germany).


[Message part 3 (message/rfc822, inline)]
From: Alan Mackenzie <acm <at> muc.de>
To: 21983-done <at> debbugs.gnu.org
Cc: Alan Mackenzie <acm <at> muc.de>
Subject: Re: bug#21983: emacs-25: cconv-convert makes invalid transformations
 on `setq' forms.
Date: 23 Nov 2015 14:13:13 -0000
Fixed in emacs-25 branch.

-- 
Alan Mackenzie (Nuremberg, Germany).



This bug report was last modified 9 years and 241 days ago.

Previous Next


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