Skip to content

Commit a0c4f21

Browse files
committed
Fix union!(s::BitSet, r::AbstractUnitRange{<:Integer}) when two ranges do not overlap.
Resizing of BitSet should be filled with 0 by default.
1 parent bd8dbc3 commit a0c4f21

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

base/bitset.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ function union!(s::BitSet, r::AbstractUnitRange{<:Integer})
137137

138138
# grow s.bits as necessary
139139
if diffb >= len
140-
_growend!(s.bits, diffb - len + 1)
140+
_growend0!(s.bits, diffb - len + 1)
141141
# we set only some values to CHK0, those which will not be
142142
# fully overwritten (i.e. only or'ed with `|`)
143143
s.bits[end] = CHK0 # end == diffb + 1
@@ -146,7 +146,7 @@ function union!(s::BitSet, r::AbstractUnitRange{<:Integer})
146146
end
147147
end
148148
if diffa < 0
149-
_growbeg!(s.bits, -diffa)
149+
_growbeg0!(s.bits, -diffa)
150150
s.bits[1] = CHK0
151151
if diffb < 0
152152
s.bits[diffb - diffa + 1] = CHK0

test/bitset.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,3 +351,12 @@ end
351351
# union! with an empty range doesn't modify the BitSet
352352
@test union!(x, b:a) == y
353353
end
354+
355+
@testset "union!(::BitSet, ::AbstractUnitRange) when two ranges do not overlap" begin
356+
# see #45574
357+
a, b = minmax(rand(-1000:1000, 2)...)
358+
c, d = minmax(rand(2000:3000, 2)...)
359+
@test length(union!(BitSet(a:b), c:d)) == length(a:b) + length(c:d)
360+
c, d = minmax(rand(-3000:-2000, 2)...)
361+
@test length(union!(BitSet(a:b), c:d)) == length(a:b) + length(c:d)
362+
end

0 commit comments

Comments
 (0)