#603 no warning on bad :report function in define-condition

lisp error
closed-fixed
Sam Steingold
clisp (525)
5
2011-08-03
2011-08-02
Sam Steingold
No

(define-condition simple-foo (simple-error)
()
(:report (lambda (condition)
(let ((fstring (simple-condition-format-control condition)))
(if fstring
(apply #'format stream fstring
(simple-condition-format-arguments condition))
(clos:call-next-method))))))

the :report lambda is bad: it takes one argument instead of two.
however, no warning is issued because define-condition macroexpands to

(PROGN (DEFCLASS SIMPLE-FOO (SIMPLE-ERROR) NIL)
(DEFMETHOD PRINT-OBJECT ((CONDITION SIMPLE-FOO) STREAM)
(IF (OR *PRINT-ESCAPE* *PRINT-READABLY*) (CALL-NEXT-METHOD)
(PROGN
(FUNCALL
#'(LAMBDA (CONDITION)
(LET ((FSTRING (SIMPLE-CONDITION-FORMAT-CONTROL CONDITION)))
(IF FSTRING
(APPLY #'FORMAT STREAM FSTRING
(SIMPLE-CONDITION-FORMAT-ARGUMENTS CONDITION))
(CALL-NEXT-METHOD))))
CONDITION STREAM)
CONDITION)))
'SIMPLE-FOO)

and the lambda lives inside a print-object method where STEAM is already bound.
(if STREAM is replaced by ZZZ inside the body of lambda, there _is_ a warning!)
ergo: funcall should issue a warning here.

Discussion

  • Sam Steingold
    Sam Steingold
    2011-08-02

    • assigned_to: haible --> sds
     
  • Sam Steingold
    Sam Steingold
    2011-08-02

    also should warn:
    (mapcar (lambda () 1) '(1 2 3))

     
  • Sam Steingold
    Sam Steingold
    2011-08-03

    • status: open --> closed-fixed
     
  • Sam Steingold
    Sam Steingold
    2011-08-03

    thank you for your bug report.
    the bug has been fixed in the source tree (mercurial/hg).
    you can either wait for the next release (recommended)
    or check out the current mercurial tree (see http://clisp.org\)
    and build CLISP from the sources (be advised that between
    releases the source tree is very unstable and may not even build
    on your platform).