]> git.eshelyaron.com Git - emacs.git/commitdiff
Revert "cl-loop: Add missing guard condition"
authorNoam Postavsky <npostavs@gmail.com>
Thu, 30 Apr 2020 23:33:50 +0000 (19:33 -0400)
committerNoam Postavsky <npostavs@gmail.com>
Wed, 6 May 2020 01:07:58 +0000 (21:07 -0400)
Don't merge to master.  This is a safe-for-release fix for Bug#40727.

lisp/emacs-lisp/cl-macs.el

index cda25d186fd18fb5e41d7b56a563b8a072e96ecd..00f34d3fb60e11f447bcc1efae5605c10bf7772f 100644 (file)
@@ -897,7 +897,7 @@ This is compatible with Common Lisp, but note that `defun' and
 (defvar cl--loop-name)
 (defvar cl--loop-result) (defvar cl--loop-result-explicit)
 (defvar cl--loop-result-var) (defvar cl--loop-steps)
-(defvar cl--loop-symbol-macs) (defvar cl--loop-guard-cond)
+(defvar cl--loop-symbol-macs)
 
 (defun cl--loop-set-iterator-function (kind iterator)
   (if cl--loop-iterator-function
@@ -966,7 +966,7 @@ For more details, see Info node `(cl)Loop Facility'.
          (cl--loop-accum-var nil)      (cl--loop-accum-vars nil)
          (cl--loop-initially nil)      (cl--loop-finally nil)
          (cl--loop-iterator-function nil) (cl--loop-first-flag nil)
-          (cl--loop-symbol-macs nil) (cl--loop-guard-cond nil))
+          (cl--loop-symbol-macs nil))
       ;; Here is more or less how those dynbind vars are used after looping
       ;; over cl--parse-loop-clause:
       ;;
@@ -1001,24 +1001,7 @@ For more details, see Info node `(cl)Loop Facility'.
                              (list (or cl--loop-result-explicit
                                         cl--loop-result))))
             (ands (cl--loop-build-ands (nreverse cl--loop-body)))
-            (while-body
-              (nconc
-               (cadr ands)
-               (if (or (not cl--loop-guard-cond) (not cl--loop-first-flag))
-                   (nreverse cl--loop-steps)
-                 ;; Right after update the loop variable ensure that the loop
-                 ;; condition, i.e. (car ands), is still satisfied; otherwise,
-                 ;; set `cl--loop-first-flag' nil and skip the remaining
-                 ;; body forms (#Bug#29799).
-                 ;;
-                 ;; (last cl--loop-steps) updates the loop var
-                 ;; (car (butlast cl--loop-steps)) sets `cl--loop-first-flag' nil
-                 ;; (nreverse (cdr (butlast cl--loop-steps))) are the
-                 ;; remaining body forms.
-                 (append (last cl--loop-steps)
-                         `((and ,(car ands)
-                                ,@(nreverse (cdr (butlast cl--loop-steps)))))
-                         `(,(car (butlast cl--loop-steps)))))))
+            (while-body (nconc (cadr ands) (nreverse cl--loop-steps)))
             (body (append
                    (nreverse cl--loop-initially)
                    (list (if cl--loop-iterator-function
@@ -1528,11 +1511,10 @@ For more details, see Info node `(cl)Loop Facility'.
                      ,(cl--loop-let (nreverse loop-for-sets) 'setq ands)
                      t)
                   cl--loop-body))
-       (when loop-for-steps
-          (setq cl--loop-guard-cond t)
-         (push (cons (if ands 'cl-psetq 'setq)
-                     (apply 'append (nreverse loop-for-steps)))
-               cl--loop-steps))))
+       (if loop-for-steps
+           (push (cons (if ands 'cl-psetq 'setq)
+                       (apply 'append (nreverse loop-for-steps)))
+                 cl--loop-steps))))
 
      ((eq word 'repeat)
       (let ((temp (make-symbol "--cl-var--")))