Subject: bug#49746: closed (bug#49746: 28.0.50; bytecompilation introduces bug in org-capture with certain template)

From: [email-masked] (GNU bug Tracking System)
Date: Tue, 27 Jul 2021 15:46:02 +0000

Your bug report

#49746: 28.0.50; bytecompilation introduces bug in org-capture with certain template

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
49746: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=49746
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: bug#49746: 28.0.50; bytecompilation introduces bug in org-capture with certain template
From: Mattias Engdegård <[email-masked]>
To: Gregor Zattler <[email-masked]>
Cc: [email-masked]
Date: Tue, 27 Jul 2021 17:45:29 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Thanks for reporting it. Your bisection saved a lot of time!

Fixed on master. Most embarrassing! Heaven knows what else was miscompiled.

Subject: 28.0.50; bytecompilation introduces bug in org-capture with certain template
From: Gregor Zattler <[email-masked]>
To: [email-masked]
Date: Tue, 27 Jul 2021 15:58:58 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Dear emacs developers, I use org-capture a lot with
org-capture-templates. It stopped working a few days ago,
throwing a error message instead:

org-capture: Capture abort: Unknown template placeholder: "%^g"

This is due to a problem with byte compilation.  It does not
happen, if I remove all .elc files before starting emacs.

You may test it with this:

(custom-set-variables
 '(org-capture-templates '(("d" "diary" entry (file "~/notes.org") "*** %? %^g"))))

in   minconfig.el   and with this invocation of emacs:

~/src/emacs$ src/emacs -Q -l /tmp/minconfig.el --eval '(org-capture 0 "d")'

If this gives you an error, quit emacs, remove all .elc
-files:

~/src/emacs$ find -type f -print0| grep -zZ "\.elc$" |xargs -0r rm

start emacs again:

~/src/emacs$ src/emacs -Q -l /tmp/minconfig.el --eval '(org-capture 0 "d")'

and there is no error.

I narrowed it down to this commit:

51a86b6a0504d580d3e10efe41abf3ae42c90711 is the first bad commit
commit 51a86b6a0504d580d3e10efe41abf3ae42c90711
Author: Mattias Engdegård <[email-masked]>
Date:   Tue Jul 20 17:23:11 2021 +0200

    Count (not X) as a switch condition

    * lisp/emacs-lisp/bytecomp.el (byte-compile--cond-switch-prefix):
    Treat (not VAR) and (null VAR) as (eq VAR nil) when computing the
    extent of switch ops.

diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 6970c8a5055..2968f1af5df 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -4340,6 +4340,16 @@ byte-compile--cond-switch-prefix
                          (push value keys)
                          (push (cons (list value) (or body '(t))) cases))
                        t))))
+             ;; Treat (not X) as (eq X nil).
+             (`((,(or 'not 'null) ,(and var (pred symbolp))) . ,body)
+              (and (or (eq var switch-var) (not switch-var))
+                   (progn
+                     (setq switch-var var)
+                     (setq switch-test 'eq)
+                     (unless (memq nil keys)
+                       (push nil keys)
+                       (push (cons (list nil) (or body '(t))) cases))
+                     t)))
              (`((,(and fn (or 'memq 'memql 'member)) ,var ,expr) . ,body)
               (and (symbolp var)
                    (or (eq var switch-var) (not switch-var))

:040000 040000 ae3e2ceaa690965108fb8547ce6e90ecd2fcaaf3 28eec9e6920160dc5dff29e2567ee34b50924bec M      lisp

The problem came up recently on the org-mode mailing list:
https://www.mail-archive.com/[email-masked]/msg138065.html
Especially this message:
https://www.mail-archive.com/[email-masked]/msg138121.html
inspired me to do a git bisect and test builds if the throw
this error and if so, if it also happens after removing all
.elc files.

For every step in git bisect I did a

rm -rf * ; git checkout -f ; make 

in order to make sure that all .elc files are build afresh.

Ciao; Gregor
-- 
 -... --- .-. . -.. ..--.. ...-.-