mirror of
git://git.code.sf.net/p/sbcl/sbcl
synced 2026-09-10 07:26:40 -04:00
sb-walker: shadow symbol-macrolet with SPECIAL.
Like the compiler does. Fixes lp#1053198
This commit is contained in:
parent
55c0a64954
commit
a1725ee23b
|
|
@ -800,11 +800,21 @@ instead of
|
|||
(let ((type (car declaration))
|
||||
(name (cadr declaration))
|
||||
(args (cddr declaration)))
|
||||
(if (walked-var-declaration-p type)
|
||||
(cond ((eq type 'special)
|
||||
(loop for name in (cdr declaration)
|
||||
for var = (or (var-lexical-p name env)
|
||||
name)
|
||||
do
|
||||
(note-declaration `(special ,(or var name)) env)
|
||||
;; Shadow
|
||||
(when (variable-symbol-macro-p name env)
|
||||
(note-var-binding name env))))
|
||||
((walked-var-declaration-p type)
|
||||
(note-declaration `(,type
|
||||
,(or (var-lexical-p name env) name)
|
||||
,.args)
|
||||
env)
|
||||
env))
|
||||
(t
|
||||
(let ((canonical (sb-c::canonized-decl-spec declaration)))
|
||||
(typecase canonical
|
||||
((cons (eql type) cons)
|
||||
|
|
@ -818,7 +828,7 @@ instead of
|
|||
(cadddr (env-lock env)))
|
||||
(note-declaration canonical env)))))
|
||||
(t
|
||||
(note-declaration canonical env)))))
|
||||
(note-declaration canonical env))))))
|
||||
(push declaration declarations)))
|
||||
(recons body
|
||||
form
|
||||
|
|
|
|||
|
|
@ -1063,3 +1063,13 @@ Form: C Context: EVAL; lexically bound
|
|||
(declare (fixnum x))
|
||||
(incf x 1))))
|
||||
:allow-notes nil))
|
||||
|
||||
(defmethod symbol-macrolet-special (s)
|
||||
(declare (special s))
|
||||
(symbol-macrolet ((s (slot-value x 'x)))
|
||||
(let ()
|
||||
(declare (special s))
|
||||
s)))
|
||||
|
||||
(test-util:with-test (:name :symbol-macrolet-declarations)
|
||||
(assert (eql (symbol-macrolet-special 10) 10)))
|
||||
|
|
|
|||
Loading…
Reference in a new issue