close Warning: Can't synchronize with repository "(default)" ("(default)" is not readable or not a Git repository.). Look in the Trac log for more information.

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.

Change History (1)

comment:1 Changed 15 years ago by Raymond Toy

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.

Note: See TracTickets for help on using tickets.