]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix nativecomp ICE compiling structure related code (bug#63674)
authorAndrea Corallo <akrl@sdf.org>
Wed, 24 May 2023 15:05:26 +0000 (17:05 +0200)
committerAndrea Corallo <akrl@sdf.org>
Wed, 24 May 2023 15:20:38 +0000 (17:20 +0200)
* lisp/emacs-lisp/cl-macs.el (cl-defstruct): Define the predicate to
be effective at compile time as native comp relies on `cl-typep' that
relies o predicates to work.

* test/src/comp-resources/comp-test-funcs.el (cl-lib): Require.
(comp-test-struct): Define struct.
(comp-test-63674-1-f): Add new test.

lisp/emacs-lisp/cl-macs.el
test/src/comp-resources/comp-test-funcs.el

index 6590b1baa1e15ce3e301d8da4fba62349d1c0524..0b09cd7d22532b809832e0a6f791469104aea0c5 100644 (file)
@@ -3093,13 +3093,16 @@ To see the documentation for a defined struct type, use
                               (cons 'and (cdddr pred-form))
                             `(,predicate cl-x))))
     (when pred-form
-      (push `(,defsym ,predicate (cl-x)
+      (push `(eval-and-compile
+               ;; Define the predicate to be effective at compile time
+               ;; as native comp relies on `cl-typep' that relies on
+               ;; predicates to be defined as they are registered in
+               ;; cl-deftype-satisfies.
+               (,defsym ,predicate (cl-x)
                (declare (side-effect-free error-free) (pure t))
                ,(if (eq (car pred-form) 'and)
                     (append pred-form '(t))
                   `(and ,pred-form t)))
-            forms)
-      (push `(eval-and-compile
                (define-symbol-prop ',name 'cl-deftype-satisfies ',predicate))
             forms))
     (let ((pos 0) (descp descs))
index 73da7182a54408d5ae1791a9e5e9b09a5b1e7064..d8c72c1a920a2cfadf161f41e0d71c5323a72154 100644 (file)
@@ -23,6 +23,8 @@
 
 ;;; Code:
 
+(require 'cl-lib)
+
 (defvar comp-tests-var1 3)
 
 (defun comp-tests-varref-f ()
     (comp-test-62537-1-f))
   t)
 
+(cl-defstruct comp-test-struct)
+
+(defun comp-test-63674-1-f (x)
+  (or
+   (if (comp-test-struct-p pkg) x)
+   t))
 
 \f
 ;;;;;;;;;;;;;;;;;;;;