0.7.9.15:
[sbcl.git] / tests / clos.impure.lisp
index eb3c5d4..b4462cd 100644 (file)
   ;; forbidden &AUX
   (dislike '(defgeneric gf-for-ll-test-13 (x y z &optional a &aux g h)))
   (like    '(defgeneric gf-for-ll-test-14 (x y z &optional a)))
+  (dislike '(defgeneric gf-for-ll-test-bare-aux-1 (x &aux)))
+  (like    '(defgeneric gf-for-ll-test-bare-aux-2 (x)))
   ;; also can't use bogoDEFMETHODish type-qualifier-ish decorations
   ;; on required arguments
   (dislike '(defgeneric gf-for-11-test-15 ((arg t))))
 (defmethod gf (obj)
   obj)
 \f
+;;; Until sbcl-0.7.7.20, some conditions weren't being signalled, and
+;;; some others were of the wrong type:
+(macrolet ((assert-program-error (form)
+            `(multiple-value-bind (value error)
+                 (ignore-errors ,form)
+               (assert (null value))
+               (assert (typep error 'program-error)))))
+  (assert-program-error (defclass foo001 () (a b a)))
+  (assert-program-error (defclass foo002 () 
+                         (a b) 
+                         (:default-initargs x 'a x 'b)))
+  (assert-program-error (defclass foo003 ()
+                         ((a :allocation :class :allocation :class))))
+  (assert-program-error (defclass foo004 ()
+                         ((a :silly t))))
+  ;; and some more, found by Wolfhard Buss and fixed for cmucl by Gerd
+  ;; Moellmann in 0.7.8.x:
+  (assert-program-error (progn
+                         (defmethod odd-key-args-checking (&key (key 42)) key)
+                         (odd-key-args-checking 3)))
+  (assert (= (odd-key-args-checking) 42))
+  (assert (eq (odd-key-args-checking :key t) t)))
+\f
+;;; DOCUMENTATION's argument-precedence-order wasn't being faithfully
+;;; preserved through the bootstrap process until sbcl-0.7.8.39.
+;;; (thanks to Gerd Moellmann)
+(let ((answer (documentation '+ 'function)))
+  (assert (stringp answer))
+  (defmethod documentation ((x (eql '+)) y) "WRONG")
+  (assert (string= (documentation '+ 'function) answer)))
+\f
+;;; only certain declarations are permitted in DEFGENERIC
+(macrolet ((assert-program-error (form)
+            `(multiple-value-bind (value error)
+                 (ignore-errors ,form)
+               (assert (null value))
+               (assert (typep error 'program-error)))))
+  (assert-program-error (defgeneric bogus-declaration (x)
+                         (declare (special y))))
+  (assert-program-error (defgeneric bogus-declaration2 (x)
+                         (declare (notinline concatenate)))))
+;;; CALL-NEXT-METHOD should call NO-NEXT-METHOD if there is no next
+;;; method.
+(defmethod no-next-method-test ((x integer)) (call-next-method))
+(assert (null (ignore-errors (no-next-method-test 1))))
+(defmethod no-next-method ((g (eql #'no-next-method-test)) m &rest args)
+  'success)
+(assert (eq (no-next-method-test 1) 'success))
+(assert (null (ignore-errors (no-next-method-test 'foo))))
+\f
+;;; regression test for bug 176, following a fix that seems
+;;; simultaneously to fix 140 while not exposing 176 (by Gerd
+;;; Moellmann, merged in sbcl-0.7.9.12).
+(dotimes (i 10)
+  (let ((lastname (intern (format nil "C176-~D" (1- i))))
+        (name (intern (format nil "C176-~D" i))))
+  (eval `(defclass ,name
+             (,@(if (= i 0) nil (list lastname)))
+           ()))
+  (eval `(defmethod initialize-instance :after ((x ,name) &rest any)
+           (declare (ignore any))))))
+(defclass b176 () (aslot-176))
+(defclass c176-0 (b176) ())
+(assert (= 1 (setf (slot-value (make-instance 'c176-9) 'aslot-176) 1)))
+\f
+;;; DEFINE-METHOD-COMBINATION was over-eager at checking for duplicate
+;;; primary methods:
+(define-method-combination dmc-test-mc (&optional (order :most-specific-first))
+  ((around (:around))
+   (primary (dmc-test-mc) :order order :required t))
+   (let ((form (if (rest primary)
+                   `(and ,@(mapcar #'(lambda (method)
+                                       `(call-method ,method))
+                                   primary))
+                   `(call-method ,(first primary)))))
+     (if around
+         `(call-method ,(first around)
+                       (,@(rest around)
+                        (make-method ,form)))
+         form)))
+
+(defgeneric dmc-test-mc (&key k)
+  (:method-combination dmc-test-mc))
+
+(defmethod dmc-test-mc dmc-test-mc (&key k)
+          k)
+
+(dmc-test-mc :k 1)
+\f
 ;;;; success
 
 (sb-ext:quit :unix-status 104)