From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.ciao.gmane.io!not-for-mail From: Noam Postavsky Newsgroups: gmane.emacs.bugs Subject: bug#40727: 27.0.91; 'cl-loop ... across ... and' seems broken Date: Thu, 30 Apr 2020 08:30:48 -0400 Message-ID: <871ro5nojr.fsf@gmail.com> References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="ciao.gmane.io:159.69.161.202"; logging-data="78777"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.91 (gnu/linux) Cc: 40727@debbugs.gnu.org, Tino Calancha To: Philipp Stephani Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Thu Apr 30 14:34:48 2020 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jU8Ou-000KN7-Aq for geb-bug-gnu-emacs@m.gmane-mx.org; Thu, 30 Apr 2020 14:34:48 +0200 Original-Received: from localhost ([::1]:45192 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jU8Ot-00032K-Bn for geb-bug-gnu-emacs@m.gmane-mx.org; Thu, 30 Apr 2020 08:34:47 -0400 Original-Received: from eggs.gnu.org ([209.51.188.92]:38666) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jU8MQ-0001HR-Fc for bug-gnu-emacs@gnu.org; Thu, 30 Apr 2020 08:32:17 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.90_1) (envelope-from ) id 1jU8ME-0006Gd-OJ for bug-gnu-emacs@gnu.org; Thu, 30 Apr 2020 08:32:14 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:33911) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1jU8ME-0006GY-9e for bug-gnu-emacs@gnu.org; Thu, 30 Apr 2020 08:32:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1jU8ME-0006dL-4t for bug-gnu-emacs@gnu.org; Thu, 30 Apr 2020 08:32:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Noam Postavsky Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 30 Apr 2020 12:32:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 40727 X-GNU-PR-Package: emacs Original-Received: via spool by 40727-submit@debbugs.gnu.org id=B40727.158824986925437 (code B ref 40727); Thu, 30 Apr 2020 12:32:02 +0000 Original-Received: (at 40727) by debbugs.gnu.org; 30 Apr 2020 12:31:09 +0000 Original-Received: from localhost ([127.0.0.1]:45457 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jU8LM-0006c8-KD for submit@debbugs.gnu.org; Thu, 30 Apr 2020 08:31:09 -0400 Original-Received: from mail-qk1-f174.google.com ([209.85.222.174]:43124) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jU8LI-0006bX-LS; Thu, 30 Apr 2020 08:31:06 -0400 Original-Received: by mail-qk1-f174.google.com with SMTP id i136so1319429qke.10; Thu, 30 Apr 2020 05:31:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=3zTahG8uUyLO/Q1F26RwL0FvRiMMdzXakkkFRy8P3js=; b=TZ+8cePwm7QjOejc/YMGX+dc7jeh5G9WDa1VDeNpeIU7+9Xlf/97VeTkNvoy3U9Fsw qZwuRoGy/aCJT4fHfv3ExgPrcJr+nMKpXdiDK3RMEx9h6Y2Pt3M93NWTRV8A5M/qRUpu cdTJ9lhDVgLcMSGNrfF7geJzqNm0Tqzg59hwxTHCEaZd5RIewIPge53QqQxoWcChZtTX xAkwKTX0W1bdrFwJNLpzMmPNoYmnijoBRtqFGrDzKILnuXaE548u9wON5xE2tAj8Plrb 2mHaaSraZca4E+pPZBrwtZqQpSYoWsxLJrpC52gMy/Fsz+8LGldF8alhl35uaj/LSXqz 5GgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=3zTahG8uUyLO/Q1F26RwL0FvRiMMdzXakkkFRy8P3js=; b=gWkmSMZDk1fgGlINZ2Av4H21jNlBZBraR0YaQAkADRIAF6WSxeOxtYCoFSJadg6e38 80CCdiYZjfntHS6LCqFneBirmelHpYjwqVQM1cOddJSbFDIMMIcY0d7tPqVGGnZeEZlT sDvGuFYKM7DnUV0itTxsIDxRmxeaRnrhbwfI+80Mbb7iPDJyz+lDAzzuc2sk9XaOdxMf uvVXbMThk7gQpMAveJAsiCn6tzMjM/ZIkc2/bmQ+3ixLQbs6EUGWt21hEjyAUirbEJ/u lvoR5Oh32jVjFXXR5H5ZCTuafsAvXnC1QHrnS0K1XGpsHV6XUlHUjWj2Ld+txGir3iaa vBAw== X-Gm-Message-State: AGi0PuauscBonuUCRWzJ459bgDzE5yl2/VQvnoIjKZLhfGR4tYjlEj/B +EG6Cd7/grtv0MKzh9BH8//ru9Us X-Google-Smtp-Source: APiQypICCUo6+j2J4ZZyNFgkY4EnfcYMZtzivp4R2cZNX8oDMCbix/kr88rnlcvwzhSnDbaLiBAtgQ== X-Received: by 2002:a37:a0c7:: with SMTP id j190mr3134353qke.461.1588249858789; Thu, 30 Apr 2020 05:30:58 -0700 (PDT) Original-Received: from minid (cbl-45-2-119-47.yyz.frontiernetworks.ca. [45.2.119.47]) by smtp.gmail.com with ESMTPSA id c33sm2046882qtb.76.2020.04.30.05.30.54 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Thu, 30 Apr 2020 05:30:57 -0700 (PDT) In-Reply-To: (Philipp Stephani's message of "Mon, 20 Apr 2020 02:33:51 +0200") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-Received-From: 209.51.188.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:179384 Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable tags 40727 + confirmed quit Philipp Stephani writes: > In Emacs 26: > > emacs -Q -batch -l cl-lib -eval '(cl-loop for x across [1 2] and y across= [3 4])' > > works (i.e. no error), but in Emacs 27 it gives an error > > Symbol=E2=80=99s value as variable is void: --cl-vec-- > > This doesn't happen with "for" instead of "and", and also doesn't happen > with lists and "in". It's because of [1: bfca19e475]. I think it should be possible to fix by grouping the bindings put into 'loop-for-bindings', but meanwhile we should revert that change, at least on the release branch. It doesn't revert automatically because there was meanwhile another change to use 'cl--push-clause-loop-body' instead of 'push' on the involved lines, but after manual fixup your example works correctly. [1: bfca19e475]: 2018-01-08 00:33:15 +0900 cl-loop: Calculate the array length just once https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=3Dbfca19e475c01f13= dbacc7f8b7bb1aecf46cb7e4 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=0001-Revert-cl-loop-Calculate-the-array-length-just-once.patch Content-Description: patch >From 56a55199614b60e5ffd2968217a0d115779bb23d Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Thu, 30 Apr 2020 07:54:49 -0400 Subject: [PATCH] Revert "cl-loop: Calculate the array length just once" It fails when using 'and' (parallel bindings) for arrays (Bug#40727). * lisp/emacs-lisp/cl-macs.el (cl--parse-loop-clause): Revert to recomputing array length. * test/lisp/emacs-lisp/cl-macs-tests.el (cl-macs-loop-and-arrays): New test. --- lisp/emacs-lisp/cl-macs.el | 14 ++++---------- test/lisp/emacs-lisp/cl-macs-tests.el | 6 ++++++ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el index d56f4151df..20bd1883c3 100644 --- a/lisp/emacs-lisp/cl-macs.el +++ b/lisp/emacs-lisp/cl-macs.el @@ -1322,13 +1322,11 @@ cl--parse-loop-clause ((memq word '(across across-ref)) (let ((temp-vec (make-symbol "--cl-vec--")) - (temp-len (make-symbol "--cl-len--")) (temp-idx (make-symbol "--cl-idx--"))) (push (list temp-vec (pop cl--loop-args)) loop-for-bindings) - (push (list temp-len `(length ,temp-vec)) loop-for-bindings) (push (list temp-idx -1) loop-for-bindings) (cl--push-clause-loop-body - `(< (setq ,temp-idx (1+ ,temp-idx)) ,temp-len)) + `(< (setq ,temp-idx (1+ ,temp-idx)) (length ,temp-vec))) (if (eq word 'across-ref) (push (list var `(aref ,temp-vec ,temp-idx)) cl--loop-symbol-macs) @@ -1342,7 +1340,6 @@ cl--parse-loop-clause (error "Expected `of'")))) (seq (cl--pop2 cl--loop-args)) (temp-seq (make-symbol "--cl-seq--")) - (temp-len (make-symbol "--cl-len--")) (temp-idx (if (eq (car cl--loop-args) 'using) (if (and (= (length (cadr cl--loop-args)) 2) @@ -1353,19 +1350,16 @@ cl--parse-loop-clause (push (list temp-seq seq) loop-for-bindings) (push (list temp-idx 0) loop-for-bindings) (if ref - (progn + (let ((temp-len (make-symbol "--cl-len--"))) (push (list temp-len `(length ,temp-seq)) loop-for-bindings) (push (list var `(elt ,temp-seq ,temp-idx)) cl--loop-symbol-macs) - (cl--push-clause-loop-body `(< ,temp-idx ,temp-len))) - ;; Evaluate seq length just if needed, that is, when seq is not a cons. - (push (list temp-len (or (consp seq) `(length ,temp-seq))) - loop-for-bindings) + (cl--push-clause-loop-body `(< ,temp-idx ,temp-len))) (push (list var nil) loop-for-bindings) (cl--push-clause-loop-body `(and ,temp-seq (or (consp ,temp-seq) - (< ,temp-idx ,temp-len)))) + (< ,temp-idx (length ,temp-seq))))) (push (list var `(if (consp ,temp-seq) (pop ,temp-seq) (aref ,temp-seq ,temp-idx))) diff --git a/test/lisp/emacs-lisp/cl-macs-tests.el b/test/lisp/emacs-lisp/cl-macs-tests.el index 9ca84f156a..77609a42a9 100644 --- a/test/lisp/emacs-lisp/cl-macs-tests.el +++ b/test/lisp/emacs-lisp/cl-macs-tests.el @@ -39,6 +39,12 @@ cl-macs-loop-and-assignment collect (list c b a)) '((4.0 2 1) (8.3 6 5) (10.4 9 8))))) +(ert-deftest cl-macs-loop-and-arrays () + "Bug#40727" + (should (equal (cl-loop for y = (- (or x 0)) and x across [1 2] + collect (cons x y)) + '((1 . 0) (2 . -1))))) + (ert-deftest cl-macs-loop-destructure () (should (equal (cl-loop for (a b c) in '((1 2 4.0) (5 6 8.3) (8 9 10.4)) collect (list c b a)) -- 2.11.0 --=-=-= Content-Type: text/plain By the way, while adding the test case I found an additional regression involving loop termination by a 'var = ...' clause. I'll open another bug about it soon. --=-=-=--