X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=BUGS;h=41587108cd0f12d6586a59e47cbef9c4c2f844b7;hb=45e4225c7ceae7328b6951770f654932438ed266;hp=603a51ff387f7f081977737aaa1dc0d1a785b120;hpb=bc59d68844ec48359a26476e5947b38a778813b6;p=sbcl.git diff --git a/BUGS b/BUGS index 603a51f..4158710 100644 --- a/BUGS +++ b/BUGS @@ -1226,3 +1226,22 @@ WORKAROUND: strongly suspect that they would.) 288b2: SINGLE-FLOAT is distinct from DOUBLE-FLOAT. (This is in a sense just one aspect of bug 288a.) + +289: "type checking and source-transforms" + a. + (block nil (let () (funcall #'+ (eval 'nil) (eval '1) (return :good)))) + signals type error. + + Our policy is to check argument types at the moment of a call. It + disagrees with ANSI, which says that type assertions are put + immediately onto argument expressions, but is easier to implement in + IR1 and is more compatible to type inference, inline expansion, + etc. IR1-transforms automatically keep this policy, but source + transforms for associative functions (such as +), being applied + during IR1-convertion, do not. It may be tolerable for direct calls + (+ x y z), but for (FUNCALL #'+ x y z) it is non-conformant. + + b. Another aspect of this problem is efficiency. [x y + z +] + requires less registers than [x y z + +]. This transformation is + currently performed with source transforms, but it would be good to + also perform it in IR1 optimization phase.