Fix make-array transforms.
[sbcl.git] / tests / lambda-list.pure.lisp
index 3f202d7..3dd39db 100644 (file)
@@ -6,29 +6,43 @@
 ;;;; While most of SBCL is derived from the CMU CL system, the test
 ;;;; files (like this one) were written from scratch after the fork
 ;;;; from CMU CL.
-;;;; 
+;;;;
 ;;;; This software is in the public domain and is provided with
 ;;;; absolutely no warranty. See the COPYING and CREDITS files for
 ;;;; more information.
 
-(macrolet ((error-p (ll)
-             `(progn
-                (multiple-value-bind (result error) (ignore-errors (handler-bind ((error #'error))
-                                                                     (eval `(lambda ,',ll 'ok))))
-                  (unless (and (not result) error)
-                    (error "No error from lambda ~S." ',ll)))
-                (multiple-value-bind (result error) (ignore-errors (handler-bind ((error #'error))
-                                                                     (eval `(lambda (x) (destructuring-bind ,',ll x 'ok)))))
-                  (unless (and (not result) error)
-                    (error "No error from d-b ~S." ',ll))))))
-  (error-p (&aux (foo 1) &aux (bar 2)))
-  (error-p (&aux (foo 1) &key bar))
-  (error-p (&aux (foo 1) &optional bar))
-  (error-p (&aux (foo 1) &rest bar))
-  (error-p (&key foo &allow-other-keys &allow-other-keys))
-  (error-p (&key foo &key bar))
-  (error-p (&key foo &optional bar))
-  (error-p (&key foo &rest bar))
-  (error-p (&optional foo &optional bar))
-  (error-p (&rest foo &rest bar))
-  (error-p (&rest foo &optional bar)))
+(let ((*macroexpand-hook*
+       (compile nil
+                (lambda (fun form env)
+                  (handler-bind ((error (lambda (c)
+                                          (when (eq 'destructuring-bind (car form))
+                                            (throw 'd-b-error c)))))
+                    (funcall fun form env))))))
+  (macrolet ((maybe-funcall (&rest args)
+               ;; The evaluator will delay lambda-list checks until
+               ;; the lambda is actually called.
+               (if (eq sb-ext:*evaluator-mode* :interpret)
+                   `(funcall ,@args)
+                   `(progn ,@args)))
+             (error-p (ll)
+               `(progn
+                  (multiple-value-bind (result error)
+                      (ignore-errors (maybe-funcall (eval `(lambda ,',ll 'ok))))
+                    (unless (and (not result) error)
+                      (error "No error from lambda ~S." ',ll)))
+                  (catch 'd-b-error
+                    (maybe-funcall
+                     (eval `(lambda (x) (destructuring-bind ,',ll x 'ok)))
+                     nil)
+                    (error "No error from d-b ~S." ',ll)))))
+    (error-p (&aux (foo 1) &aux (bar 2)))
+    (error-p (&aux (foo 1) &key bar))
+    (error-p (&aux (foo 1) &optional bar))
+    (error-p (&aux (foo 1) &rest bar))
+    (error-p (&key foo &allow-other-keys &allow-other-keys))
+    (error-p (&key foo &key bar))
+    (error-p (&key foo &optional bar))
+    (error-p (&key foo &rest bar))
+    (error-p (&optional foo &optional bar))
+    (error-p (&rest foo &rest bar))
+    (error-p (&rest foo &optional bar))))