From 01430cae54294868432132f8f31be92056c04aa9 Mon Sep 17 00:00:00 2001 From: Simon Byrne Date: Tue, 16 Jan 2018 14:09:40 -0800 Subject: [PATCH] Add reduce_empty definitions for bitwise ops on integers (&, | and xor) --- base/reduce.jl | 6 ++++++ test/reduce.jl | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/base/reduce.jl b/base/reduce.jl index 811798e6651e6..4ee44b3739556 100644 --- a/base/reduce.jl +++ b/base/reduce.jl @@ -269,6 +269,12 @@ reduce_empty(::typeof(add_sum), ::Type{T}) where {T<:SmallUnsigned} = zero(UInt) reduce_empty(::typeof(mul_prod), T) = reduce_empty(*, T) reduce_empty(::typeof(mul_prod), ::Type{T}) where {T<:SmallSigned} = one(Int) reduce_empty(::typeof(mul_prod), ::Type{T}) where {T<:SmallUnsigned} = one(UInt) +reduce_empty(::typeof(&), ::Type{Bool}) = true +reduce_empty(::typeof(&), ::Type{T}) where {T<:Integer} = -1 % T +reduce_empty(::typeof(|), ::Type{Bool}) = false +reduce_empty(::typeof(|), ::Type{T}) where {T<:Integer} = zero(T) +reduce_empty(::typeof(xor), ::Type{Bool}) = false +reduce_empty(::typeof(xor), ::Type{T}) where {T<:Integer} = zero(T) """ Base.mapreduce_empty(f, op, T) diff --git a/test/reduce.jl b/test/reduce.jl index 66ac705fab643..0b44d87f58099 100644 --- a/test/reduce.jl +++ b/test/reduce.jl @@ -7,6 +7,12 @@ using Random @test foldl(+, Int16[]) === Int16(0) # In reference to issues #21536 @test foldl(-, 1:5) == -13 @test foldl(-, 10, 1:5) == -5 +@test foldl(&, UInt8[]) === typemax(UInt8) +@test foldl(&, Int8[]) === Int8(-1) +@test foldl(|, UInt8[]) === zero(UInt8) +@test foldl(|, Int8[]) === zero(Int8) +@test foldl(⊻, UInt8[]) === zero(UInt8) +@test foldl(⊻, Int8[]) === zero(Int8) @test Base.mapfoldl(abs2, -, 2:5) == -46 @test Base.mapfoldl(abs2, -, 10, 2:5) == -44 @@ -392,7 +398,7 @@ test18695(r) = sum( t^2 for t in r ) # test neutral element not picked incorrectly for &, | @test @inferred(foldl(&, Int[1])) === 1 -@test_throws ArgumentError foldl(&, Int[]) +@test foldl(&, Int[]) === -1 # prod on Chars @test prod(Char[]) == ""