From: Nikodemus S. <de...@us...> - 2010-09-01 14:42:18
|
Update of /cvsroot/sbcl/sbcl/tests In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv20350/tests Modified Files: compiler.pure.lisp Log Message: 1.0.42.15: prevent inline expansion from creating refs to dead lambda-vars * Fixes lp#454681. * Patch by Alexey. In his words, in reference to the test-case: (multiple-value-bind (iterator+977 getter+978) (does-not-exist-but-does-not-matter) (flet ((iterator+976 () (funcall iterator+977))) (declare (inline iterator+976)) (let ((iterator+976 #'iterator+976)) (funcall iterator+976))))) Inline expansion of ITERATOR+976 tries to refer to a dead LAMBDA-VAR ITERATOR+977 of varargs entry, which was substituted with ITERATOR+977 of &OPTIONAL processor. Thus the referenced variable is dead and is not bound anywhere. The attached patch fixes the problem by giving up on inline expansion if it tries to make a reference to a dead LAMBDA-VAR, similar to the way dead BLOCK tags are treated. Index: compiler.pure.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/tests/compiler.pure.lisp,v retrieving revision 1.229 retrieving revision 1.230 diff -u -d -r1.229 -r1.230 --- compiler.pure.lisp 31 Aug 2010 11:27:35 -0000 1.229 +++ compiler.pure.lisp 1 Sep 2010 14:42:09 -0000 1.230 @@ -3505,3 +3505,16 @@ (with-test (:name :dotimes-non-integer-counter-value) (assert (raises-error? (dotimes (i 8.6)) type-error))) + +(with-test (:name :bug-454681) + ;; This used to break due to reference to a dead lambda-var during + ;; inline expansion. + (assert (compile nil + `(lambda () + (multiple-value-bind (iterator+977 getter+978) + (does-not-exist-but-does-not-matter) + (flet ((iterator+976 () + (funcall iterator+977))) + (declare (inline iterator+976)) + (let ((iterator+976 #'iterator+976)) + (funcall iterator+976)))))))) |