Subject: bug#3394: 23.0.94; define-derived-mode keymap inheritance

From: "Drew Adams" <[email-masked]>
Date: Tue, 26 May 2009 15:11:04 -0700

Reporting this as a bug just in case it is. I don't know.
 
I have a file that requires `buff-menu.el', then does this, to
redefine `Buffer-menu-mode'.
 
(when (> emacs-major-version 22)
  (put 'Buffer-menu-mode 'mode-class 'special)
  (define-derived-mode Buffer-menu-mode special-mode "Buffer Menu"
    "..."
    (set (make-local-variable 'revert-buffer-function)
         'Buffer-menu-revert-function)
    (set (make-local-variable 'buffer-stale-function)
         #'(lambda (&optional noconfirm) 'fast))
    (setq truncate-lines t)
    (setq buffer-read-only t)))
 
That definition is actually identical to the original definition in
buff-menu.el. (In reality, my code adds a bit to the original
definition, but the problem occurs also with just the code above.
 
If I byte-compile the file in Emacs 22 or 23, which have
`define-derived-mode', then there is no problem. (Likewise, if
I load the *.el file instead of the *.elc.)

If I byte-compile in Emacs 20 (which does not have
`define-derived-mode'), then everything still works as usual,
except for one thing: The keymap for `special-mode' is apparently
not inherited. So for example, `q' and `g' have no key bindings
in the *Buffer List*.
 
By eyeballing it, the *.elc file would seem to be picking up the
`define-derived-mode' code as if it were a top-level function call,
which is what I would expect. I assume that the macro is defined when
the *.elc is loaded, so I would expect that `define-derived-mode'
would do its thing normally when the *.elc is loaded.
 
I know that there is no guarantee (quite the opposite) that code
byte-compiled in Emacs 20 will work in Emacs 23. But I wonder if there
might be a bug here anyway, wrt the keymap inheritance. If not, OK. In
that case, I'm just a bit curious what's happening - why everything
else seems to work fine, but the `special-mode' keymap doesn't seem to
be inherited.

In GNU Emacs 23.0.94.1 (i386-mingw-nt5.1.2600)
 of 2009-05-24 on SOFT-MJASON
Windowing system distributor `Microsoft Corp.', version 5.1.2600
configured using `configure --with-gcc (3.4)'