X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fir1final.lisp;h=c843505170a4c1d3b90433f6c778ee0df13c63a7;hb=dfa55a883f94470267b626dae77ce7e7dfac3df6;hp=98548ee7172f011ea3b4a8e0573265aa6454eb54;hpb=92f6ecdad23faf8b1677c24aa57c5eaec96d9c82;p=sbcl.git diff --git a/src/compiler/ir1final.lisp b/src/compiler/ir1final.lisp index 98548ee..c843505 100644 --- a/src/compiler/ir1final.lisp +++ b/src/compiler/ir1final.lisp @@ -30,8 +30,8 @@ (compiler-note "~@" 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) @@ -58,36 +58,42 @@ (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 "~@" + (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) @@ -103,8 +109,8 @@ (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.