diff --git a/pkgs/racket-test-core/tests/racket/number.rktl b/pkgs/racket-test-core/tests/racket/number.rktl index e6e39b3baf..ff4a0db29e 100644 --- a/pkgs/racket-test-core/tests/racket/number.rktl +++ b/pkgs/racket-test-core/tests/racket/number.rktl @@ -998,6 +998,8 @@ (test 0.0 modulo -4.0 2) (test 0.0 modulo 4.0 -2) (test 0.0 modulo -4.0 -2) +(test 1.0 modulo 21.0 2) +(test 1.0 modulo -21.0 2) (test 0 remainder 4 2) (test 0 remainder -4 2) (test 0 remainder 4 -2) @@ -1006,6 +1008,8 @@ (test 0.0 remainder -4.0 2) (test 0.0 remainder 4.0 -2) (test 0.0 remainder -4.0 -2) +(test 1.0 remainder 21.0 2) +(test -1.0 remainder -21.0 2) (test 0 modulo 0 5.0) (test 0 modulo 0 -5.0) (test 0 remainder 0 5.0) diff --git a/racket/collects/compiler/private/xform.rkt b/racket/collects/compiler/private/xform.rkt index cd0b8b0921..a13e879114 100644 --- a/racket/collects/compiler/private/xform.rkt +++ b/racket/collects/compiler/private/xform.rkt @@ -1758,13 +1758,16 @@ (define (simple-unused-def? e) (and (not precompiling-header?) (andmap (lambda (x) (and (symbol? (tok-n x)) - (not (eq? '|,| (tok-n x))))) + (not (eq? '|,| (tok-n x))))) e) (= 1 (hash-ref used-symbols - (let loop ([e e]) - (if (null? (cddr e)) - (tok-n (car e)) - (loop (cdr e)))))))) + (let loop ([e e]) + (if (or (null? (cddr e)) + (and (pair? (cdr e)) + (eq? '= (tok-n (cadr e))) + (= (length e) 4))) + (tok-n (car e)) + (loop (cdr e)))))))) ;; See `simple-unused-def?'. The `struct' case is more ;; complex, because multiple names might be assigned diff --git a/racket/src/racket/src/env.c b/racket/src/racket/src/env.c index d18f1581f2..ec3f9ceda5 100644 --- a/racket/src/racket/src/env.c +++ b/racket/src/racket/src/env.c @@ -856,6 +856,8 @@ static void make_kernel_env(void) scheme_init_print_global_constants(); scheme_init_variable_references_constants(); + scheme_init_longdouble_fixup(); + scheme_defining_primitives = 0; } diff --git a/racket/src/racket/src/number.c b/racket/src/racket/src/number.c index a0c8b6baa4..f8154cb7fe 100644 --- a/racket/src/racket/src/number.c +++ b/racket/src/racket/src/number.c @@ -1568,6 +1568,24 @@ void scheme_init_extfl_unsafe_number(Scheme_Env *env) scheme_add_global_constant("unsafe-f80vector-set!", p, env); } +#ifdef _MSC_VER +/* Something about loading "longdouble.dll" can interfere with + fmod() so that it fails on a first call, but works on subsequent + calls. The issue doesn't seem to be as simple as the floating-point + control state, it seems to affect mainly MSVC 2008 builds, only + the 3m build, etc. Using a non-static variable ensures that the + compiler doesn't optimize away the call to fmod(). */ +double scheme_longdouble_fixup_hack = 4; +void scheme_init_longdouble_fixup(void) +{ + scheme_longdouble_fixup_hack = fmod(scheme_longdouble_fixup_hack, 2.0); +} +#else +void scheme_init_longdouble_fixup(void) +{ +} +#endif + Scheme_Object * scheme_make_integer_value(intptr_t i) { diff --git a/racket/src/racket/src/schpriv.h b/racket/src/racket/src/schpriv.h index c824595b86..fb1fcf2102 100644 --- a/racket/src/racket/src/schpriv.h +++ b/racket/src/racket/src/schpriv.h @@ -387,6 +387,7 @@ void scheme_init_parameterization(); void scheme_init_getenv(void); void scheme_init_inspector(void); void scheme_init_compenv_symbol(void); +void scheme_init_longdouble_fixup(void); #ifndef DONT_USE_FOREIGN void scheme_init_foreign_globals();