0.7.12.16:
[sbcl.git] / src / compiler / ctype.lisp
index 35538ca..97923ac 100644 (file)
 ;;; explain the result. We bind *COMPILER-ERROR-CONTEXT* to the
 ;;; combination node so that COMPILER-WARNING and related functions
 ;;; will do the right thing if they are supplied.
-(defun valid-function-use (call type &key
-                               ((:argument-test *ctype-test-fun*) #'csubtypep)
-                               (result-test #'values-subtypep)
-                               (strict-result nil)
-                               ((:lossage-fun *lossage-fun*))
-                               ((:unwinnage-fun *unwinnage-fun*)))
+(defun valid-fun-use (call type &key
+                          ((:argument-test *ctype-test-fun*) #'csubtypep)
+                          (result-test #'values-subtypep)
+                          (strict-result nil)
+                          ((:lossage-fun *lossage-fun*))
+                          ((:unwinnage-fun *unwinnage-fun*)))
   (declare (type function result-test) (type combination call)
           (type fun-type type))
   (let* ((*lossage-detected* nil)
 
       (try-type-intersections (vars) (res) where))))
 
-;;; Check that Type doesn't specify any funny args, and do the
+;;; Check that TYPE doesn't specify any funny args, and do the
 ;;; intersection.
 (defun find-lambda-types (lambda type where)
   (declare (type clambda lambda) (type fun-type type) (string where))
         ((not really-assert) t)
         (t
          (when atype
-           (assert-continuation-type (return-result return) atype))
+           (assert-continuation-type (return-result return) atype
+                                      (lexenv-policy (functional-lexenv functional))))
          (loop for var in vars and type in types do
            (cond ((basic-var-sets var)
                   (when (and unwinnage-fun
                   (dolist (ref (leaf-refs var))
                     (derive-node-type ref type)))))
          t))))))
+
+(defun assert-global-function-definition-type (name fun)
+  (declare (type functional fun))
+  (let ((type (info :function :type name))
+        (where (info :function :where-from name)))
+    (when (eq where :declared)
+      (setf (leaf-type fun) type)
+      (assert-definition-type fun type
+                              :unwinnage-fun #'compiler-note
+                              :where "proclamation"))))
+\f
+;;;; FIXME: Move to some other file.
+(defun check-catch-tag-type (tag)
+  (declare (type continuation tag))
+  (let ((ctype (continuation-type tag)))
+    (when (csubtypep ctype (specifier-type '(or number character)))
+      (compiler-style-warn "~@<using ~S of type ~S as a catch tag (which ~
+                            tends to be unportable because THROW and CATCH ~
+                            use EQ comparison)~@:>"
+                          (continuation-source tag)
+                          (type-specifier (continuation-type tag))))))