Subject: bug#16184: 24.3.50; edebug and eval-when-compiler don't work together

From: Alan Mackenzie <[email-masked]>
Date: Sat, 31 Dec 2016 16:22:54 +0000

Hello again, Anders.

On Fri, Dec 30, 2016 at 09:02:31PM +0100, Anders Lindgren wrote:
> Hi!

> I just got around to test this. Now, `eval-when-comple' seems to be
> working. Unfortunately, `eval-and-comple' is still broken.

> If I do C-u M-C-x eval the following with `debug-on-error' set to t, I get
> the backtrace below:

> (defun test (limit)
>   (eval-and-compile
>     (boundp 'parse-sexp-lookup-properties)))

[ snip backtrace ]

I got a tip from Gemini Lasswell last night.  What is broken is not
edebug.el itself, but the edebug specs applied to various macros.  For
macros like eval-\(when\|and\)-compile, there needs to be an
edebug-enter form compile around the macro.  Most edebug specs don't
compile this - only (I think) def-form and def-body do.  This is not
clearly documented.

Anyhow, I've changed the edebug spec of eval-and-compile to what it
should be (\(cc-\)?eval-when-compile already had it), and I think these
problems are all solved.

Would you please try out the following patch, and let me know sometime
that it's OK, then I can commit it.

Happy New Year again!

diff --git a/lisp/emacs-lisp/byte-run.el b/lisp/emacs-lisp/byte-run.el
index 9d2a048..e680ebb 100644
--- a/lisp/emacs-lisp/byte-run.el
+++ b/lisp/emacs-lisp/byte-run.el
@@ -474,7 +474,7 @@ eval-and-compile
 `progn', except that the value of the expression may be (but is
 not necessarily) computed at load time if eager macro expansion
 is enabled."
-  (declare (debug t) (indent 0))
+  (declare (debug (&rest def-form)) (indent 0))
   ;; When the byte-compiler expands code, this macro is not used, so we're
   ;; either about to run `body' (plain interpretation) or we're doing eager
   ;; macroexpansion.
diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index 15b1389..fd3e48d 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -2052,15 +2052,10 @@ edebug-stack
 (defvar edebug-stack-depth -1)
 ;; Index of last edebug-stack item.
 
-(defvar edebug-offset-indices (list 0))
+(defvar edebug-offset-indices nil)
 ;; Stack of offset indices of visited edebug sexps.
 ;; Each function adds one cons.  Top is modified with setcar.
-;; Should be nil at the top level.  No longer!  There are occasions
-;; when this variable is modified by setcar before a cons has been
-;; pushed by `edebug-enter', e.g. when instrumenting
-;; `c-font-lock-declarations' in .../lisp/progmodes/cc-fonts.el.  So
-;; this variable must be initialized to a cons.
-
+;; Should be nil at the top level.
 (defvar edebug-entered nil
   ;; Non-nil if edebug has already been entered at this recursive edit level.
   ;; This should stay nil at the top level.

>     -- Anders

-- 
Alan Mackenzie (Nuremberg, Germany).