Marc: Here's the contents of a file: (declare (standard-bindings) (extended-bindings) (block)) (declare (not inline)) (define (safe-fixnum-+ x y) (declare (fixnum)) (+ x y)) Here's the expansion: [Bradley-Luciers-MacBook-Pro:~/programs/gambc-v4_6_2-devel] lucier% gsc -c -expansion crap.scm Expansion: (define safe-fixnum-+ (lambda (x y) (if (and ('#<procedure #2 ##fixnum?> y) ('#<procedure #2 ##fixnum?> x)) (let ((temp.2 ('#<procedure #3 ##fx+?> x y))) (if temp.2 temp.2 (if (and ('#<procedure #2 ##fixnum?> y) ('#<procedure #2 ##fixnum?> x)) (let ((temp.5 ('#<procedure #3 ##fx+?> x y))) (if temp.5 temp.5 ('#<procedure #4 fx+> x y))) ('#<procedure #4 fx+> x y)))) (if (and ('#<procedure #2 ##fixnum?> y) ('#<procedure #2 ##fixnum?> x)) (let ((temp.8 ('#<procedure #3 ##fx+?> x y))) (if temp.8 temp.8 ('#<procedure #4 fx+> x y))) ('#<procedure #4 fx+> x y))))) The C code generated by gsc matches the expansion. This is very strange results---checking three times whether x and y are fixnums? I can't understand this. Brad