- (let* ((leaf (functional-entry-function fun))
- (name (leaf-name leaf))
- (dtype (definition-type leaf)))
- (setf (leaf-type leaf) dtype)
- (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 (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)
- (setf (info :function :assumed-type name) nil))
- (setf (info :function :where-from name) :defined))
- (:declared
- ;; Check that derived type matches declared type.
- (let ((type (info :function :type name)))
- (when (and type (function-type-p dtype))
- (let ((type-returns (function-type-returns type))
- (dtype-returns (function-type-returns dtype))
- (*error-function* #'compiler-warning))
- (unless (values-types-equal-or-intersect type-returns
- dtype-returns)
- (note-lossage "The result type from previous declaration:~% ~S~@
- conflicts with the result type:~% ~S"
- (type-specifier type-returns)
- (type-specifier dtype-returns))))))
- ;; (Regardless of what happens, we keep the declared type.)
- )
- (:defined
- (when global-p
- (setf (info :function :type name) dtype)))))))
+ (let* ((leaf (functional-entry-fun fun))
+ (defined-ftype (definition-type leaf)))
+ (setf (leaf-type leaf) defined-ftype)
+ (when (and (leaf-has-source-name-p leaf)
+ (eq (leaf-source-name leaf) (functional-debug-name leaf)))
+ (let ((source-name (leaf-source-name leaf)))
+ (let* ((where (info :function :where-from source-name))
+ (*compiler-error-context* (lambda-bind (main-entry leaf)))
+ (global-def (gethash source-name *free-funs*))
+ (global-p (defined-fun-p global-def)))
+ (note-name-defined source-name :function)
+ (when global-p
+ (remhash source-name *free-funs*))
+ (ecase where
+ (:assumed
+ (let ((approx-type (info :function :assumed-type source-name)))
+ (when (and approx-type (fun-type-p defined-ftype))
+ (valid-approximate-type approx-type defined-ftype))
+ (setf (info :function :type source-name) defined-ftype)
+ (setf (info :function :assumed-type source-name) nil))
+ (setf (info :function :where-from source-name) :defined))
+ (:declared
+ (let ((declared-ftype (info :function :type source-name)))
+ (unless (defined-ftype-matches-declared-ftype-p
+ defined-ftype declared-ftype)
+ (compiler-style-warn
+ "~@<The previously declared FTYPE~2I ~_~S~I ~_~
+ conflicts with the definition type ~2I~_~S~:>"
+ (type-specifier declared-ftype)
+ (type-specifier defined-ftype)))))
+ (:defined
+ (setf (info :function :type source-name) defined-ftype)))))))