unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* "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).