0.6.11.34:
[sbcl.git] / src / compiler / ir1final.lisp
index 98548ee..c843505 100644 (file)
@@ -30,8 +30,8 @@
            (compiler-note "~@<unable to ~2I~_~A ~I~_because: ~2I~_~?~:>"
                           note (first what) (rest what)))
           ((valid-function-use node what
-                               :argument-test #'types-intersect
-                               :result-test #'values-types-intersect)
+                               :argument-test #'types-equal-or-intersect
+                               :result-test #'values-types-equal-or-intersect)
            (collect ((messages))
              (flet ((frob (string &rest stuff)
                       (messages string)
 (defun finalize-xep-definition (fun)
   (let* ((leaf (functional-entry-function fun))
         (name (leaf-name leaf))
-        (dtype (definition-type leaf)))
-    (setf (leaf-type leaf) dtype)
+        (defined-ftype (definition-type leaf)))
+    (setf (leaf-type leaf) defined-ftype)
     (when (or (and name (symbolp name))
              (and (consp name) (eq (car name) 'setf)))
       (let* ((where (info :function :where-from name))
             (*compiler-error-context* (lambda-bind (main-entry leaf)))
             (global-def (gethash name *free-functions*))
-            (global-p
-             (and (defined-function-p global-def)
-                  (eq (defined-function-functional global-def) leaf))))
+            (global-p (defined-function-p global-def)))
        (note-name-defined name :function)
        (when global-p
          (remhash name *free-functions*))
        (ecase where
          (:assumed
           (let ((approx-type (info :function :assumed-type name)))
-            (when (and approx-type (function-type-p dtype))
-              (valid-approximate-type approx-type dtype))
-            (setf (info :function :type name) dtype)
+            (when (and approx-type (function-type-p defined-ftype))
+              (valid-approximate-type approx-type defined-ftype))
+            (setf (info :function :type name) defined-ftype)
             (setf (info :function :assumed-type name) nil))
           (setf (info :function :where-from name) :defined))
-         (:declared); Just keep declared type.
+         (:declared
+          (let ((declared-ftype (info :function :type name)))
+            (unless (defined-ftype-matches-declared-ftype-p
+                      defined-ftype declared-ftype)
+              (note-lossage "~@<The previously declared FTYPE~2I ~_~S~I ~_~
+                              conflicts with the definition type ~2I~_~S~:>"
+                            (type-specifier declared-ftype)
+                            (type-specifier defined-ftype)))))
          (:defined
-          (when global-p
-            (setf (info :function :type name) dtype)))))))
+           (when global-p
+             (setf (info :function :type name) defined-ftype)))))))
   (values))
 
-;;; Find all calls in Component to assumed functions and update the assumed
-;;; type information. This is delayed until now so that we have the best
-;;; possible information about the actual argument types.
+;;; Find all calls in COMPONENT to assumed functions and update the
+;;; assumed type information. This is delayed until now so that we
+;;; have the best possible information about the actual argument
+;;; types.
 (defun note-assumed-types (component name var)
   (when (and (eq (leaf-where-from var) :assumed)
             (not (and (defined-function-p var)
            (setq atype (note-function-use dest atype)))))
       (setf (info :function :assumed-type name) atype))))
 
-;;; Do miscellaneous things that we want to do once all optimization has
-;;; been done:
+;;; Do miscellaneous things that we want to do once all optimization
+;;; has been done:
 ;;;  -- Record the derived result type before the back-end trashes the
 ;;;     flow graph.
 ;;;  -- Note definition of any entry points.