From: Douglas K. <do...@go...> - 2013-11-11 21:01:56
|
In the following code, the compiler's derived type of the argument to 'namestring' in function THING1 is thought to be NULL. Consequently it emits an incorrect warning that the type is not right. In contrast, THING2 does not admit elision of LISTIFY-REST-ARG because the arg flows somewhere other than one of the known special cases for &more, and it does *not* produce a spurious warning about a bad argument to namestring. This is as far as I got. (defun thing1 (&rest args) (if (search "xyz" (namestring (first args))) (apply 'something args) (apply 'something-else args))) (defun thing2 (&rest args) (if (search "xyz" (namestring (first args))) (apply 'something args) (print args))) ; compiling file "/private/tmp/try.lisp" (written 11 NOV 2013 03:57:47 PM): ; compiling (DEFUN THING1 ...) ; file: /private/tmp/try.lisp ; in: DEFUN THING1 ; (FIRST ARGS) ; --> CAR SB-C::%REST-REF AND IF ; ==> ; NIL ; ; caught STYLE-WARNING: ; This is not a ; (OR (VECTOR CHARACTER) (VECTOR NIL) BASE-STRING PATHNAME FILE-STREAM): ; NIL ; See also: ; The SBCL Manual, Node "Handling of Types" ; compiling (DEFUN THING2 ...); ; compilation unit finished ; caught 1 STYLE-WARNING condition |
From: Paul K. <pv...@pv...> - 2013-11-12 06:45:51
|
Douglas Katzman wrote: > In the following code, the compiler's derived type of the argument to > 'namestring' in function THING1 is thought to be NULL. Consequently it > emits an incorrect warning that the type is not right. This happens when we have code of the form (the number (if FOO 42 'not-a-number)); in the case of %REST-REF, it's because we have a branch to return NIL instead of reading past the &more vector. The type assertion propagates to the value for both branches, and a conflict is detected. It would unfortunately be very difficult for SBCL to infer that such branches never happen. In most cases, including the one you reported, the situation is detected and a *style* warning is emitted, rather than a full warning, but not always (e.g. (compile nil `(lambda (x) (the number (if x 42 nil))))). Paul Khuong |