Opened 15 years ago
Last modified 15 years ago
#38 new defect
Inlining loses declarations
Reported by: | Helmut Eller | Owned by: | somebody |
---|---|---|---|
Priority: | minor | Milestone: | |
Component: | Core | Version: | 20a |
Keywords: | Cc: |
Description
I'd like to write a function fx+ which is like + but only accepts fixnums as arguments and never conses, i.e. it's considered an error if the sum is not a fixnum. Arguments and return value should be checked. Essentially this
(declaim (inline fx+)) (defun fx+ (x y) (declare (fixnum x y) (values fixnum)) (+ x y))
is what I want. If called as (fx+ 1 most-positive-fixnum) the error is detected as it should be. But after inlining
(defun foo (x y) (fx+ x y))
and using it like (foo 1 most-positive-fixnum) it returns -536870912.
Note: See
TracTickets for help on using
tickets.
I'm not 100% sure, but it looks like the compiler believes the derived function type and inlines the function without the type check for the result type.
This bug does not exist in 18b, but 18b doesn't inline the function; it tail calls fx+. 18c and later actually inline the function and produces the unwanted result.
I agree that it would be nicer if the inlined function behaved like the not-inlined version. It seems the only way to get what you want is put an explicit check-type call.