GNU bug report logs -
#21983
emacs-25: cconv-convert makes invalid transformations on `setq' forms.
Previous Next
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
[Message part 1 (text/plain, inline)]
Your bug report
#21983: emacs-25: cconv-convert makes invalid transformations on `setq' forms.
which was filed against the emacs package, has been closed.
The explanation is attached below, along with your original report.
If you require more details, please reply to 21983 <at> debbugs.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)]
Fixed in emacs-25 branch.
--
Alan Mackenzie (Nuremberg, Germany).
[Message part 3 (message/rfc822, inline)]
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).
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.