* bug#42919: 27.1; Strange byte compile error with `cond' involving cons
@ 2020-08-18 19:00 Ikumi Keita
2020-08-18 22:45 ` Basil L. Contovounesios
0 siblings, 1 reply; 7+ messages in thread
From: Ikumi Keita @ 2020-08-18 19:00 UTC (permalink / raw)
To: 42919
I encountered a strange byte compile error with simple elisp code.
[How to reproduce]
1. Save the following file as /tmp/foo.el:
--- /tmp/foo.el ----------------------------
(defun xyz (arg)
(cond
; ((member '("image") arg) ; OK
; ((member '(rel "image") arg) ; OK
; ((remove '(rel . "image") arg) ; OK
; ((memq '(rel . "image") arg) ; NG
((member '(rel . "image") arg) ; NG
1)))
--------------------------------------------
2. emacs-27.1 -Q
3. M-x byte-compile-file /tmp/foo.el RET
4. Then byte compile fails with the following error:
Compiling file /tmp/foo.el at Wed Aug 19 03:38:06 2020
Entering directory ‘/tmp/’
foo.el:1:13:Error: Wrong type argument: listp, "image"
in *Compile-Log* buffer. I don't see foo.elc in /tmp after that.
Expected result is that byte compile finishes without error and foo.elc
is generated.
[Additional info]
a. As written in the above code, only cons (rel . "image") causes this
error. Both lists (rel "image") and ("image") are OK.
b. As written in the above code, both `member' and `memq' fail while
`remove' succeeds.
c. Emacs 26.3 works as expected.
Regards,
Ikumi Keita
In GNU Emacs 27.1 (build 1, x86_64-unknown-freebsd12.1, GTK+ Version 3.24.20)
of 2020-08-19 built on freebsd.vmware
Windowing system distributor 'The X.Org Foundation', version 11.0.12008000
System Description: 12.1-RELEASE-p8
Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.
Compiling /tmp/foo.el... (xyz)
You can run the command ‘byte-compile-file’ with M-x by-c RET
Compiling /tmp/foo.el... (xyz)
Mark set
next-line: End of buffer [2 times]
Mark set
Making completion list...
Configured features:
XPM JPEG TIFF GIF PNG RSVG SOUND DBUS GSETTINGS GLIB NOTIFY KQUEUE ACL
GNUTLS LIBXML2 FREETYPE HARFBUZZ XFT ZLIB TOOLKIT_SCROLL_BARS GTK3 X11
XDBE XIM MODULES THREADS JSON PDUMPER LCMS2 GMP
Important settings:
value of $EMACSLOADPATH: /home/keita/elisp:
value of $LANG: C
locale-coding-system: nil
Major mode: Emacs-Lisp
Minor modes in effect:
tooltip-mode: t
global-eldoc-mode: t
eldoc-mode: t
electric-indent-mode: t
mouse-wheel-mode: t
tool-bar-mode: t
menu-bar-mode: t
file-name-shadow-mode: t
global-font-lock-mode: t
font-lock-mode: t
blink-cursor-mode: t
auto-composition-mode: t
auto-encryption-mode: t
auto-compression-mode: t
buffer-read-only: t
line-number-mode: t
transient-mark-mode: t
Load-path shadows:
/home/keita/elisp/reftex-parse hides /home/keita/scr/emacs-27.1/lisp/textmodes/reftex-parse
Features:
(shadow sort mail-extr emacsbug message rmc puny dired dired-loaddefs
format-spec rfc822 mml easymenu mml-sec password-cache epa derived epg
epg-config gnus-util rmail rmail-loaddefs text-property-search seq gv
mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils
mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr
mail-utils time-date subr-x cl-loaddefs cl-lib warnings byte-opt compile
comint ansi-color ring bytecomp byte-compile cconv tooltip eldoc
electric uniquify ediff-hook vc-hooks lisp-float-type mwheel term/x-win
x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe
tabulated-list replace newcomment text-mode elisp-mode lisp-mode
prog-mode register page tab-bar menu-bar rfn-eshadow isearch timer
select scroll-bar mouse jit-lock font-lock syntax facemenu font-core
term/tty-colors frame minibuffer cl-generic 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 charscript charprop case-table epa-hook
jka-cmpr-hook help simple abbrev obarray cl-preloaded nadvice loaddefs
button faces cus-face macroexp files text-properties overlay sha1 md5
base64 format env code-pages mule custom widget hashtable-print-readable
backquote threads dbusbind kqueue lcms2 dynamic-setting
system-font-setting font-render-setting move-toolbar gtk x-toolkit x
multi-tty make-network-process emacs)
Memory information:
((conses 16 51013 10241)
(symbols 48 6580 1)
(strings 32 16915 1623)
(string-bytes 1 565681)
(vectors 16 10152)
(vector-slots 8 141502 12592)
(floats 8 25 119)
(intervals 56 304 125)
(buffers 1000 16))
^ permalink raw reply [flat|nested] 7+ messages in thread
* bug#42919: 27.1; Strange byte compile error with `cond' involving cons
2020-08-18 19:00 bug#42919: 27.1; Strange byte compile error with `cond' involving cons Ikumi Keita
@ 2020-08-18 22:45 ` Basil L. Contovounesios
2020-08-19 9:15 ` Mattias Engdegård
2020-08-19 13:29 ` Mattias Engdegård
0 siblings, 2 replies; 7+ messages in thread
From: Basil L. Contovounesios @ 2020-08-18 22:45 UTC (permalink / raw)
To: Ikumi Keita; +Cc: Mattias Engdegård, 42919
severity 42919 important
tags 42919 + confirmed
quit
Ikumi Keita <ikumi@ikumi.que.jp> writes:
> I encountered a strange byte compile error with simple elisp code.
>
> [How to reproduce]
> 1. Save the following file as /tmp/foo.el:
> --- /tmp/foo.el ----------------------------
> (defun xyz (arg)
> (cond
> ; ((member '("image") arg) ; OK
> ; ((member '(rel "image") arg) ; OK
> ; ((remove '(rel . "image") arg) ; OK
> ; ((memq '(rel . "image") arg) ; NG
> ((member '(rel . "image") arg) ; NG
> 1)))
> --------------------------------------------
> 2. emacs-27.1 -Q
> 3. M-x byte-compile-file /tmp/foo.el RET
> 4. Then byte compile fails with the following error:
> Compiling file /tmp/foo.el at Wed Aug 19 03:38:06 2020
> Entering directory ‘/tmp/’
> foo.el:1:13:Error: Wrong type argument: listp, "image"
> in *Compile-Log* buffer. I don't see foo.elc in /tmp after that.
> Expected result is that byte compile finishes without error and foo.elc
> is generated.
>
> [Additional info]
> a. As written in the above code, only cons (rel . "image") causes this
> error. Both lists (rel "image") and ("image") are OK.
> b. As written in the above code, both `member' and `memq' fail while
> `remove' succeeds.
> c. Emacs 26.3 works as expected.
Thanks, bisected to the following commit:
Compile list member functions in cond to switch (bug#36139)
36ab408207 2019-06-19 11:20:58 +0200
https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=36ab408207d7adf94fd1396922e0df38d746a948
--
Basil
^ permalink raw reply [flat|nested] 7+ messages in thread
* bug#42919: 27.1; Strange byte compile error with `cond' involving cons
2020-08-18 22:45 ` Basil L. Contovounesios
@ 2020-08-19 9:15 ` Mattias Engdegård
2020-08-19 13:29 ` Mattias Engdegård
1 sibling, 0 replies; 7+ messages in thread
From: Mattias Engdegård @ 2020-08-19 9:15 UTC (permalink / raw)
To: Basil L. Contovounesios; +Cc: Ikumi Keita, 42919
Thank you for the excellent report! I know what is wrong; will fix immediately.
^ permalink raw reply [flat|nested] 7+ messages in thread
* bug#42919: 27.1; Strange byte compile error with `cond' involving cons
2020-08-18 22:45 ` Basil L. Contovounesios
2020-08-19 9:15 ` Mattias Engdegård
@ 2020-08-19 13:29 ` Mattias Engdegård
2020-08-19 13:57 ` Ikumi Keita
1 sibling, 1 reply; 7+ messages in thread
From: Mattias Engdegård @ 2020-08-19 13:29 UTC (permalink / raw)
To: Basil L. Contovounesios; +Cc: Ikumi Keita, Stefan Monnier, 42919
[-- Attachment #1: Type: text/plain, Size: 132 bytes --]
I'm so sorry about this stupid error, and am very grateful that you found it.
Would you try this patch (applicable to Emacs 27.1)?
[-- Attachment #2: 0001-Fix-cond-jump-table-compilation-bug-42919.patch --]
[-- Type: application/octet-stream, Size: 6121 bytes --]
From 5fcb97dabd3f7b00ebc574d6be4bad16a64482de Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= <mattiase@acm.org>
Date: Wed, 19 Aug 2020 14:59:29 +0200
Subject: [PATCH] Fix cond jump table compilation (bug#42919)
This bug affected compilation of
(cond ((member '(some list) variable) ...) ...)
While equal is symmetric, member is not; in the latter case the
arguments must be a variable and a constant list, in that order.
Reported by Ikumi Keita.
* lisp/emacs-lisp/bytecomp.el (byte-compile--cond-switch-prefix):
Don't treat equality and member predicates in the same way; only
the former are symmetric in their arguments.
* test/lisp/emacs-lisp/bytecomp-tests.el
(byte-opt-testsuite-arith-data): Add test cases.
---
lisp/emacs-lisp/bytecomp.el | 52 ++++++++++++++------------
test/lisp/emacs-lisp/bytecomp-tests.el | 15 +++++++-
2 files changed, 42 insertions(+), 25 deletions(-)
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 5479e6536a..90745a3a2f 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -4172,40 +4172,44 @@ byte-compile--cond-switch-prefix
(switch-var nil)
(switch-test 'eq))
(while (pcase (car clauses)
- (`((,fn ,expr1 ,expr2) . ,body)
+ (`((,(and fn (or 'eq 'eql 'equal)) ,expr1 ,expr2) . ,body)
(let* ((vars (byte-compile--cond-vars expr1 expr2))
(var (car vars))
(value (cdr vars)))
(and var (or (eq var switch-var) (not switch-var))
- (cond
- ((memq fn '(eq eql equal))
+ (progn
(setq switch-var var)
(setq switch-test
(byte-compile--common-test switch-test fn))
(unless (member value keys)
(push value keys)
(push (cons (list value) (or body '(t))) cases))
- t)
- ((and (memq fn '(memq memql member))
- (listp value)
- ;; Require a non-empty body, since the member
- ;; function value depends on the switch
- ;; argument.
- body)
- (setq switch-var var)
- (setq switch-test
- (byte-compile--common-test
- switch-test (cdr (assq fn '((memq . eq)
- (memql . eql)
- (member . equal))))))
- (let ((vals nil))
- (dolist (elem value)
- (unless (funcall fn elem keys)
- (push elem vals)))
- (when vals
- (setq keys (append vals keys))
- (push (cons (nreverse vals) body) cases)))
- t))))))
+ t))))
+ (`((,(and fn (or 'memq 'memql 'member)) ,var ,expr) . ,body)
+ (and (symbolp var)
+ (or (eq var switch-var) (not switch-var))
+ (macroexp-const-p expr)
+ ;; Require a non-empty body, since the member
+ ;; function value depends on the switch argument.
+ body
+ (let ((value (eval expr)))
+ (and (proper-list-p value)
+ (progn
+ (setq switch-var var)
+ (setq switch-test
+ (byte-compile--common-test
+ switch-test
+ (cdr (assq fn '((memq . eq)
+ (memql . eql)
+ (member . equal))))))
+ (let ((vals nil))
+ (dolist (elem value)
+ (unless (funcall fn elem keys)
+ (push elem vals)))
+ (when vals
+ (setq keys (append vals keys))
+ (push (cons (nreverse vals) body) cases)))
+ t))))))
(setq clauses (cdr clauses)))
;; Assume that a single switch is cheaper than two or more discrete
;; compare clauses. This could be tuned, possibly taking into
diff --git a/test/lisp/emacs-lisp/bytecomp-tests.el b/test/lisp/emacs-lisp/bytecomp-tests.el
index a16adfedfb..3aba9af3e7 100644
--- a/test/lisp/emacs-lisp/bytecomp-tests.el
+++ b/test/lisp/emacs-lisp/bytecomp-tests.el
@@ -347,7 +347,20 @@ byte-opt-testsuite-arith-data
((eq x 't) 99)
(t 999))))
'((a c) (b c) (7 c) (-3 c) (nil nil) (t c) (q c) (r c) (s c)
- (t c) (x "a") (x "c") (x c) (x d) (x e))))
+ (t c) (x "a") (x "c") (x c) (x d) (x e)))
+
+ (mapcar (lambda (x) (cond ((member '(a . b) x) 1)
+ ((equal x '(c)) 2)))
+ '(((a . b)) a b (c) (d)))
+ (mapcar (lambda (x) (cond ((memq '(a . b) x) 1)
+ ((equal x '(c)) 2)))
+ '(((a . b)) a b (c) (d)))
+ (mapcar (lambda (x) (cond ((member '(a b) x) 1)
+ ((equal x '(c)) 2)))
+ '(((a b)) a b (c) (d)))
+ (mapcar (lambda (x) (cond ((memq '(a b) x) 1)
+ ((equal x '(c)) 2)))
+ '(((a b)) a b (c) (d))))
"List of expression for test.
Each element will be executed by interpreter and with
bytecompiled code, and their results compared.")
--
2.21.1 (Apple Git-122.3)
^ permalink raw reply related [flat|nested] 7+ messages in thread
* bug#42919: 27.1; Strange byte compile error with `cond' involving cons
2020-08-19 13:29 ` Mattias Engdegård
@ 2020-08-19 13:57 ` Ikumi Keita
2020-08-19 14:40 ` Mattias Engdegård
0 siblings, 1 reply; 7+ messages in thread
From: Ikumi Keita @ 2020-08-19 13:57 UTC (permalink / raw)
To: Mattias Engdegård; +Cc: Basil L. Contovounesios, Stefan Monnier, 42919
Hi Mattias,
>>>>> Mattias Engdegård <mattiase@acm.org> writes:
> I'm so sorry about this stupid error, and am very grateful that you found it.
> Would you try this patch (applicable to Emacs 27.1)?
Thanks, it now runs as expected! :-)
Regards,
Ikumi Keita
^ permalink raw reply [flat|nested] 7+ messages in thread
* bug#42919: 27.1; Strange byte compile error with `cond' involving cons
2020-08-19 13:57 ` Ikumi Keita
@ 2020-08-19 14:40 ` Mattias Engdegård
2020-08-19 17:19 ` Mattias Engdegård
0 siblings, 1 reply; 7+ messages in thread
From: Mattias Engdegård @ 2020-08-19 14:40 UTC (permalink / raw)
To: Ikumi Keita; +Cc: Basil L. Contovounesios, Stefan Monnier, 42919
19 aug. 2020 kl. 15.57 skrev Ikumi Keita <ikumi@ikumi.que.jp>:
> Thanks, it now runs as expected! :-)
Good with such a speedy confirmation! Since it will go into the release branch, I'll just wait for Stefan to say that it doesn't look completely bonkers before pushing.
^ permalink raw reply [flat|nested] 7+ messages in thread
* bug#42919: 27.1; Strange byte compile error with `cond' involving cons
2020-08-19 14:40 ` Mattias Engdegård
@ 2020-08-19 17:19 ` Mattias Engdegård
0 siblings, 0 replies; 7+ messages in thread
From: Mattias Engdegård @ 2020-08-19 17:19 UTC (permalink / raw)
To: 42919-done; +Cc: Basil L. Contovounesios, Ikumi Keita, Stefan Monnier
Pushed to emacs-27; closing.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2020-08-19 17:19 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-08-18 19:00 bug#42919: 27.1; Strange byte compile error with `cond' involving cons Ikumi Keita
2020-08-18 22:45 ` Basil L. Contovounesios
2020-08-19 9:15 ` Mattias Engdegård
2020-08-19 13:29 ` Mattias Engdegård
2020-08-19 13:57 ` Ikumi Keita
2020-08-19 14:40 ` Mattias Engdegård
2020-08-19 17:19 ` Mattias Engdegård
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.