1.0.5.5: &ENVIRONMENT fixes
authorNikodemus Siivola <nikodemus@random-state.net>
Sun, 29 Apr 2007 16:19:29 +0000 (16:19 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Sun, 29 Apr 2007 16:19:29 +0000 (16:19 +0000)
 * Place the binding for &ENVIRONMENT in the correct scope for
   ignore declarations.

 * Place the local-decls return value from PARSE-DEFMACRO in the
   right scope in DEFSETF.

 * Tests.

NEWS
src/code/early-setf.lisp
src/code/parse-defmacro.lisp
tests/compiler.impure.lisp
tests/setf.impure.lisp
version.lisp-expr

diff --git a/NEWS b/NEWS
index bf72037..f565ca5 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,10 @@ changes in sbcl-1.0.6 relative to sbcl-1.0.5:
   * bug fix: GC race condition occasionally resulting in crashes with
     the error message "SIG_STOP_FOR_GC blocked at a bad place" has been
     fixed.
+  * bug fix: &ENVIRONMENT variables in macro lambda lists can now be
+    declared ignored.
+  * bug fix: DEFSETF lambda lists without &ENVIRONMENT no longer cause
+    a STYLE-WARNING to be signalled (regression from 1.0.4.)
 
 changes in sbcl-1.0.5 relative to sbcl-1.0.4:
   * incompatible change: removed writer methods for host-ent-name,
index 0f63965..d184133 100644 (file)
@@ -405,10 +405,9 @@ GET-SETF-EXPANSION directly."
                   (assign-setf-macro
                    ',access-fn
                    (lambda (,access-form-var ,env-var)
-                     (declare (ignorable ,env-var))
+                     ,@local-decs
                      (%defsetf ,access-form-var ,(length store-variables)
                                (lambda (,whole-var)
-                                 ,@local-decs
                                  ,body)))
                    nil
                    ',doc))))))
index eea2801..fe30d12 100644 (file)
           (parse-defmacro-lambda-list lambda-list whole-var name context
                                       :error-fun error-fun
                                       :anonymousp anonymousp)
-        (values `(let* (,@(when env-arg-used
-                            `((,*env-var* ,env-arg-name)))
-                        ,@(nreverse *system-lets*))
+        (values `(let* (,@(nreverse *system-lets*))
                    ,@(when *ignorable-vars*
                        `((declare (ignorable ,@*ignorable-vars*))))
                    ,@*arg-tests*
-                   (let* ,(nreverse *user-lets*)
+                   (let* (,@(when env-arg-used
+                            `((,*env-var* ,env-arg-name)))
+                          ,@(nreverse *user-lets*))
                      ,@declarations
                      ,@(if wrap-block
                            `((block ,(fun-name-block-name name)
index 6b01a47..4dd6b02 100644 (file)
               (program-error ()
                 :ok))))
 
+;;; ignore &environment
+(handler-bind ((style-warning #'error))
+  (compile nil '(lambda ()
+                 (defmacro macro-ignore-env (&environment env)
+                   (declare (ignore env))
+                   :foo)))
+  (compile nil '(lambda ()
+                 (defmacro macro-no-env ()
+                   :foo))))
+
 ;;; success
index 0867029..0b8a867 100644 (file)
               (error ()
                 :error))))
 
+(handler-bind ((style-warning #'error))
+  (compile nil '(lambda ()
+                 (defsetf test-defsetf-no-env (foo) (new)
+                   `(set-foo ,foo ,new))))
+  (compile nil '(lambda ()
+                 (defsetf test-defsetf-ignore-env (foo &environment env) (new)
+                   (declare (ignore env))
+                   `(set-foo ,foo ,new)))))
+
 ;;; success
index 3da9d7f..76560d8 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"1.0.5.4"
+"1.0.5.5"