Skip to content

Commit 328b561

Browse files
authored
Merge pull request #17611 from JuliaLang/teh/steprange
Make StepRange safe for more number types
2 parents af7ea3d + 980daef commit 328b561

File tree

2 files changed

+27
-20
lines changed

2 files changed

+27
-20
lines changed

base/range.jl

+16-9
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,7 @@ function steprange_last{T}(start::T, step, stop)
3131
last = stop
3232
else
3333
if (step > z) != (stop > start)
34-
# empty range has a special representation where stop = start-1
35-
# this is needed to avoid the wrap-around that can happen computing
36-
# start - step, which leads to a range that looks very large instead
37-
# of empty.
38-
if step > z
39-
last = start - one(stop-start)
40-
else
41-
last = start + one(stop-start)
42-
end
34+
last = steprange_last_empty(start, step, stop)
4335
else
4436
diff = stop - start
4537
if T<:Signed && (diff > zero(diff)) != (stop > start)
@@ -58,6 +50,21 @@ function steprange_last{T}(start::T, step, stop)
5850
last
5951
end
6052

53+
function steprange_last_empty{T<:Integer}(start::T, step, stop)
54+
# empty range has a special representation where stop = start-1
55+
# this is needed to avoid the wrap-around that can happen computing
56+
# start - step, which leads to a range that looks very large instead
57+
# of empty.
58+
if step > zero(step)
59+
last = start - one(stop-start)
60+
else
61+
last = start + one(stop-start)
62+
end
63+
last
64+
end
65+
# For types where x+one(x) may not be well-defined
66+
steprange_last_empty(start, step, stop) = start - step
67+
6168
steprem(start,stop,step) = (stop-start) % step
6269

6370
StepRange{T,S}(start::T, step::S, stop::T) = StepRange{T,S}(start, step, stop)

test/dates/ranges.jl

+11-11
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ function test_all_combos()
1414
@test length(dr) == 0
1515
@test isempty(dr)
1616
@test first(dr) == f1
17-
@test last(dr) == f1-one(l1 - f1)
17+
@test last(dr) < f1
1818
@test length([i for i in dr]) == 0
1919
@test_throws ArgumentError minimum(dr)
2020
@test_throws ArgumentError maximum(dr)
@@ -23,8 +23,8 @@ function test_all_combos()
2323
@test [dr;] == T[]
2424
@test isempty(reverse(dr))
2525
@test length(reverse(dr)) == 0
26-
@test first(reverse(dr)) == f1-one(l1 - f1)
27-
@test last(reverse(dr)) == f1
26+
@test first(reverse(dr)) < f1
27+
@test last(reverse(dr)) >= f1
2828
@test issorted(dr)
2929
@test sortperm(dr) == 1:1:0
3030
@test !(f1 in dr)
@@ -66,7 +66,7 @@ function test_all_combos()
6666
@test length(dr) == 0
6767
@test isempty(dr)
6868
@test first(dr) == l1
69-
@test last(dr) == l1+one(l1 - f1)
69+
@test last(dr) > l1
7070
@test length([i for i in dr]) == 0
7171
@test_throws ArgumentError minimum(dr)
7272
@test_throws ArgumentError maximum(dr)
@@ -75,8 +75,8 @@ function test_all_combos()
7575
@test [dr;] == T[]
7676
@test isempty(reverse(dr))
7777
@test length(reverse(dr)) == 0
78-
@test first(reverse(dr)) == l1+one(l1 - f1)
79-
@test last(reverse(dr)) == l1
78+
@test first(reverse(dr)) > l1
79+
@test last(reverse(dr)) <= l1
8080
@test !issorted(dr)
8181
@test sortperm(dr) == 0:-1:1
8282
@test !(l1 in dr)
@@ -119,7 +119,7 @@ function test_all_combos()
119119
@test length(dr) == 0
120120
@test isempty(dr)
121121
@test first(dr) == f1
122-
@test last(dr) == f1-one(l1 - f1)
122+
@test last(dr) < f1
123123
@test length([i for i in dr]) == 0
124124
@test_throws ArgumentError minimum(dr)
125125
@test_throws ArgumentError maximum(dr)
@@ -128,8 +128,8 @@ function test_all_combos()
128128
@test [dr;] == T[]
129129
@test isempty(reverse(dr))
130130
@test length(reverse(dr)) == 0
131-
@test first(reverse(dr)) == f1-one(l1 - f1)
132-
@test last(reverse(dr)) == f1
131+
@test first(reverse(dr)) < f1
132+
@test last(reverse(dr)) >= f1
133133
@test issorted(dr)
134134
@test sortperm(dr) == 1:1:0
135135
@test !(f1 in dr)
@@ -171,7 +171,7 @@ function test_all_combos()
171171
@test length(dr) == 0
172172
@test isempty(dr)
173173
@test first(dr) == l1
174-
@test last(dr) == l1+one(l1 - f1)
174+
@test last(dr) > l1
175175
@test length([i for i in dr]) == 0
176176
@test_throws ArgumentError minimum(dr)
177177
@test_throws ArgumentError maximum(dr)
@@ -180,7 +180,7 @@ function test_all_combos()
180180
@test [dr;] == T[]
181181
@test isempty(reverse(dr))
182182
@test length(reverse(dr)) == 0
183-
@test first(reverse(dr)) == l1+one(l1 - f1)
183+
@test first(reverse(dr)) > l1
184184
@test last(reverse(dr)) <= l1
185185
@test !issorted(dr)
186186
@test sortperm(dr) == 0:-1:1

0 commit comments

Comments
 (0)