+;; Test that circularity detection works with pprint-logical-block
+;; (including when called through pprint-dispatch).
+(let ((*print-pretty* t)
+ (*print-circle* t)
+ (*print-pprint-dispatch* (copy-pprint-dispatch)))
+ (labels ((pprint-a (stream form &rest rest)
+ (declare (ignore rest))
+ (pprint-logical-block (stream form :prefix "<" :suffix ">")
+ (pprint-exit-if-list-exhausted)
+ (loop
+ (write (pprint-pop) :stream stream)
+ (pprint-exit-if-list-exhausted)
+ (write-char #\space stream)))))
+ (set-pprint-dispatch '(cons (eql a)) #'pprint-a)
+ (assert (string= "<A 1 2 3>"
+ (with-output-to-string (s)
+ (write '(a 1 2 3) :stream s))))
+ (assert (string= "#1=<A 1 #1# #2=#(2) #2#>"
+ (with-output-to-string (s)
+ (write '#2=(a 1 #2# #5=#(2) #5#) :stream s))))
+ (assert (string= "#1=(B #2=<A 1 #1# 2 3> #2#)"
+ (with-output-to-string (s)
+ (write '#3=(b #4=(a 1 #3# 2 3) #4#) :stream s))))))
+
+;; Test that a circular improper list inside a logical block works.
+(let ((*print-circle* t)
+ (*print-pretty* t))
+ (assert (string= "#1=(#2=(#2# . #3=(#1# . #3#)))"
+ (with-output-to-string (s)
+ (write '#1=(#2=(#2# . #3=(#1# . #3#))) :stream s)))))
+
+;;; Printing malformed defpackage forms without errors.
+(with-test (:name :pprint-defpackage)
+ (with-open-stream (null (make-broadcast-stream))
+ (pprint '(defpackage :foo nil))
+ (pprint '(defpackage :foo 42))))
+
+(with-test (:name :standard-pprint-dispatch-modified)
+ (assert
+ (eq :error
+ (handler-case (with-standard-io-syntax
+ (set-pprint-dispatch 'symbol (constantly nil))
+ :no-error)
+ (sb-int:standard-pprint-dispatch-table-modified-error ()
+ :error)))))
+
+(with-test (:name :pprint-defmethod-lambda-list-function)
+ (flet ((to-string (form)
+ (let ((string (with-output-to-string (s) (pprint form s))))
+ (assert (eql #\newline (char string 0)))
+ (subseq string 1))))
+ (assert (equal "(DEFMETHOD FOO ((FUNCTION CONS)) FUNCTION)"
+ (to-string `(defmethod foo ((function cons)) function))))
+ (assert (equal "(DEFMETHOD FOO :AFTER (FUNCTION CONS) FUNCTION)"
+ (to-string `(defmethod foo :after (function cons) function))))))
+\f