diff --git a/collects/tests/typed-racket/optimizer/tests/vector-bounds-check.rkt b/collects/tests/typed-racket/optimizer/tests/vector-bounds-check.rkt new file mode 100644 index 0000000000..e43b3fe349 --- /dev/null +++ b/collects/tests/typed-racket/optimizer/tests/vector-bounds-check.rkt @@ -0,0 +1,24 @@ +#; +( +1.0 +1.0 +) + +#lang typed/racket +(require racket/flonum) + +(define: been-there-vector? : Boolean #f) +(define: been-there-flvector? : Boolean #f) +(define (make-my-vector) + (if been-there-vector? + (error "make-my-vector should only be called once!") + (set! been-there-vector? #t)) + (ann (vector 1.0 2.0 3.0) (Vectorof Flonum))) +(define (make-my-flvector) + (if been-there-flvector? + (error "make-my-flvector should only be called once!") + (set! been-there-flvector? #t)) + (flvector 1.0 2.0 3.0)) + +(vector-ref (make-my-vector) 0) +(flvector-ref (make-my-flvector) 0) diff --git a/collects/typed-racket/optimizer/vector.rkt b/collects/typed-racket/optimizer/vector.rkt index 85b41935f9..d22fd48700 100644 --- a/collects/typed-racket/optimizer/vector.rkt +++ b/collects/typed-racket/optimizer/vector.rkt @@ -89,7 +89,7 @@ [new-v #,((optimize) #'v)]) ;; do the impersonator check up front, to avoid doing it twice (length and op) (if (impersonator? new-v) - (if #,(let ([one-sided #'(unsafe-fx< new-i (unsafe-vector*-length v))]) + (if #,(let ([one-sided #'(unsafe-fx< new-i (unsafe-vector*-length new-v))]) (if i-known-nonneg? ;; we know it's nonnegative, one-sided check one-sided @@ -98,7 +98,7 @@ (op.unsafe new-v new-i #,@(syntax-map (optimize) #'(new ...))) #,safe-fallback) ; will error. to give the right error message ;; not an impersonator, can use unsafe-vector* ops - (if #,(let ([one-sided #'(unsafe-fx< new-i (unsafe-vector-length v))]) + (if #,(let ([one-sided #'(unsafe-fx< new-i (unsafe-vector-length new-v))]) (if i-known-nonneg? one-sided #`(and (unsafe-fx>= new-i 0) @@ -116,7 +116,7 @@ [i-known-nonneg? (subtypeof? #'i -NonNegFixnum)]) #`(let ([new-i #,((optimize) #'i)] [new-v #,((optimize) #'v)]) - (if #,(let ([one-sided #'(unsafe-fx< new-i (unsafe-flvector-length v))]) + (if #,(let ([one-sided #'(unsafe-fx< new-i (unsafe-flvector-length new-v))]) (if i-known-nonneg? one-sided #`(and (unsafe-fx>= new-i 0)