Opened 6 years ago

Closed 6 years ago

#1096 closed defect (fixed)

defsetf ignorable declarations are ignored.

Reported by: pjb@… Owned by:
Priority: normal Milestone:
Component: ANSI CL Compliance Version: trunk
Keywords: defsetf ignore ignorable Cc:


It seems the way ignore or ignorable declarations are implemented with defsetf doesn't make them entirely ignored, since a warning is still issued, and indeed, an uninterned symbol used in place of the parameter is still present and not declared anymore as ignored or ignorable.

(defgeneric bug (x y &optional z))

(defmethod bug ((x integer) y &optional z)
  (declare (ignorable z))
  (+ x y))

(defmethod bug ((x string) y &optional z)
  (list (aref x y) z))

(defun set-bug (x y new-value)
  (+ x y new-value))

(defsetf bug (x y &optional z) (new-value)
  (declare (ignorable z))
  `(set-bug ,x ,y ,new-value))

(defun f ()
  (setf (bug 42 0) 33))

(eval-when (:load-toplevel :execute)
  (pprint (swank-backend:macroexpand-all
           '(defun f ()
             (setf (bug 42 0) 33)))))


dictionary> (load (compile-file  #P"~/ccl-bug.lisp"))

;Compiler warnings for "home:ccl-bug.lisp.newest" :
;   In f: Unused lexical variable #:z

(progn (ccl::%defun (ccl:nfunction f
                                   (declare (ccl::global-function-name f))
                                   (block f
                                     (let* ((#:g90598 42) (#:g90597 0))
                                       (declare (ignorable #:g90598 #:g90597))
                                         (lambda (&optional #:g90596 &rest #:ignore)
                                           (declare (ignore #:ignore))
                                           ((lambda (#:x #:y &optional #:z) (set-bug #:x #:y #:g90596))
                                            #:g90598 #:g90597))

Change History (1)

comment:1 Changed 6 years ago by gb

  • Resolution set to fixed
  • Status changed from new to closed

(In [15855]) Temporary variables introduced in the expansion of the long form of DEFSETF may not be referenced, so declare them to be IGNORABLE.

Fixes ticket:1096 in the trunk.

Note: See TracTickets for help on using tickets.