optimizer: abs expects and produces reals, not numbers

Related to #2685
This commit is contained in:
Matthew Flatt 2019-06-08 11:38:27 -06:00
parent 34cd1e2a2b
commit b133bea92e
2 changed files with 9 additions and 2 deletions

View File

@ -4039,6 +4039,13 @@
(check-number-op-unary 'sub1) (check-number-op-unary 'sub1)
(check-number-op-unary 'abs)) (check-number-op-unary 'abs))
;; `abs` wants and produces reals, not arbitrary numbers:
(test-comp '(lambda (x) (when (number? x) (abs x)) 5)
'(lambda (x) 5)
#f)
(test-comp '(lambda (x) (real? (abs x)))
'(lambda (x) (abs x) #t))
(test-comp '(lambda () (-) (void)) (test-comp '(lambda () (-) (void))
'(lambda () (void)) '(lambda () (void))
#f) #f)

View File

@ -124,9 +124,9 @@ void scheme_init_numarith(Scheme_Startup_Env *env)
p = scheme_make_folding_prim(scheme_abs, "abs", 1, 1, 1); p = scheme_make_folding_prim(scheme_abs, "abs", 1, 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |= scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNARY_INLINED SCHEME_PRIM_PROC_FLAGS(p) |= scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNARY_INLINED
| SCHEME_PRIM_WANTS_NUMBER | SCHEME_PRIM_WANTS_REAL
| SCHEME_PRIM_OMITTABLE_ON_GOOD_ARGS | SCHEME_PRIM_OMITTABLE_ON_GOOD_ARGS
| SCHEME_PRIM_PRODUCES_NUMBER | SCHEME_PRIM_PRODUCES_REAL
| SCHEME_PRIM_CLOSED_ON_REALS); | SCHEME_PRIM_CLOSED_ON_REALS);
scheme_addto_prim_instance("abs", p, env); scheme_addto_prim_instance("abs", p, env);