(list (mext '(1 2))
(mint (1 2)))))
'((:MEXT 1 2) (:MINT (:MEXT 1 2)))))
+
+;;; bug 48c: SYMBOL-MACROLET should signal PROGRAM-ERROR if introduced
+;;; symbol is declared to be SPECIAL
+(multiple-value-bind (result error)
+ (ignore-errors (funcall (lambda ()
+ (symbol-macrolet ((s '(1 2)))
+ (declare (special s))
+ s))))
+ (assert (null result))
+ (assert (typep error 'program-error)))
+
+;;; ECASE should treat a bare T as a literal key
+(multiple-value-bind (result error)
+ (ignore-errors (ecase 1 (t 0)))
+ (assert (null result))
+ (assert (typep error 'type-error)))
+
+(multiple-value-bind (result error)
+ (ignore-errors (ecase 1 (t 0) (1 2)))
+ (assert (eql result 2))
+ (assert (null error)))
+
+;;; FTYPE should accept any functional type specifier
+(compile nil '(lambda (x) (declare (ftype function f)) (f x)))
+
+;;; FUNCALL of special operators and macros should signal an
+;;; UNDEFINED-FUNCTION error
+(multiple-value-bind (result error)
+ (ignore-errors (funcall 'quote 1))
+ (assert (null result))
+ (assert (typep error 'undefined-function))
+ (assert (eq (cell-error-name error) 'quote)))
+(multiple-value-bind (result error)
+ (ignore-errors (funcall 'and 1))
+ (assert (null result))
+ (assert (typep error 'undefined-function))
+ (assert (eq (cell-error-name error) 'and)))
+
+;;; PSETQ should behave when given complex symbol-macro arguments
+(multiple-value-bind (sequence index)
+ (symbol-macrolet ((x (aref a (incf i)))
+ (y (aref a (incf i))))
+ (let ((a (copy-seq #(0 1 2 3 4 5 6 7 8 9)))
+ (i 0))
+ (psetq x (aref a (incf i))
+ y (aref a (incf i)))
+ (values a i)))
+ (assert (equalp sequence #(0 2 2 4 4 5 6 7 8 9)))
+ (assert (= index 4)))
+
+(multiple-value-bind (result error)
+ (ignore-errors
+ (let ((x (list 1 2)))
+ (psetq (car x) 3)
+ x))
+ (assert (null result))
+ (assert (typep error 'program-error)))
+
+;;; COPY-SEQ should work on known-complex vectors:
+(assert (equalp #(1)
+ (let ((v (make-array 0 :fill-pointer 0)))
+ (vector-push-extend 1 v)
+ (copy-seq v))))
+
+;;; to support INLINE functions inside MACROLET, it is necessary for
+;;; FUNCTION-LAMBDA-EXPRESSION to return a proper lambda expression in
+;;; certain circumstances, one of which is when compile is called from
+;;; top-level.
+(assert (equal
+ (function-lambda-expression
+ (compile nil '(lambda (x) (block nil (print x)))))
+ '(lambda (x) (block nil (print x)))))