(assert (equal (ayup-duplicate-keys-are-ok-i-see-the-lite :k 112) 112))
(assert (equal (ayup-duplicate-keys-are-ok-i-see-the-lite :k 'x :k 'y) 'x))
+;;; As reported by Alexey Dejneka (sbcl-devel 2002-01-30), in
+;;; sbcl-0.7.1 plus his patch (i.e. essentially sbcl-0.7.1.2), the
+;;; compiler barfed on this, blowing up in FIND-IN-PHYSENV looking for
+;;; the LAMBDA-VAR named NUM. That was fixed in sbcl-0.7.1.3.
+(defun parse-num (index)
+ (let (num x)
+ (flet ((digs ()
+ (setq num index))
+ (z ()
+ (let ()
+ (setq x nil))))
+ (when (and (digs) (digs)) x))))
+
+;;; Bug 132: The compiler used to fail to compile INTEGER-valued CATCH
+;;; tags. This was fixed by Alexey Dejneka in sbcl-0.7.1.14. (INTEGER
+;;; catch tags are still a bad idea because EQ is used to compare
+;;; tags, and EQ comparison on INTEGERs is unportable; but now it's a
+;;; compiler warning instead of a failure to compile.)
+(defun foo ()
+ (catch 0 (print 1331)))
+
+;;; Bug 150: In sbcl-0.7.1.15, compiling this code caused a failure in
+;;; SB-C::ADD-TEST-CONSTRAINTS:
+;;; The value NIL is not of type SB-C::CONTINUATION.
+;;; This bug was fixed by APD in sbcl-0.7.1.30.
+(defun bug150-test1 ()
+ (let* ()
+ (flet ((wufn () (glorp table1 4.9)))
+ (gleep *uustk* #'wufn "#1" (list)))
+ (if (eql (lo foomax 3.2))
+ (values)
+ (error "not ~S" '(eql (lo foomax 3.2))))
+ (values)))
+;;; A simpler test case for bug 150: The compiler died with the
+;;; same type error when trying to compile this.
+(defun bug150-test2 ()
+ (let ()
+ (<)))
+\f
+;;;; tests not in the problem domain, but of the consistency of the
+;;;; compiler machinery itself
+
+(in-package "SB-C")
+
+;;; Hunt for wrong-looking things in fundamental compiler definitions,
+;;; and gripe about them.
+;;;
+;;; FIXME: It should be possible to (1) repair the things that this
+;;; code gripes about, and then (2) make the code signal errors
+;;; instead of just printing complaints to standard output, in order
+;;; to prevent the code from later falling back into disrepair.
+(defun grovel-results (function)
+ (dolist (template (fun-info-templates (info :function :info function)))
+ (when (template-more-results-type template)
+ (format t "~&Template ~A has :MORE results, and translates ~A.~%"
+ (template-name template)
+ function)
+ (return nil))
+ (when (eq (template-result-types template) :conditional)
+ ;; dunno.
+ (return t))
+ (let ((types (template-result-types template))
+ (result-type (fun-type-returns (info :function :type function))))
+ (cond
+ ((values-type-p result-type)
+ (do ((ltypes (append (args-type-required result-type)
+ (args-type-optional result-type))
+ (rest ltypes))
+ (types types (rest types)))
+ ((null ltypes)
+ (unless (null types)
+ (format t "~&More types than ltypes in ~A, translating ~A.~%"
+ (template-name template)
+ function)
+ (return nil)))
+ (when (null types)
+ (unless (null ltypes)
+ (format t "~&More ltypes than types in ~A, translating ~A.~%"
+ (template-name template)
+ function)
+ (return nil)))))
+ ((eq result-type (specifier-type nil))
+ (unless (null types)
+ (format t "~&Template ~A returns values for function ~A with RESULT-TYPE NIL.~%"
+ (template-name template)
+ function)
+ (return nil)))
+ ((/= (length types) 1)
+ (format t "~&Template ~A isn't returning 1 value for ~A.~%"
+ (template-name template)
+ function)
+ (return nil))
+ (t t)))))
+(defun identify-suspect-vops (&optional (env (first
+ (last *info-environment*))))
+ (do-info (env :class class :type type :name name :value value)
+ (when (and (eq class :function) (eq type :type))
+ ;; OK, so we have an entry in the INFO database. Now, if ...
+ (let* ((info (info :function :info name))
+ (templates (and info (fun-info-templates info))))
+ (when templates
+ ;; ... it has translators
+ (grovel-results name))))))
+(identify-suspect-vops)
+\f
;;; success
(quit :unix-status 104)