(defun bug-match-data-marker-clobber () (interactive) (with-current-buffer (get-buffer-create "*test*") (display-buffer (current-buffer)) (erase-buffer) (insert "1234567890\n") (insert "abcdefghilk\n") (make-local-variable 'after-change-functions) (let* ((after-change-functions ` (,(lambda (&rest _) (let ((inhibit-modification-hooks nil) (after-change-functions nil)) (save-excursion (save-match-data (goto-char (point-min)) (looking-at "[0-9]") (delete-char 1)) ;; match-data is restored, but markers have a ;; different position now, because of the ;; deletion. ;; ;; (match-data) ;=> (# #) )))))) (search-backward "abcdef") ;; (match-data) ;=> (# #) (replace-match "ABCDEF" t t) ;; Triggers `after-change-functions'. ))) (setq debug-on-error t) (define-key global-map [f12] 'bug-match-data-marker-clobber)