From unknown Sun Jun 22 11:35:09 2025 X-Loop: help-debbugs@gnu.org Subject: bug#21983: emacs-25: cconv-convert makes invalid transformations on `setq' forms. Resent-From: Alan Mackenzie Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 22 Nov 2015 18:09:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 21983 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: To: 21983@debbugs.gnu.org X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.144821573126319 (code B ref -1); Sun, 22 Nov 2015 18:09:01 +0000 Received: (at submit) by debbugs.gnu.org; 22 Nov 2015 18:08:51 +0000 Received: from localhost ([127.0.0.1]:48479 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1a0Z4F-0006qQ-1p for submit@debbugs.gnu.org; Sun, 22 Nov 2015 13:08:51 -0500 Received: from eggs.gnu.org ([208.118.235.92]:36996) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1a0Z4C-0006qI-HD for submit@debbugs.gnu.org; Sun, 22 Nov 2015 13:08:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a0Z4B-0006bL-RX for submit@debbugs.gnu.org; Sun, 22 Nov 2015 13:08:48 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:44273) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a0Z4B-0006bH-Np for submit@debbugs.gnu.org; Sun, 22 Nov 2015 13:08:47 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46982) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a0Z4A-0007C7-OJ for bug-gnu-emacs@gnu.org; Sun, 22 Nov 2015 13:08:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a0Z47-0006al-IN for bug-gnu-emacs@gnu.org; Sun, 22 Nov 2015 13:08:46 -0500 Received: from mail.muc.de ([193.149.48.3]:26571) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a0Z47-0006aX-8r for bug-gnu-emacs@gnu.org; Sun, 22 Nov 2015 13:08:43 -0500 Received: (qmail 25795 invoked by uid 3782); 22 Nov 2015 18:08:41 -0000 Received: from acm.muc.de (p548A57CB.dip0.t-ipconnect.de [84.138.87.203]) by colin.muc.de (tmda-ofmipd) with ESMTP; Sun, 22 Nov 2015 19:08:40 +0100 Received: (qmail 3958 invoked by uid 1000); 22 Nov 2015 18:10:43 -0000 Date: Sun, 22 Nov 2015 18:10:43 +0000 Message-ID: <20151122181043.GC2332@acm.fritz.box> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-detected-operating-system: by eggs.gnu.org: FreeBSD 9.x X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -4.3 (----) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -4.3 (----) 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). From unknown Sun Jun 22 11:35:09 2025 MIME-Version: 1.0 X-Mailer: MIME-tools 5.503 (Entity 5.503) X-Loop: help-debbugs@gnu.org From: help-debbugs@gnu.org (GNU bug Tracking System) To: Alan Mackenzie Subject: bug#21983: closed (Re: bug#21983: emacs-25: cconv-convert makes invalid transformations on `setq' forms.) Message-ID: References: <20151123141313.79086.qmail@mail.muc.de> <20151122181043.GC2332@acm.fritz.box> X-Gnu-PR-Message: they-closed 21983 X-Gnu-PR-Package: emacs Reply-To: 21983@debbugs.gnu.org Date: Mon, 23 Nov 2015 14:14:02 +0000 Content-Type: multipart/mixed; boundary="----------=_1448288042-28711-1" This is a multi-part message in MIME format... ------------=_1448288042-28711-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Your bug report #21983: emacs-25: cconv-convert makes invalid transformations on `setq' for= ms. 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@debbugs.gnu.org. --=20 21983: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D21983 GNU Bug Tracking System Contact help-debbugs@gnu.org with problems ------------=_1448288042-28711-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 21983-done) by debbugs.gnu.org; 23 Nov 2015 14:13:17 +0000 Received: from localhost ([127.0.0.1]:49145 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1a0rrp-0007Rq-6R for submit@debbugs.gnu.org; Mon, 23 Nov 2015 09:13:17 -0500 Received: from mail.muc.de ([193.149.48.3]:56158) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1a0rrm-0007Rh-Mw for 21983-done@debbugs.gnu.org; Mon, 23 Nov 2015 09:13:15 -0500 Received: (qmail 79087 invoked by uid 3782); 23 Nov 2015 14:13:13 -0000 Date: 23 Nov 2015 14:13:13 -0000 Message-ID: <20151123141313.79086.qmail@mail.muc.de> From: Alan Mackenzie To: 21983-done@debbugs.gnu.org Subject: Re: bug#21983: emacs-25: cconv-convert makes invalid transformations on `setq' forms. Organization: muc.de e.V. In-Reply-To: X-Newsgroups: gnu.emacs.bug User-Agent: tin/2.3.1-20141224 ("Tallant") (UNIX) (FreeBSD/10.1-RELEASE-p16 (amd64)) X-Spam-Score: -0.6 (/) X-Debbugs-Envelope-To: 21983-done Cc: Alan Mackenzie X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.6 (/) Fixed in emacs-25 branch. -- Alan Mackenzie (Nuremberg, Germany). ------------=_1448288042-28711-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by debbugs.gnu.org; 22 Nov 2015 18:08:51 +0000 Received: from localhost ([127.0.0.1]:48479 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1a0Z4F-0006qQ-1p for submit@debbugs.gnu.org; Sun, 22 Nov 2015 13:08:51 -0500 Received: from eggs.gnu.org ([208.118.235.92]:36996) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1a0Z4C-0006qI-HD for submit@debbugs.gnu.org; Sun, 22 Nov 2015 13:08:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a0Z4B-0006bL-RX for submit@debbugs.gnu.org; Sun, 22 Nov 2015 13:08:48 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:44273) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a0Z4B-0006bH-Np for submit@debbugs.gnu.org; Sun, 22 Nov 2015 13:08:47 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46982) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a0Z4A-0007C7-OJ for bug-gnu-emacs@gnu.org; Sun, 22 Nov 2015 13:08:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a0Z47-0006al-IN for bug-gnu-emacs@gnu.org; Sun, 22 Nov 2015 13:08:46 -0500 Received: from mail.muc.de ([193.149.48.3]:26571) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a0Z47-0006aX-8r for bug-gnu-emacs@gnu.org; Sun, 22 Nov 2015 13:08:43 -0500 Received: (qmail 25795 invoked by uid 3782); 22 Nov 2015 18:08:41 -0000 Received: from acm.muc.de (p548A57CB.dip0.t-ipconnect.de [84.138.87.203]) by colin.muc.de (tmda-ofmipd) with ESMTP; Sun, 22 Nov 2015 19:08:40 +0100 Received: (qmail 3958 invoked by uid 1000); 22 Nov 2015 18:10:43 -0000 Date: Sun, 22 Nov 2015 18:10:43 +0000 To: bug-gnu-emacs@gnu.org Subject: emacs-25: cconv-convert makes invalid transformations on `setq' forms. Message-ID: <20151122181043.GC2332@acm.fritz.box> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-detected-operating-system: by eggs.gnu.org: FreeBSD 9.x X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -4.3 (----) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -4.3 (----) 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). ------------=_1448288042-28711-1--