alex-gutev / cl-form-types

Library for determining the types of Common Lisp forms based on information stored in the environment.
MIT License
19 stars 1 forks source link

Pass variables and functions extracted from certain declarations to augment-environment #16

Closed digikar99 closed 1 year ago

digikar99 commented 1 year ago

SBCL (at least the recent versions) has this behavior that if sb-cltl2:augment-environment is passed a :declare argument containing functions or variables, then one may get undefined function or variable warnings if those functions and variables are also not passed on simultaneously.

CL-USER> (let* ((x 'x)
                (env (sb-cltl2:augment-environment nil))
                (env2 (sb-cltl2:augment-environment env
                                                    :function (list x)))
                (env3 (sb-cltl2:augment-environment
                       env2
                       :declare `((dynamic-extent (function ,x))))))
           (sb-cltl2:function-information x env3))
STYLE-WARNING: Unbound function declared DYNAMIC-EXTENT: #'X
:FUNCTION
T
NIL
CL-USER> (let* ((x 'x)
                (env (sb-cltl2:augment-environment nil))
                (env2 (sb-cltl2:augment-environment env
                                                    :function (list x)))
                (env3 (sb-cltl2:augment-environment
                       env2
                       :function (list x)
                       :declare `((dynamic-extent (function ,x))))))
           (sb-cltl2:function-information x env3))
:FUNCTION
T
((DYNAMIC-EXTENT . T))

This PR helps avoid these warnings.