X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fcharacter.pure.lisp;h=742723456c5254e220ffc4871651edfcc22e4a7a;hb=d7875c296a4988e9f27e2776237884deb1984c62;hp=37f4b49fe25ee416661305b3f222f9b86fb1140e;hpb=cfc1753e593943c7d0eb8d0621158948917f8304;p=sbcl.git diff --git a/tests/character.pure.lisp b/tests/character.pure.lisp index 37f4b49..7427234 100644 --- a/tests/character.pure.lisp +++ b/tests/character.pure.lisp @@ -73,3 +73,70 @@ (assert name)))) (assert (null (name-char 'foo))) + +;;; Between 1.0.4.53 and 1.0.4.69 character untagging was broken on +;;; x86-64 if the result of the VOP was allocated on the stack, failing +;;; an aver in the compiler. +(with-test (:name :character-untagging) + (compile nil + '(lambda (c0 c1 c2 c3 c4 c5 c6 c7 + c8 c9 ca cb cc cd ce cf) + (declare (type character c0 c1 c2 c3 c4 c5 c6 c7 + c8 c9 ca cb cc cd ce cf)) + (char< c0 c1 c2 c3 c4 c5 c6 c7 + c8 c9 ca cb cc cd ce cf)))) + +;;; Characters could be coerced to subtypes of CHARACTER to which they +;;; don't belong. Also, character designators that are not characters +;;; could be coerced to proper subtypes of CHARACTER. +(with-test (:name :bug-841312) + ;; First let's make sure that the conditions hold that make the test + ;; valid: #\Nak is a BASE-CHAR, which at the same time ensures that + ;; STANDARD-CHAR is a proper subtype of BASE-CHAR, and under + ;; #+SB-UNICODE the character with code 955 exists and is not a + ;; BASE-CHAR. + (assert (typep #\Nak 'base-char)) + #+sb-unicode + (assert (let ((c (code-char 955))) + (and c (not (typep c 'base-char))))) + ;; Test the formerly buggy coercions: + (macrolet ((assert-coerce-type-error (object type) + `(assert (raises-error? (coerce ,object ',type) + type-error)))) + (assert-coerce-type-error #\Nak standard-char) + (assert-coerce-type-error #\a extended-char) + #+sb-unicode + (assert-coerce-type-error (code-char 955) base-char) + (assert-coerce-type-error 'a standard-char) + (assert-coerce-type-error "a" standard-char)) + ;; The following coercions still need to be possible: + (macrolet ((assert-coercion (object type) + `(assert (typep (coerce ,object ',type) ',type)))) + (assert-coercion #\a standard-char) + (assert-coercion #\Nak base-char) + #+sb-unicode + (assert-coercion (code-char 955) character) + (assert-coercion 'a character) + (assert-coercion "a" character))) + +(with-test (:name :bug-994487) + (let ((f (compile nil `(lambda (char) + (code-char (1+ (char-code char))))))) + (assert (equal `(function (t) (values (sb-kernel:character-set + ((1 . ,(1- char-code-limit)))) + &optional)) + (sb-impl::%fun-type f))))) + +(with-test (:name (:case-insensitive-char-comparisons :eacute)) + (assert (char-equal (code-char 201) (code-char 233)))) + +(with-test (:name (:case-insensitive-char-comparisons :exhaustive)) + (dotimes (i char-code-limit) + (let* ((char (code-char i)) + (down (char-downcase char)) + (up (char-upcase char))) + (assert (char-equal char char)) + (when (char/= char down) + (assert (char-equal char down))) + (when (char/= char up) + (assert (char-equal char up))))))