From 3e055d5f58b0ade3f727cbf23d3cc626f737a783 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sat, 18 Dec 2021 23:05:26 -0500 Subject: [PATCH] * lisp/emacs-lisp/cl-generic.el (cl-generic--fcr-generalizer): Fix precedence --- lisp/emacs-lisp/cl-generic.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el index 0dad76aa59b..643c006e431 100644 --- a/lisp/emacs-lisp/cl-generic.el +++ b/lisp/emacs-lisp/cl-generic.el @@ -1279,6 +1279,9 @@ Used internally for the (major-mode MODE) context specializers." ;;; Dispatch on FCR type +;; It would make sense to put this into `fcr.el' except that when +;; `fcr.el' is loaded `cl-defmethod' is not available yet. + (defun cl--generic-fcr-tag (name &rest _) `(fcr-type ,name)) @@ -1289,7 +1292,11 @@ Used internally for the (major-mode MODE) context specializers." (cl--class-allparents class))))) (cl-generic-define-generalizer cl-generic--fcr-generalizer - 50 #'cl--generic-fcr-tag + ;; Give slightly higher priority than the struct specializer, so that + ;; for a generic function with methods dispatching structs and on FCRs, + ;; we first try `fcr-type' before `type-of' since `type-of' will return + ;; non-nil for an FCR as well. + 51 #'cl--generic-fcr-tag #'cl-generic--fcr-specializers) (cl-defmethod cl-generic-generalizers :extra "fcr-struct" (type) -- 2.39.5