Skip to content

Commit 3e04129

Browse files
authored
fix bit_map! with aliasing (#50781)
fixes #50780 caused by #47013.
1 parent 117ef2e commit 3e04129

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

base/bitarray.jl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1791,9 +1791,10 @@ function bit_map!(f::F, dest::BitArray, A::BitArray) where F
17911791
dest_last = destc[len_Ac]
17921792
_msk = _msk_end(A)
17931793
# first zero out the bits mask is going to change
1794-
destc[len_Ac] = (dest_last & (~_msk))
17951794
# then update bits by `or`ing with a masked RHS
1796-
destc[len_Ac] |= f(Ac[len_Ac]) & _msk
1795+
# DO NOT SEPARATE ONTO TO LINES.
1796+
# Otherwise there will be bugs when Ac aliases destc
1797+
destc[len_Ac] = (dest_last & (~_msk)) | f(Ac[len_Ac]) & _msk
17971798
dest
17981799
end
17991800
function bit_map!(f::F, dest::BitArray, A::BitArray, B::BitArray) where F
@@ -1812,9 +1813,10 @@ function bit_map!(f::F, dest::BitArray, A::BitArray, B::BitArray) where F
18121813
dest_last = destc[len_Ac]
18131814
_msk = _msk_end(min_bitlen)
18141815
# first zero out the bits mask is going to change
1815-
destc[len_Ac] = (dest_last & ~(_msk))
18161816
# then update bits by `or`ing with a masked RHS
1817-
destc[len_Ac] |= f(Ac[end], Bc[end]) & _msk
1817+
# DO NOT SEPARATE ONTO TO LINES.
1818+
# Otherwise there will be bugs when Ac or Bc aliases destc
1819+
destc[len_Ac] = (dest_last & ~(_msk)) | f(Ac[end], Bc[end]) & _msk
18181820
dest
18191821
end
18201822

test/bitarray.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1539,6 +1539,21 @@ timesofar("reductions")
15391539
end
15401540
end
15411541
end
1542+
@testset "Issue #50780, map! bitarray map! where dest aliases source" begin
1543+
a = BitVector([1,0])
1544+
b = map(!, a)
1545+
map!(!, a, a) # a .= !.a
1546+
@test a == b == BitVector([0,1])
1547+
1548+
a = BitVector([1,0])
1549+
c = map(|, a, b)
1550+
map!(|, a, a, b)
1551+
@test c == a == BitVector([1, 1])
1552+
1553+
a = BitVector([1,0])
1554+
map!(|, b, a, b)
1555+
@test c == b == BitVector([1, 1])
1556+
end
15421557
end
15431558

15441559
## Filter ##

0 commit comments

Comments
 (0)