From: Nikodemus S. <nik...@ra...> - 2009-04-22 18:55:05
|
2009/4/22 Nikodemus Siivola <nik...@ra...>: > The reason why this is currently a bad idea is that type inference > doesn't deal with compound types correctly: the inoccuous THE below > makes SBCL think that X is still a (CONS FIXNUM FIXNUM) even after the > SETF CAR. > > (defun foo (y) > (declare (optimize safety)) > (let ((x (the (cons fixnum fixnum) (cons 1 2)))) > (setf (car x) y) > (+ (car x) (cdr x)))) > > (foo "foo") ; => 74339983 > > Oops... Here's the bug: > > https://bugs.launchpad.net/sbcl/+bug/309445 I did some more looking around this issue. One way to fix this would be to generate some sort of a dummy SET node for each function that messes up a compound object (%RPLACA, %RPLACD, destructive list functions, etc.) Seems like a principled way to fix this -- but requires making a comprehensive list of things which can mess things up. With the additional SET nodes -- and some additional magic -- PROPAGATE-FROM-SETS should be able to deal with this. Cheers, -- Nikodemus |