0.7.9.15:
[sbcl.git] / tests / clos.impure.lisp
index ffdbd3b..b4462cd 100644 (file)
 (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)