bug#81564: Possible bug when binding dynamically with an existing lexical binding

Thuna <[email protected]> Thu, 06 Aug 2026 02:23:40 +0200
Newsgroups gmane.emacs.bugs
Message-ID <[email protected]>
The code

  (let ((x 2)) (defvar x) (let ((x 10)) x))

returns 2, which seems extremely unintuitive to me, if not an outright
bug.

The unintuitive thing is that the `defvar' effects not the first binding
but the second binding, but if that is simply how it works then I don't
have anything to say about it.

The possible bug is that the `x' that returns is referring to the
lexical `x' bound in the outer `let', instead of referring to the
dynamic `x' bound in the inner `let'.

I think what is happening is that when `x' reaches `eval_sub', it looks
for the lexical value first, assuming that it wouldn't have a lexical
value if it was marked dynamic, not taking into account the situation
where it was marked dynamic only locally with a lexical binding around.

I am unsure if this is a bug or simply an illegal way to use `defvar'.