* "reference to free variable" only during initialization @ 2017-01-16 23:00 Yuri D'Elia 2017-01-16 23:47 ` Noam Postavsky 0 siblings, 1 reply; 11+ messages in thread From: Yuri D'Elia @ 2017-01-16 23:00 UTC (permalink / raw) To: emacs-devel I have an oddball warning that I have an hard time debugging. I upgraded to emacs 25.1.1 on a debian desktop recently, and started to get: Warning (bytecomp): reference to free variable ‘isearchp-reg-beg’ during startup. The warning is generated by requiring modeline-posn.el[1], which is using ``isearchp-reg-beg`` (actually defvar-ed early on) inside a defadvice form. Is this expected? Warning aside, the intriguing part is that the warning /only/ occurs when (require 'modeline-posn) is evaluated in my ~/.emacs, but is not emitted instead when doing the "allegedly" equivalent: emacs -q -l ~/.emacs even when ~/.emacs itself only contains: (add-to-list 'load-path "path-to-modeline.el") (require 'modeline-posn) or when simply doing an eval in a fresh emacs -q session The remaining difference is that emacs -q is skipping debian's system startup. But I cannot think of something that could influence the generation of a bytecomp warning. Any pointer before going further? [1] https://www.emacswiki.org/emacs/modeline-posn.el ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: "reference to free variable" only during initialization 2017-01-16 23:00 "reference to free variable" only during initialization Yuri D'Elia @ 2017-01-16 23:47 ` Noam Postavsky 2017-01-25 17:15 ` Yuri D'Elia 0 siblings, 1 reply; 11+ messages in thread From: Noam Postavsky @ 2017-01-16 23:47 UTC (permalink / raw) To: Yuri D'Elia; +Cc: Emacs developers On Mon, Jan 16, 2017 at 6:00 PM, Yuri D'Elia <wavexx@thregr.org> wrote: > I have an oddball warning that I have an hard time debugging. I upgraded > to emacs 25.1.1 on a debian desktop recently, and started to get: > > Warning (bytecomp): reference to free variable ‘isearchp-reg-beg’ > > during startup. The warning is generated by requiring > modeline-posn.el[1], which is using ``isearchp-reg-beg`` (actually > defvar-ed early on) inside a defadvice form. > > Is this expected? There is some unexpected interaction of defadvice with delayed warnings. I had noticed this a while back, but never got around to fixing it. `ad-compile-function' binds `warning-suppress-types', but if warnings are delayed, then the warning call happens after that binding is finished. > > Warning aside, the intriguing part is that the warning /only/ occurs > when (require 'modeline-posn) is evaluated in my ~/.emacs, but is not > emitted instead when doing the "allegedly" equivalent: > > emacs -q -l ~/.emacs In this case, the warnings are not delayed. If you set after-init-time to nil, then warnings will be delayed, so the same problem should occur, I think: emacs -q --eval '(setq after-init-time nil)' -l ~/.emacs I think Bug #24106 might be a similar case (and I'm pretty sure there's another older one where I initially noticed this, but I can't find it right now). ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: "reference to free variable" only during initialization 2017-01-16 23:47 ` Noam Postavsky @ 2017-01-25 17:15 ` Yuri D'Elia 2017-01-25 19:50 ` Noam Postavsky 0 siblings, 1 reply; 11+ messages in thread From: Yuri D'Elia @ 2017-01-25 17:15 UTC (permalink / raw) To: emacs-devel On Mon, Jan 16 2017, Noam Postavsky wrote: >> Warning (bytecomp): reference to free variable ‘isearchp-reg-beg’ >> >> during startup. The warning is generated by requiring >> modeline-posn.el[1], which is using ``isearchp-reg-beg`` (actually >> defvar-ed early on) inside a defadvice form. >> >> Is this expected? > > There is some unexpected interaction of defadvice with delayed > warnings. I had noticed this a while back, but never got around to > fixing it. `ad-compile-function' binds `warning-suppress-types', but > if warnings are delayed, then the warning call happens after that > binding is finished. This explains one difference, but it would mean that when the warning is not delayed, it would be lost[!]. That would be more serious. I assumed instead that defadvice was evaluating the body too early, before defvar (and thus generating an /incorrect/ warning). >> emacs -q -l ~/.emacs > > In this case, the warnings are not delayed. If you set after-init-time > to nil, then warnings will be delayed, so the same problem should > occur, I think: > > emacs -q --eval '(setq after-init-time nil)' -l ~/.emacs Actually, it doesn't work. No warning is generated in this case. But if I do the opposite: set after-init-time in the beginning of my ~/.emacs, then I can suppress the warning which indeed suggests some problem with the delaying. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: "reference to free variable" only during initialization 2017-01-25 17:15 ` Yuri D'Elia @ 2017-01-25 19:50 ` Noam Postavsky 2017-01-25 19:51 ` Noam Postavsky 0 siblings, 1 reply; 11+ messages in thread From: Noam Postavsky @ 2017-01-25 19:50 UTC (permalink / raw) To: Yuri D'Elia; +Cc: Emacs developers On Wed, Jan 25, 2017 at 12:15 PM, Yuri D'Elia <wavexx@thregr.org> wrote: > On Mon, Jan 16 2017, Noam Postavsky wrote: >>> Warning (bytecomp): reference to free variable ‘isearchp-reg-beg’ >>> >>> during startup. The warning is generated by requiring >>> modeline-posn.el[1], which is using ``isearchp-reg-beg`` (actually >>> defvar-ed early on) inside a defadvice form. >>> >>> Is this expected? >> >> There is some unexpected interaction of defadvice with delayed >> warnings. I had noticed this a while back, but never got around to >> fixing it. `ad-compile-function' binds `warning-suppress-types', but >> if warnings are delayed, then the warning call happens after that >> binding is finished. > > This explains one difference, but it would mean that when the warning is > not delayed, it would be lost[!]. That would be more serious. It shouldn't be lost, `warning-suppress-types' just stops the *Warnings* buffer from popping up. The warnings are still logged in the background. >> In this case, the warnings are not delayed. If you set after-init-time >> to nil, then warnings will be delayed, so the same problem should >> occur, I think: >> >> emacs -q --eval '(setq after-init-time nil)' -l ~/.emacs > > Actually, it doesn't work. No warning is generated in this case. Hmm, I can't reproduce your original case in 25.1 or 24.5, even after commenting (defvar isearchp-reg-beg) ; In `isearch+.el' (defvar isearchp-reg-end) ; In `isearch+.el' (defvar isearchp-restrict-to-region-flag) ; In `isearch+.el' at the top of modeline-posn.el. I have init.el with contents ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: "reference to free variable" only during initialization 2017-01-25 19:50 ` Noam Postavsky @ 2017-01-25 19:51 ` Noam Postavsky 2017-02-18 23:01 ` Yuri D'Elia 0 siblings, 1 reply; 11+ messages in thread From: Noam Postavsky @ 2017-01-25 19:51 UTC (permalink / raw) To: Yuri D'Elia; +Cc: Emacs developers Hit send too early. On Wed, Jan 25, 2017 at 2:50 PM, Noam Postavsky <npostavs@users.sourceforge.net> wrote: > at the top of modeline-posn.el. I have init.el with contents (add-to-list 'load-path "~/.emacs.d/lisp") (require 'modeline-posn) when I start emacs normally I see no warnings. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: "reference to free variable" only during initialization 2017-01-25 19:51 ` Noam Postavsky @ 2017-02-18 23:01 ` Yuri D'Elia 2017-02-19 4:18 ` Noam Postavsky 0 siblings, 1 reply; 11+ messages in thread From: Yuri D'Elia @ 2017-02-18 23:01 UTC (permalink / raw) To: Noam Postavsky; +Cc: Emacs developers On Wed, Jan 25 2017, Noam Postavsky wrote: > Hit send too early. > > On Wed, Jan 25, 2017 at 2:50 PM, Noam Postavsky > <npostavs@users.sourceforge.net> wrote: >> at the top of modeline-posn.el. I have init.el with contents > > (add-to-list 'load-path "~/.emacs.d/lisp") > (require 'modeline-posn) > > when I start emacs normally I see no warnings. Sorry for the late reply, but I could find some time just now. I tried to reproduce this on a fresh emacs (from the current master - 26+). This is the resulting minimal ~/.emacs.d/init.el: (package-initialize) (add-to-list 'load-path "~/.emacs.d/lisp") (require 'modeline-posn) ran with: emacs --no-site-file --no-site-lisp --no-splash --no-x-resources with ~/.emacs.d/lisp containing modeline-posn.el from melpa. There's no other file. I indeed had to add (package-initialize) to reproduce the issue, but I'm not sure why it has some influence. Maybe just some delay. Right off the bat, could you reproduce it with this? Evaling after-init-time makes no difference, and I also couldn't reproduce it with my own directions I gave beforehand. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: "reference to free variable" only during initialization 2017-02-18 23:01 ` Yuri D'Elia @ 2017-02-19 4:18 ` Noam Postavsky 2017-02-19 12:32 ` Yuri D'Elia 0 siblings, 1 reply; 11+ messages in thread From: Noam Postavsky @ 2017-02-19 4:18 UTC (permalink / raw) To: Yuri D'Elia; +Cc: Emacs developers On Sat, Feb 18, 2017 at 6:01 PM, Yuri D'Elia <wavexx@thregr.org> wrote: > with ~/.emacs.d/lisp containing modeline-posn.el from melpa. There's no > other file. I indeed had to add (package-initialize) to reproduce the > issue, but I'm not sure why it has some influence. Maybe just some > delay. > > Right off the bat, could you reproduce it with this? Yes, the reason package-initialize matters is just that it loads bytecomp and advice.el only decides to compile if that has been loaded: (defun ad-should-compile (function compile) (cond ... ;; everything else means `maybe': (t (featurep 'byte-compile)))) (bytecomp.el provides both `bytecomp' and `byte-compile'). > > Evaling after-init-time makes no difference, --eval '(setq after-init-time t)' has no effect, but doing (let ((after-init-time t)) (require 'modeline-posn)) in the init.el file does prevent the warning from popping up. It also improves the error message: the prefix becomes ".emacs.d/lisp/modeline-posn.el:Warning:" instead of "Warning (bytecomp):". This is because byte compilation is let-binding warning-prefix-function which is not saved for delayed warnings. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: "reference to free variable" only during initialization 2017-02-19 4:18 ` Noam Postavsky @ 2017-02-19 12:32 ` Yuri D'Elia 2017-02-19 13:44 ` Noam Postavsky 0 siblings, 1 reply; 11+ messages in thread From: Yuri D'Elia @ 2017-02-19 12:32 UTC (permalink / raw) To: emacs-devel On Sat, Feb 18 2017, Noam Postavsky wrote: > --eval '(setq after-init-time t)' has no effect, but doing > > (let ((after-init-time t)) > (require 'modeline-posn)) > > in the init.el file does prevent the warning from popping up. It also > improves the error message: the prefix becomes > ".emacs.d/lisp/modeline-posn.el:Warning:" instead of "Warning > (bytecomp):". This is because byte compilation is let-binding > warning-prefix-function which is not saved for delayed warnings. Understood. But then, back to the original issue: can you explain the warning? modeline-posn doesn't seem to be doing strange things here. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: "reference to free variable" only during initialization 2017-02-19 12:32 ` Yuri D'Elia @ 2017-02-19 13:44 ` Noam Postavsky 2017-02-19 14:22 ` Yuri D'Elia 0 siblings, 1 reply; 11+ messages in thread From: Noam Postavsky @ 2017-02-19 13:44 UTC (permalink / raw) To: Yuri D'Elia; +Cc: Emacs developers On Sun, Feb 19, 2017 at 7:32 AM, Yuri D'Elia <wavexx@thregr.org> wrote: > > Understood. But then, back to the original issue: can you explain the > warning? modeline-posn doesn't seem to be doing strange things here. > At the end of the (defadvice isearch-query-replace-regexp ...) there is `(lambda () (setq modelinepos-region-acting-on ',isearchp-reg-beg)) This uses isearch-reg-beg without checking if it's boundp (the other occurences do have a boundp check first). ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: "reference to free variable" only during initialization 2017-02-19 13:44 ` Noam Postavsky @ 2017-02-19 14:22 ` Yuri D'Elia 2017-02-19 15:58 ` Drew Adams 0 siblings, 1 reply; 11+ messages in thread From: Yuri D'Elia @ 2017-02-19 14:22 UTC (permalink / raw) To: emacs-devel On Sun, Feb 19 2017, Noam Postavsky wrote: > At the end of the (defadvice isearch-query-replace-regexp ...) there is > > `(lambda () (setq modelinepos-region-acting-on ',isearchp-reg-beg)) > > This uses isearch-reg-beg without checking if it's boundp (the other > occurences do have a boundp check first). Ah! Well, this is interesting, I completely missed this usage. And after understanding it, I'm also somehow surprised that this is not showing up more often. ^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: "reference to free variable" only during initialization 2017-02-19 14:22 ` Yuri D'Elia @ 2017-02-19 15:58 ` Drew Adams 0 siblings, 0 replies; 11+ messages in thread From: Drew Adams @ 2017-02-19 15:58 UTC (permalink / raw) To: Yuri D'Elia, emacs-devel > > `(lambda () (setq modelinepos-region-acting-on ',isearchp-reg-beg)) > > This uses isearch-reg-beg without checking if it's boundp (the other > > occurences do have a boundp check first). > > Ah! Well, this is interesting, I completely missed this usage. And after > understanding it, I'm also somehow surprised that this is not showing up > more often. Thanks to Yuri for reporting the original problem and to Noam for finding that missing boundp occurrence. (Should be OK now.) ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2017-02-19 15:58 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-01-16 23:00 "reference to free variable" only during initialization Yuri D'Elia 2017-01-16 23:47 ` Noam Postavsky 2017-01-25 17:15 ` Yuri D'Elia 2017-01-25 19:50 ` Noam Postavsky 2017-01-25 19:51 ` Noam Postavsky 2017-02-18 23:01 ` Yuri D'Elia 2017-02-19 4:18 ` Noam Postavsky 2017-02-19 12:32 ` Yuri D'Elia 2017-02-19 13:44 ` Noam Postavsky 2017-02-19 14:22 ` Yuri D'Elia 2017-02-19 15:58 ` Drew Adams
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).