Subject: Re: bug#74090: 31.0.50; Problems with dabbrev-expand

From: Juri Linkov <[email-masked]>
Date: Fri, 29 Nov 2024 09:14:33 +0200

unarchive 74090
thanks

>> Thanks, feel free to install on the emacs-30 branch.
>
> Thanks, typo corrected and pushed as commit f6c359cb66a

I don't remember seeing such backtrace before this change.
But now occasionally an error is raised on typing 'M-/':

Debugger entered--Lisp error: (error "Selecting deleted buffer")
  set-buffer(#<killed buffer>)
  (save-current-buffer (set-buffer buf) (if (and (or (eq (current-buffer) dabbrev--last-buffer) ...
  dabbrev-expand(nil)
  funcall-interactively(dabbrev-expand nil)
  command-execute(dabbrev-expand)

because can't set the killed buffer 'buf' here:

      (with-current-buffer buf
        (if (and (or (eq (current-buffer) dabbrev--last-buffer)
		     (null dabbrev--last-buffer)
                     (buffer-live-p dabbrev--last-buffer))
	         (numberp dabbrev--last-expansion-location)
	         (and (> dabbrev--last-expansion-location (point))))
	    (setq dabbrev--last-expansion-location
		  (copy-marker dabbrev--last-expansion-location))))

It's difficult to debug because the buffer is already killed at this point.
But looking at the logic of backtrace, here is a reproducible test case:

0. emacs-29 -Q
1. C-x b foo RET
2. Type: abc SPC abd
3. C-x b *scratch* RET
4. Type: ab M-/
5. C-x k foo RET
6. Type: SPC ab M-/