* bug#72313: 31.0.50; Warning about cl-member possibly being undefined when using cl-pushnew
@ 2024-07-26 20:29 Tassilo Horn
2024-07-26 21:20 ` Jeremy Bryant via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-27 7:01 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 2 replies; 11+ messages in thread
From: Tassilo Horn @ 2024-07-26 20:29 UTC (permalink / raw)
To: 72313
The following non-sensical code is a MWE triggering the warning
test.el: Warning: the function ‘cl-member’ might not be defined
at runtime.
when byte-compiling it with
emacs -Q --batch -f batch-byte-compile test.el
--8<---------------cut here---------------start------------->8---
;; -*- lexical-binding: t; -*-
(eval-when-compile
(require 'cl-lib))
(defun foo ()
(let ((s (list 'a 'b)))
(cl-pushnew (list 1 2 3)
s
:test (lambda (_a _b) nil))))
--8<---------------cut here---------------end--------------->8---
Code with that shape of cl-pushnew usage can be found in AUCTeX's
tex-info.el where it produces the same warning which sounds very strange
given that the complete file doesn't use cl-member.
I've checked the cl-lib code and could see that cl-pushnew expands to
something with cl-adjoin which in turn has a compiler macro
cl-compiler-macro-adjoin which could expand to something with cl-member
(but doesn't in this case, I think?)...
My assumption is that (eval-when-compile (require 'cl-lib)) should be
fine when using only macros from cl-lib which in turn should expand to
cl-free code, i.e., the byte code doesn't require cl-lib at runtime.
If, however, cl-pushnew can expand to something using cl-member (a
function), that wouldn't be true.
In GNU Emacs 31.0.50 (build 4, x86_64-pc-linux-gnu, GTK+ Version
3.24.43, cairo version 1.18.0) of 2024-07-26 built on thinkpad-t440p
Repository revision: c22b4198b2e5a9d63109c5ceeb386fbb1904f5dc
Repository branch: master
System Description: Arch Linux
Configured using:
'configure --with-tree-sitter --with-pgtk --with-modules'
Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
LCMS2 LIBOTF LIBSYSTEMD LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY
PDUMPER PGTK PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XIM GTK3 ZLIB
Important settings:
value of $LC_MONETARY: de_DE.utf8
value of $LC_NUMERIC: de_DE.utf8
value of $LC_TIME: de_DE.utf8
value of $LANG: en_US.UTF-8
locale-coding-system: utf-8-unix
Major mode: mu4e:main
Minor modes in effect:
TeX-PDF-mode: t
breadcrumb-mode: t
editorconfig-mode: t
global-aggressive-indent-mode: t
pdf-occur-global-minor-mode: t
diredfl-global-mode: t
mu4e-search-minor-mode: t
mu4e-update-minor-mode: t
mu4e-context-minor-mode: t
mu4e-modeline-mode: t
which-key-mode: t
highlight-parentheses-mode: t
global-git-commit-mode: t
magit-auto-revert-mode: t
server-mode: t
corfu-popupinfo-mode: t
corfu-history-mode: t
global-corfu-mode: t
corfu-mode: t
vertico-mode: t
marginalia-mode: t
minibuffer-depth-indicate-mode: t
switchy-window-minor-mode: t
electric-pair-mode: t
recentf-mode: t
override-global-mode: t
repeat-mode: t
global-so-long-mode: t
save-place-mode: t
savehist-mode: t
puni-global-mode: t
puni-mode: t
tooltip-mode: t
global-eldoc-mode: t
show-paren-mode: t
electric-indent-mode: t
mouse-wheel-mode: t
file-name-shadow-mode: t
global-font-lock-mode: t
font-lock-mode: t
blink-cursor-mode: t
minibuffer-regexp-mode: t
buffer-read-only: t
column-number-mode: t
transient-mark-mode: t
auto-composition-mode: t
auto-encryption-mode: t
auto-compression-mode: t
overwrite-mode: overwrite-mode-binary
Load-path shadows:
~/Repos/el/mu/mu4e/mu4e hides ~/Repos/el/mu/build/mu4e/mu4e
~/Repos/el/mu/mu4e/mu4e-modeline hides ~/Repos/el/mu/build/mu4e/mu4e-modeline
~/Repos/el/mu/mu4e/mu4e-context hides ~/Repos/el/mu/build/mu4e/mu4e-context
~/Repos/el/mu/mu4e/mu4e-main hides ~/Repos/el/mu/build/mu4e/mu4e-main
~/Repos/el/mu/mu4e/mu4e-vars hides ~/Repos/el/mu/build/mu4e/mu4e-vars
~/Repos/el/mu/mu4e/mu4e-window hides ~/Repos/el/mu/build/mu4e/mu4e-window
~/Repos/el/mu/mu4e/mu4e-speedbar hides ~/Repos/el/mu/build/mu4e/mu4e-speedbar
~/Repos/el/mu/mu4e/mu4e-view hides ~/Repos/el/mu/build/mu4e/mu4e-view
~/Repos/el/mu/mu4e/mu4e-thread hides ~/Repos/el/mu/build/mu4e/mu4e-thread
~/Repos/el/mu/mu4e/mu4e-bookmarks hides ~/Repos/el/mu/build/mu4e/mu4e-bookmarks
~/Repos/el/mu/mu4e/mu4e-org hides ~/Repos/el/mu/build/mu4e/mu4e-org
~/Repos/el/mu/mu4e/mu4e-lists hides ~/Repos/el/mu/build/mu4e/mu4e-lists
~/Repos/el/mu/mu4e/mu4e-actions hides ~/Repos/el/mu/build/mu4e/mu4e-actions
~/Repos/el/mu/mu4e/mu4e-helpers hides ~/Repos/el/mu/build/mu4e/mu4e-helpers
~/Repos/el/mu/mu4e/mu4e-search hides ~/Repos/el/mu/build/mu4e/mu4e-search
~/Repos/el/mu/mu4e/mu4e-server hides ~/Repos/el/mu/build/mu4e/mu4e-server
~/Repos/el/mu/mu4e/mu4e-obsolete hides ~/Repos/el/mu/build/mu4e/mu4e-obsolete
~/Repos/el/mu/mu4e/mu4e-update hides ~/Repos/el/mu/build/mu4e/mu4e-update
~/Repos/el/mu/mu4e/mu4e-draft hides ~/Repos/el/mu/build/mu4e/mu4e-draft
~/Repos/el/mu/mu4e/mu4e-message hides ~/Repos/el/mu/build/mu4e/mu4e-message
~/Repos/el/mu/mu4e/mu4e-compose hides ~/Repos/el/mu/build/mu4e/mu4e-compose
~/Repos/el/mu/mu4e/mu4e-headers hides ~/Repos/el/mu/build/mu4e/mu4e-headers
~/Repos/el/mu/mu4e/mu4e-query-items hides ~/Repos/el/mu/build/mu4e/mu4e-query-items
~/Repos/el/mu/mu4e/mu4e-notification hides ~/Repos/el/mu/build/mu4e/mu4e-notification
~/Repos/el/mu/mu4e/mu4e-contacts hides ~/Repos/el/mu/build/mu4e/mu4e-contacts
~/Repos/el/mu/mu4e/mu4e-icalendar hides ~/Repos/el/mu/build/mu4e/mu4e-icalendar
~/Repos/el/mu/mu4e/mu4e-mark hides ~/Repos/el/mu/build/mu4e/mu4e-mark
~/Repos/el/mu/mu4e/mu4e-contrib hides ~/Repos/el/mu/build/mu4e/mu4e-contrib
~/Repos/el/mu/mu4e/mu4e-folders hides ~/Repos/el/mu/build/mu4e/mu4e-folders
~/Repos/el/mu/mu4e/mu4e-mime-parts hides ~/Repos/el/mu/build/mu4e/mu4e-mime-parts
/home/horn/.emacs.d/elpa/ef-themes-1.7.0/theme-loaddefs hides /home/horn/Repos/el/emacs/lisp/theme-loaddefs
/home/horn/.emacs.d/elpa/transient-20240713.2102/transient hides /home/horn/Repos/el/emacs/lisp/transient
Features:
(shadow emacsbug network-stream mailalias dired-aux rdictcc vc-annotate
dabbrev cape-keyword cape expreg cap-words superword subword face-remap
sort gnus-cite mail-extr textsec uni-scripts idna-mapping ucs-normalize
uni-confusable textsec-check qp cus-start view cl-print symbol-overlay
shortdoc help-fns radix-tree misearch multi-isearch texinfo
texinfo-loaddefs tex texmathp tramp-cmds puni
display-fill-column-indicator display-line-numbers ef-frost-theme
generic yaml-mode fish-mode cargo xref cargo-process rust-utils
rust-mode-treesitter rust-ts-mode rust-mode rust-playpen rust-compile
rust-cargo rust-common rust-rustfmt web-mode disp-table auctex-autoloads
tex-site breadcrumb pulse project editorconfig editorconfig-core
editorconfig-core-handle editorconfig-fnmatch elfeed-show elfeed-search
vc-hg vc-bzr vc-src vc-sccs vc-svn vc-cvs vc-rcs log-view debbugs-browse
elfeed-csv elfeed elfeed-curl elfeed-log elfeed-db elfeed-lib avl-tree
url-queue xml-query hl-todo aggressive-indent rainbow-mode pdf-occur
tablist tablist-filter semantic/wisent/comp semantic/wisent
semantic/wisent/wisent semantic/util-modes semantic/util semantic
semantic/tag semantic/lex semantic/fw mode-local cedet pdf-isearch
pdf-misc pdf-tools pdf-view jka-compr pdf-cache pdf-info tq pdf-util
pdf-macs image-mode exif vc-git vc-dir ewoc epa-file trashed diredfl
dired-x eshell esh-cmd generator esh-ext esh-proc esh-opt esh-io esh-arg
esh-module esh-module-loaddefs esh-util mu4e-icalendar gnus-icalendar
icalendar diary-lib diary-loaddefs mu4e mu4e-org mu4e-notification
notifications mu4e-main smtpmail mu4e-view mu4e-mime-parts mu4e-headers
mu4e-thread mu4e-actions org-capture org-refile org ob ob-tangle ob-ref
ob-lob ob-table ob-exp org-macro org-src sh-script smie executable
ob-comint org-pcomplete org-list org-footnote org-faces org-entities
ob-emacs-lisp ob-core ob-eval org-cycle org-table ol org-fold
org-fold-core org-keys oc org-loaddefs cal-menu calendar cal-loaddefs
org-compat org-version org-macs mu4e-compose mu4e-draft gnus-msg
mu4e-search mu4e-lists mu4e-bookmarks mu4e-mark mu4e-message flow-fill
mule-util mu4e-contacts mu4e-update mu4e-folders mu4e-context
mu4e-query-items mu4e-server mu4e-modeline mu4e-vars mu4e-helpers
mu4e-config mu4e-window magit-bookmark bookmark ido mu4e-obsolete
hippie-exp auto-dictionary flyspell ispell tramp-smb which-key
highlight-parentheses restclient forge-repos forge-tablist hl-line
forge-topics forge-commands forge-semi forge-bitbucket buck forge-gogs
gogs forge-gitea gtea forge-gitlab glab forge-github ghub-graphql treepy
gsexp ghub let-alist forge-notify forge-revnote forge-pullreq
forge-issue forge-topic yaml eieio-custom forge-post markdown-mode
noutline outline forge-repo forge forge-core forge-db closql
emacsql-sqlite-common emacsql emacsql-compiler eieio-base
magit-submodule magit-blame magit-stash magit-reflog magit-bisect
magit-push magit-pull magit-fetch magit-clone magit-remote magit-commit
magit-sequence magit-notes magit-worktree magit-tag magit-merge
magit-branch magit-reset magit-files magit-refs magit-status magit
magit-repos magit-apply magit-wip magit-log which-func imenu magit-diff
smerge-mode diff diff-mode track-changes git-commit log-edit pcvs-util
add-log magit-core magit-autorevert autorevert filenotify magit-margin
magit-transient magit-process with-editor comp comp-cstr comp-run
comp-common server magit-mode benchmark magit-git magit-base
magit-section cursor-sensor crm dash visual-filename-abbrev rg vc
vc-dispatcher rg-info-hack advice rg-menu transient rg-ibuffer rg-result
wgrep-rg wgrep rg-history rg-header ibuf-ext ibuffer ibuffer-loaddefs
grep compile debbugs soap-client url-http url-auth url-gw nsm warnings
rng-xsd rng-dt rng-util xsd-regexp bug-reference thingatpt kind-icon
svg-lib color corfu-popupinfo corfu-history corfu vertico marginalia
icomplete mb-depth use-package-diminish switchy-window compat elec-pair
tramp-cache time-stamp recentf tree-widget edmacro kmacro
use-package-bind-key bind-key diminish repeat toml-ts-mode json-ts-mode
c++-ts-mode c-ts-mode java-ts-mode c-ts-common find-func treesit so-long
saveplace tramp-sh tramp rx trampver tramp-integration files-x
tramp-message tramp-compat xdg shell pcomplete comint ansi-osc ring
format-spec ansi-color tramp-loaddefs savehist smiley gnus-art mm-uu
mml2015 mm-view mml-smime smime gnutls dig gnus-sum shr pixel-fill
kinsoku url-file svg dom gnus-group gnus-undo gnus-start gnus-dbus dbus
xml gnus-cloud nnimap nnmail mail-source utf7 nnoo parse-time iso8601
gnus-spec gnus-int gnus-range message sendmail yank-media puny dired
dired-loaddefs rfc822 mml mml-sec epa derived epg rfc6068 epg-config
mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045
ietf-drums mailabbrev gmm-utils mailheader gnus-win gnus nnheader
gnus-util text-property-search time-date mm-util mail-prsvr mail-utils
range ef-themes cl-extra help-mode use-package-ensure use-package-core
finder-inf cus-edit pp cus-load wid-edit aggressive-indent-autoloads
auto-dictionary-autoloads breadcrumb-autoloads cape-autoloads
cargo-autoloads clojure-mode-autoloads corfu-autoloads
csv-mode-autoloads debbugs-autoloads diminish-autoloads
diredfl-autoloads eat-autoloads ef-themes-autoloads elfeed-autoloads
ement-autoloads expreg-autoloads fish-mode-autoloads forge-autoloads
closql-autoloads emacsql-autoloads ghub-autoloads
highlight-parentheses-autoloads hl-todo-autoloads kind-icon-autoloads
magit-autoloads pcase git-commit-autoloads marginalia-autoloads
markdown-mode-autoloads mastodon-autoloads pdf-tools-autoloads
persist-autoloads plz-autoloads puni-autoloads easy-mmode
rainbow-mode-autoloads rcirc-color-autoloads request-autoloads
restclient-autoloads rg-autoloads rust-mode-autoloads svg-lib-autoloads
symbol-overlay-autoloads tablist-autoloads taxy-magit-section-autoloads
taxy-autoloads magit-section-autoloads dash-autoloads totp-autoloads
transient-autoloads trashed-autoloads treepy-autoloads vertico-autoloads
visual-filename-abbrev-autoloads web-mode-autoloads wgrep-autoloads info
with-editor-autoloads yaml-autoloads yaml-mode-autoloads package
browse-url url url-proxy url-privacy url-expand url-methods url-history
url-cookie generate-lisp-file url-domsuf url-util mailcap url-handlers
url-parse auth-source cl-seq eieio eieio-core cl-macs icons
password-cache json subr-x map byte-opt gv bytecomp byte-compile
url-vars cl-loaddefs cl-lib rmc iso-transl tooltip cconv eldoc paren
electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel
term/pgtk-win pgtk-win term/common-win touch-screen pgtk-dnd tool-bar
dnd fontset image regexp-opt fringe tabulated-list replace newcomment
text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow
isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax
font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic
indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek
romanian slovak czech european ethiopic indian cyrillic chinese
composite emoji-zwj charscript charprop case-table epa-hook
jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs
theme-loaddefs faces cus-face macroexp files window text-properties
overlay sha1 md5 base64 format env code-pages mule custom widget keymap
hashtable-print-readable backquote threads dbusbind inotify
dynamic-setting system-font-setting font-render-setting cairo gtk pgtk
lcms2 multi-tty move-toolbar make-network-process native-compile emacs)
Memory information:
((conses 16 1173451 235616) (symbols 48 56499 6) (strings 32 291077 14149)
(string-bytes 1 9219043) (vectors 16 125102) (vector-slots 8 1918753 300302)
(floats 8 897 5338) (intervals 56 22117 7997) (buffers 992 40))
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#72313: 31.0.50; Warning about cl-member possibly being undefined when using cl-pushnew
2024-07-26 20:29 bug#72313: 31.0.50; Warning about cl-member possibly being undefined when using cl-pushnew Tassilo Horn
@ 2024-07-26 21:20 ` Jeremy Bryant via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-27 7:01 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
1 sibling, 0 replies; 11+ messages in thread
From: Jeremy Bryant via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-26 21:20 UTC (permalink / raw)
To: Tassilo Horn; +Cc: 72313, Stefan Monnier
Tassilo Horn <tsdh@gnu.org> writes:
> The following non-sensical code is a MWE triggering the warning
>
> test.el: Warning: the function ‘cl-member’ might not be defined
> at runtime.
>
> when byte-compiling it with
>
> emacs -Q --batch -f batch-byte-compile test.el
>
> --8<---------------cut here---------------start------------->8---
> ;; -*- lexical-binding: t; -*-
> (eval-when-compile
> (require 'cl-lib))
>
> (defun foo ()
> (let ((s (list 'a 'b)))
> (cl-pushnew (list 1 2 3)
> s
> :test (lambda (_a _b) nil))))
> --8<---------------cut here---------------end--------------->8---
>
> Code with that shape of cl-pushnew usage can be found in AUCTeX's
> tex-info.el where it produces the same warning which sounds very strange
> given that the complete file doesn't use cl-member.
>
> I've checked the cl-lib code and could see that cl-pushnew expands to
> something with cl-adjoin which in turn has a compiler macro
> cl-compiler-macro-adjoin which could expand to something with cl-member
> (but doesn't in this case, I think?)...
>
> My assumption is that (eval-when-compile (require 'cl-lib)) should be
> fine when using only macros from cl-lib which in turn should expand to
> cl-free code, i.e., the byte code doesn't require cl-lib at runtime.
> If, however, cl-pushnew can expand to something using cl-member (a
> function), that wouldn't be true.
Adding Stefan M.
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#72313: 31.0.50; Warning about cl-member possibly being undefined when using cl-pushnew
2024-07-26 20:29 bug#72313: 31.0.50; Warning about cl-member possibly being undefined when using cl-pushnew Tassilo Horn
2024-07-26 21:20 ` Jeremy Bryant via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-27 7:01 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-27 7:13 ` Tassilo Horn
1 sibling, 1 reply; 11+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-27 7:01 UTC (permalink / raw)
To: Tassilo Horn; +Cc: 72313
> --8<---------------cut here---------------start------------->8---
> ;; -*- lexical-binding: t; -*-
> (eval-when-compile
> (require 'cl-lib))
>
> (defun foo ()
> (let ((s (list 'a 'b)))
> (cl-pushnew (list 1 2 3)
> s
> :test (lambda (_a _b) nil))))
> --8<---------------cut here---------------end--------------->8---
(macroexpand-all '(cl-pushnew (list 1 2 3) s :test (lambda (_a _b) nil)))
=>
(setq s
(let* ((va (list 1 2 3)))
(if (cl-member va s :test #'(lambda (_a _b) nil)) s (cons va s))))
> My assumption is that (eval-when-compile (require 'cl-lib)) should be
> fine when using only macros from cl-lib which in turn should expand to
> cl-free code,
That's not the case here (and a few other places).
In the past, I've moved some of this kind of code to `cl-preloaded`, so
as to make things easier for programmers (to avoid them having to know
which CL macros emit code which calls CL functions (and when)), but
there are still cases like above, yes.
In practice most complex macros are often best served by emitting code
which itself calls helper functions (e.g. `cl-defstruct` used to not
call a function but I changed it to call `cl-struct-define`).
Stefan
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#72313: 31.0.50; Warning about cl-member possibly being undefined when using cl-pushnew
2024-07-27 7:01 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-27 7:13 ` Tassilo Horn
2024-07-27 7:49 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 1 reply; 11+ messages in thread
From: Tassilo Horn @ 2024-07-27 7:13 UTC (permalink / raw)
To: Stefan Monnier; +Cc: 72313
Stefan Monnier <monnier@iro.umontreal.ca> writes:
Hi Stefan,
> (macroexpand-all '(cl-pushnew (list 1 2 3) s :test (lambda (_a _b) nil)))
> =>
> (setq s
> (let* ((va (list 1 2 3)))
> (if (cl-member va s :test #'(lambda (_a _b) nil)) s (cons va s))))
>
>> My assumption is that (eval-when-compile (require 'cl-lib)) should be
>> fine when using only macros from cl-lib which in turn should expand
>> to cl-free code,
>
> That's not the case here (and a few other places). In the past, I've
> moved some of this kind of code to `cl-preloaded`, so as to make
> things easier for programmers (to avoid them having to know which CL
> macros emit code which calls CL functions (and when)), but there are
> still cases like above, yes.
So the conclusion is to simply (require 'cl-lib) instead of
(eval-when-compile (require 'cl-lib))? But how can the byte-compiler
conclude that cl-member might not be defined at runtime given that it's
an autoloaded function?
Addon question: should a package list cl-lib in Package-Requires if it
already requires an Emacs version where a good-enough cl-lib is included
anyway?
Thanks,
Tassilo
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#72313: 31.0.50; Warning about cl-member possibly being undefined when using cl-pushnew
2024-07-27 7:13 ` Tassilo Horn
@ 2024-07-27 7:49 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-27 15:29 ` Arash Esbati
0 siblings, 1 reply; 11+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-27 7:49 UTC (permalink / raw)
To: Tassilo Horn; +Cc: 72313
> So the conclusion is to simply (require 'cl-lib) instead of
> (eval-when-compile (require 'cl-lib))? But how can the byte-compiler
> conclude that cl-member might not be defined at runtime given that it's
> an autoloaded function?
It's autoloaded from `cl-seq` when `cl-lib` is loaded.
It's not autoloaded at startup.
> Addon question: should a package list cl-lib in Package-Requires if it
> already requires an Emacs version where a good-enough cl-lib is included
> anyway?
I can't see any reason to do that, no.
Stefan
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#72313: 31.0.50; Warning about cl-member possibly being undefined when using cl-pushnew
2024-07-27 7:49 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-27 15:29 ` Arash Esbati
2024-07-27 20:50 ` Tassilo Horn
0 siblings, 1 reply; 11+ messages in thread
From: Arash Esbati @ 2024-07-27 15:29 UTC (permalink / raw)
To: 72313; +Cc: monnier, tsdh
Stefan Monnier via "Bug reports for GNU Emacs, the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org> writes:
>> So the conclusion is to simply (require 'cl-lib) instead of
>> (eval-when-compile (require 'cl-lib))? But how can the byte-compiler
>> conclude that cl-member might not be defined at runtime given that it's
>> an autoloaded function?
>
> It's autoloaded from `cl-seq` when `cl-lib` is loaded.
> It's not autoloaded at startup.
How about this approach then?
--8<---------------cut here---------------start------------->8---
diff --git a/tex-info.el b/tex-info.el
index dc69762e..0f77e057 100644
--- a/tex-info.el
+++ b/tex-info.el
@@ -25,7 +25,8 @@
;;; Code:
(eval-when-compile
- (require 'cl-lib))
+ (require 'cl-lib)
+ (declare-function cl-member "cl-seq"))
(require 'tex)
--8<---------------cut here---------------end--------------->8---
Best, Arash
^ permalink raw reply related [flat|nested] 11+ messages in thread
* bug#72313: 31.0.50; Warning about cl-member possibly being undefined when using cl-pushnew
2024-07-27 15:29 ` Arash Esbati
@ 2024-07-27 20:50 ` Tassilo Horn
2024-07-27 21:25 ` Arash Esbati
2024-07-28 4:58 ` Eli Zaretskii
0 siblings, 2 replies; 11+ messages in thread
From: Tassilo Horn @ 2024-07-27 20:50 UTC (permalink / raw)
To: Arash Esbati; +Cc: 72313, monnier
Arash Esbati <arash@gnu.org> writes:
> Stefan Monnier via "Bug reports for GNU Emacs, the Swiss army knife of
> text editors" <bug-gnu-emacs@gnu.org> writes:
>
>>> So the conclusion is to simply (require 'cl-lib) instead of
>>> (eval-when-compile (require 'cl-lib))? But how can the
>>> byte-compiler conclude that cl-member might not be defined at
>>> runtime given that it's an autoloaded function?
>>
>> It's autoloaded from `cl-seq` when `cl-lib` is loaded.
>> It's not autoloaded at startup.
What's that magic?
emacs -Q
(featurep 'cl-lib) ;=> nil
(describe-function 'cl-member) ; prints the help string to *Messages*
(featurep 'cl-lib) ;=> t
Do the help facilities load stuff on demand?
> How about this approach then?
>
> --8<---------------cut here---------------start------------->8---
> diff --git a/tex-info.el b/tex-info.el
> index dc69762e..0f77e057 100644
> --- a/tex-info.el
> +++ b/tex-info.el
> @@ -25,7 +25,8 @@
> ;;; Code:
>
> (eval-when-compile
> - (require 'cl-lib))
> + (require 'cl-lib)
> + (declare-function cl-member "cl-seq"))
>
> (require 'tex)
> --8<---------------cut here---------------end--------------->8---
Let's just require cl-lib. declare-function only silences the
byte-compiler and the usage of cl-member at runtime is a fact; no
cheating allowed. It's also an implementation detail we should not
bother with. Tomorrow, Stefan might have optimized it to use some
cl-memql-1-wazzup for the specific case we have here. :-)
Bye,
Tassilo
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#72313: 31.0.50; Warning about cl-member possibly being undefined when using cl-pushnew
2024-07-27 20:50 ` Tassilo Horn
@ 2024-07-27 21:25 ` Arash Esbati
2024-07-31 17:44 ` Tassilo Horn
2024-07-28 4:58 ` Eli Zaretskii
1 sibling, 1 reply; 11+ messages in thread
From: Arash Esbati @ 2024-07-27 21:25 UTC (permalink / raw)
To: Tassilo Horn; +Cc: 72313, monnier
Tassilo Horn <tsdh@gnu.org> writes:
> Let's just require cl-lib. declare-function only silences the
> byte-compiler and the usage of cl-member at runtime is a fact; no
> cheating allowed. It's also an implementation detail we should not
> bother with.
I'm not sure if this is cheating, but I'm easy, and if we want to
require cl-lib, I'd do it in tex.el which is loaded by all
<mode-name>.el files; so basically:
--8<---------------cut here---------------start------------->8---
diff --git a/tex-info.el b/tex-info.el
index dc69762e..4ae14401 100644
--- a/tex-info.el
+++ b/tex-info.el
@@ -24,9 +24,6 @@
;;; Code:
-(eval-when-compile
- (require 'cl-lib))
-
(require 'tex)
(require 'texinfo)
diff --git a/tex.el b/tex.el
index e67d2059..729e4db2 100644
--- a/tex.el
+++ b/tex.el
@@ -33,8 +33,8 @@
(require 'custom)
(require 'tex-site)
+(require 'cl-lib)
(eval-when-compile
- (require 'cl-lib)
(require 'subr-x))
(require 'texmathp)
;; seq.el is preloaded in Emacs 29, so the next form can be removed
--8<---------------cut here---------------end--------------->8---
(plus some more changes to come).
> Tomorrow, Stefan might have optimized it to use some cl-memql-1-wazzup
> for the specific case we have here. :-)
I will not put my money on another bet :)
Best, Arash
^ permalink raw reply related [flat|nested] 11+ messages in thread
* bug#72313: 31.0.50; Warning about cl-member possibly being undefined when using cl-pushnew
2024-07-27 21:25 ` Arash Esbati
@ 2024-07-31 17:44 ` Tassilo Horn
2024-07-31 19:55 ` Arash Esbati
0 siblings, 1 reply; 11+ messages in thread
From: Tassilo Horn @ 2024-07-31 17:44 UTC (permalink / raw)
To: Arash Esbati; +Cc: 72313, monnier, 72313-done
Arash Esbati <arash@gnu.org> writes:
Hi Arash,
>> Let's just require cl-lib. declare-function only silences the
>> byte-compiler and the usage of cl-member at runtime is a fact; no
>> cheating allowed. It's also an implementation detail we should not
>> bother with.
>
> I'm not sure if this is cheating, but I'm easy, and if we want to
> require cl-lib, I'd do it in tex.el which is loaded by all
> <mode-name>.el files; so basically:
Yes, I've done something along those lines (and also required the very
small subr-x). AUCTeX is traditionally very conservative with
dependencies but we should not limit ourselves by not using basic emacs
functions in the common libs like cl-lib, seq, or subr-x.
I'm closing this report. Thanks for the explanations, Stefan & Eli.
Bye,
Tassilo
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#72313: 31.0.50; Warning about cl-member possibly being undefined when using cl-pushnew
2024-07-31 17:44 ` Tassilo Horn
@ 2024-07-31 19:55 ` Arash Esbati
0 siblings, 0 replies; 11+ messages in thread
From: Arash Esbati @ 2024-07-31 19:55 UTC (permalink / raw)
To: Tassilo Horn; +Cc: 72313, monnier, 72313-done
Hi Tassilo,
Tassilo Horn <tsdh@gnu.org> writes:
> Yes, I've done something along those lines (and also required the very
> small subr-x). AUCTeX is traditionally very conservative with
> dependencies but we should not limit ourselves by not using basic
> emacs functions in the common libs like cl-lib, seq, or subr-x.
Thanks, I think this change was sowewhat overdue.
Best, Arash
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#72313: 31.0.50; Warning about cl-member possibly being undefined when using cl-pushnew
2024-07-27 20:50 ` Tassilo Horn
2024-07-27 21:25 ` Arash Esbati
@ 2024-07-28 4:58 ` Eli Zaretskii
1 sibling, 0 replies; 11+ messages in thread
From: Eli Zaretskii @ 2024-07-28 4:58 UTC (permalink / raw)
To: Tassilo Horn; +Cc: arash, 72313, monnier
> Cc: 72313@debbugs.gnu.org, monnier@iro.umontreal.ca
> From: Tassilo Horn <tsdh@gnu.org>
> Date: Sat, 27 Jul 2024 22:50:35 +0200
>
> Arash Esbati <arash@gnu.org> writes:
>
> > Stefan Monnier via "Bug reports for GNU Emacs, the Swiss army knife of
> > text editors" <bug-gnu-emacs@gnu.org> writes:
> >
> >>> So the conclusion is to simply (require 'cl-lib) instead of
> >>> (eval-when-compile (require 'cl-lib))? But how can the
> >>> byte-compiler conclude that cl-member might not be defined at
> >>> runtime given that it's an autoloaded function?
> >>
> >> It's autoloaded from `cl-seq` when `cl-lib` is loaded.
> >> It's not autoloaded at startup.
>
> What's that magic?
>
> emacs -Q
> (featurep 'cl-lib) ;=> nil
> (describe-function 'cl-member) ; prints the help string to *Messages*
> (featurep 'cl-lib) ;=> t
>
> Do the help facilities load stuff on demand?
Yes, of course. As the rest of Emacs, actually. In fact, only
help.el is preloaded, the rest of Help facilities (help-mode,
help-fns, apropos, etc.) are loaded on demand only.
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2024-07-31 19:55 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-26 20:29 bug#72313: 31.0.50; Warning about cl-member possibly being undefined when using cl-pushnew Tassilo Horn
2024-07-26 21:20 ` Jeremy Bryant via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-27 7:01 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-27 7:13 ` Tassilo Horn
2024-07-27 7:49 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-27 15:29 ` Arash Esbati
2024-07-27 20:50 ` Tassilo Horn
2024-07-27 21:25 ` Arash Esbati
2024-07-31 17:44 ` Tassilo Horn
2024-07-31 19:55 ` Arash Esbati
2024-07-28 4:58 ` Eli Zaretskii
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.