Test cases for code-movement fail on ECL

Bug #1009815 reported by Patrick Stein
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
ITERATE macro
New
Undecided
Unassigned
common-lisp
New
Undecided
Unassigned

Bug Description

These test cases fail on ECL, but not on other Lisps: ITERATE.TEST::CODE-MOVEMENT.ELSE, ITERATE.TEST::CODE-MOVEMENT.FINALLY, ITERATE.TEST::CODE-MOVEMENT.FINALLY-PROTECTED.

cl-test-grid shows these failures for ecl-12.2.1-70b3b263-linux and ecl-11.1.1-606449eb-linux-x86.

I also reproduced it with ecl-12.2.1 on darwin-x86.

I suspect it is because on ECL, RETURN is a macro that is effectively: (defmacro return (&rest rest) `(return-from nil ,@rest)). And, I bet the iterate code handles RETURN and RETURN-FROM differently.

Here's an example of one of those test forms. In the test failure output below, you can see that return was expanded to return-from:
(deftest code-movement.else
    (handler-case (macroexpand '
                   (iter (for i from 1 to 10)
                         (let ((x 3))
                           (else (return x)))))
      (error () t)
      (:no-error (f x) (declare (ignore f x)) nil))
  t)

Test ITERATE.TEST::CODE-MOVEMENT.ELSE failed
Form: (HANDLER-CASE
       (MACROEXPAND
        '(ITERATE:ITER
          (ITERATE:FOR ITERATE.TEST::I ITERATE.TEST::FROM 1 ITERATE.TEST::TO
           10)
          (LET ((ITERATE.TEST::X 3))
            (ITERATE:ELSE (RETURN ITERATE.TEST::X)))))
       (ERROR NIL T)
       (:NO-ERROR (ITERATE.TEST::F ITERATE.TEST::X)
        (DECLARE (IGNORE ITERATE.TEST::F ITERATE.TEST::X)) NIL))
Expected value: T
Actual value: NIL.

Test ITERATE.TEST::CODE-MOVEMENT.FINALLY failed
Form: (HANDLER-CASE
       (MACROEXPAND
        '(ITERATE:ITER
          (ITERATE:FOR ITERATE.TEST::I ITERATE.TEST::FROM 1 ITERATE.TEST::TO
           10)
          (LET ((ITERATE.TEST::Y ITERATE.TEST::I))
            (ITERATE:FINALLY (RETURN ITERATE.TEST::Y)))))
       (ERROR NIL T)
       (:NO-ERROR (ITERATE.TEST::F ITERATE.TEST::X)
        (DECLARE (IGNORE ITERATE.TEST::F ITERATE.TEST::X)) NIL))
Expected value: T
Actual value: NIL.

Test ITERATE.TEST::CODE-MOVEMENT.FINALLY-PROTECTED failed
Form: (HANDLER-CASE
       (MACROEXPAND
        '(ITERATE:ITER
          (ITERATE:FOR ITERATE.TEST::I ITERATE.TEST::FROM 1 ITERATE.TEST::TO
           10)
          (LET ((ITERATE.TEST::Y ITERATE.TEST::I))
            (ITERATE:FINALLY-PROTECTED (RETURN ITERATE.TEST::Y)))))
       (ERROR NIL T)
       (:NO-ERROR (ITERATE.TEST::F ITERATE.TEST::X)
        (DECLARE (IGNORE ITERATE.TEST::F ITERATE.TEST::X)) NIL))
Expected value: T
Actual value: NIL.

Revision history for this message
Patrick Stein (nklein) wrote :

Also affects Allegro (acl-8.2a-linux-x64), but does not appear to involve macro expansion of RETURN:

    Test ITERATE.TEST::CODE-MOVEMENT.ELSE failed
    Form: (HANDLER-CASE (MACROEXPAND (QUOTE (ITERATE:ITER (ITERATE:FOR ITERATE.TEST::I ITERATE.TEST::FROM 1 ITERATE.TEST::TO 10) (LET ((ITERATE.TEST::X 3)) (ITERATE:ELSE (RETURN ITERATE.TEST::X)))))) (ERROR NIL T) (:NO-ERROR (ITERATE.TEST::F ITERATE.TEST::X) (DECLARE (IGNORE ITERATE.TEST::F ITERATE.TEST::X)) NIL))
    Expected value: T
    Actual value: NIL.

Patrick Stein (nklein)
tags: added: allegro ecl
tags: added: iterate
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.