From 40d4840ae120a6b81f41b935ab68e2f93448df07 Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Fri, 16 Jul 2010 15:23:48 -0400 Subject: [PATCH] Fixed unsafe optimization that considered floats as complexes. original commit: 60bfce14bc0166742fed7675b81d8c5c0dcec2d4 --- .../optimizer/generic/sqrt-segfault.rkt | 14 ++++++++++++++ collects/typed-scheme/types/subtype.rkt | 1 - 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 collects/tests/typed-scheme/optimizer/generic/sqrt-segfault.rkt diff --git a/collects/tests/typed-scheme/optimizer/generic/sqrt-segfault.rkt b/collects/tests/typed-scheme/optimizer/generic/sqrt-segfault.rkt new file mode 100644 index 00000000..887eb629 --- /dev/null +++ b/collects/tests/typed-scheme/optimizer/generic/sqrt-segfault.rkt @@ -0,0 +1,14 @@ +#lang typed/scheme #:optimize + +(require racket/unsafe/ops) + +;; from the nbody-generic benchmark. +;; the result of sqrt was an Inexact-Complex, so inexact complex opts kicked +;; in but they resulted in segfaulting code. +;; the problem was that having Float be a subtype of Inexact-Complex was wrong +;; since you can't do unsafe-flreal-part of a float + +(let* ([dx (- 0.0 0.0)] + [dist2 (* dx dx)] + [mag (assert (* dist2 (sqrt dist2)) inexact-real?)]) + (void)) diff --git a/collects/typed-scheme/types/subtype.rkt b/collects/typed-scheme/types/subtype.rkt index 6fa2969c..6f946a89 100644 --- a/collects/typed-scheme/types/subtype.rkt +++ b/collects/typed-scheme/types/subtype.rkt @@ -237,7 +237,6 @@ [((Base: 'Integer _) (Base: 'Number _)) A0] [((Base: 'Flonum _) (== -Real =t)) A0] [((Base: 'Integer _) (== -Real =t)) A0] - [((Base: 'Flonum _) (Base: 'InexactComplex _)) A0] [((Base: 'Flonum _) (Base: 'Number _)) A0] [((Base: 'Exact-Rational _) (Base: 'Number _)) A0] [((Base: 'Integer _) (Base: 'Exact-Rational _)) A0]