X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fir1final.lisp;h=c843505170a4c1d3b90433f6c778ee0df13c63a7;hb=dfa55a883f94470267b626dae77ce7e7dfac3df6;hp=92548d97bd6fd26d170f7c507af34f59722340a5;hpb=1d941f3d8f343f5779526b66b2358b4893a17281;p=sbcl.git diff --git a/src/compiler/ir1final.lisp b/src/compiler/ir1final.lisp index 92548d9..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,8 +58,8 @@ (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)) @@ -72,20 +72,28 @@ (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))))))) + (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) @@ -101,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.