Define struct predicate before acccesors

The accessor functions use the predicate function, which causes problems
when reloading after unload-feature: the compiler-macro property is
still present on the predicate symbol, and the compiler fails to find
the definition when trying to inline it into the accessor
function (Bug#25088).

* lisp/emacs-lisp/cl-macs.el (cl-defstruct): Move predicate definition
before field accessor definitions.
This commit is contained in:
Noam Postavsky 2016-12-02 00:03:57 -05:00
parent 08decbd04b
commit e4ac450796

View file

@ -2687,6 +2687,14 @@ non-nil value, that slot cannot be set via `setf'.
(= safety 1))
(cons 'and (cl-cdddr pred-form))
`(,predicate cl-x))))
(when pred-form
(push `(cl-defsubst ,predicate (cl-x)
(declare (side-effect-free error-free))
,(if (eq (car pred-form) 'and)
(append pred-form '(t))
`(and ,pred-form t)))
forms)
(push `(put ',name 'cl-deftype-satisfies ',predicate) forms))
(let ((pos 0) (descp descs))
(while descp
(let* ((desc (pop descp))
@ -2741,14 +2749,6 @@ non-nil value, that slot cannot be set via `setf'.
(setq pos (1+ pos))))
(setq slots (nreverse slots)
defaults (nreverse defaults))
(when pred-form
(push `(cl-defsubst ,predicate (cl-x)
(declare (side-effect-free error-free))
,(if (eq (car pred-form) 'and)
(append pred-form '(t))
`(and ,pred-form t)))
forms)
(push `(put ',name 'cl-deftype-satisfies ',predicate) forms))
(and copier
(push `(defalias ',copier #'copy-sequence) forms))
(if constructor