X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcompiler%2Fir1final.lisp;h=c843505170a4c1d3b90433f6c778ee0df13c63a7;hb=872175cd9cb5b4966a36d4bd92421cc407a0355b;hp=3d20068694021a3d7b29774c19d1e0cf6a5ffe31;hpb=cea4896b2482b7b2b429c1631d774b4cfbc0efba;p=sbcl.git diff --git a/src/compiler/ir1final.lisp b/src/compiler/ir1final.lisp index 3d20068..c843505 100644 --- a/src/compiler/ir1final.lisp +++ b/src/compiler/ir1final.lisp @@ -12,10 +12,11 @@ (in-package "SB!C") -;;; Give the user grief about optimizations that we weren't able to do. It -;;; is assumed that they want to hear, or there wouldn't be any entries in the -;;; table. If the node has been deleted or is no longer a known call, then do -;;; nothing; some other optimization must have gotten to it. +;;; Give the user grief about optimizations that we weren't able to +;;; do. It is assumed that the user wants to hear about this, or there +;;; wouldn't be any entries in the table. If the node has been deleted +;;; or is no longer a known call, then do nothing; some other +;;; optimization must have gotten to it. (defun note-failed-optimization (node failures) (declare (type combination node) (list failures)) (unless (or (node-deleted node) @@ -26,11 +27,11 @@ (note (transform-note (car failure)))) (cond ((consp what) - (compiler-note "unable to ~A because:~%~6T~?" + (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) @@ -38,10 +39,17 @@ (valid-function-use node what :warning-function #'frob :error-function #'frob)) - - (compiler-note "unable to ~A due to type uncertainty:~@ - ~{~6T~?~^~&~}" - note (messages)))))))))) + (compiler-note "~@" + note (messages)))) + ;; As best I can guess, it's OK to fall off the end here + ;; because if it's not a VALID-FUNCTION-USE, the user + ;; doesn't want to hear about it. The things I caught when + ;; I put ERROR "internal error: unexpected FAILURE=~S" here + ;; didn't look like things we need to report. -- WHN 2001-02-07 + )))))) ;;; For each named function with an XEP, note the definition of that ;;; name, and add derived type information to the info environment. We @@ -50,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) @@ -95,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.