diff --git a/base/reduce.jl b/base/reduce.jl index 414bac5099f78..6d19fa50e3037 100644 --- a/base/reduce.jl +++ b/base/reduce.jl @@ -306,25 +306,29 @@ with reduction `op` over an empty array with element type of `T`. If not defined, this will throw an `ArgumentError`. """ -reduce_empty(op, T) = _empty_reduce_error() -reduce_empty(::typeof(+), T) = zero(T) +reduce_empty(op, ::Type{T}) where {T} = _empty_reduce_error() +reduce_empty(::typeof(+), ::Type{Union{}}) = _empty_reduce_error() +reduce_empty(::typeof(+), ::Type{T}) where {T} = zero(T) reduce_empty(::typeof(+), ::Type{Bool}) = zero(Int) -reduce_empty(::typeof(*), T) = one(T) +reduce_empty(::typeof(*), ::Type{Union{}}) = _empty_reduce_error() +reduce_empty(::typeof(*), ::Type{T}) where {T} = one(T) reduce_empty(::typeof(*), ::Type{<:AbstractChar}) = "" reduce_empty(::typeof(&), ::Type{Bool}) = true reduce_empty(::typeof(|), ::Type{Bool}) = false -reduce_empty(::typeof(add_sum), T) = reduce_empty(+, T) +reduce_empty(::typeof(add_sum), ::Type{Union{}}) = _empty_reduce_error() +reduce_empty(::typeof(add_sum), ::Type{T}) where {T} = reduce_empty(+, T) reduce_empty(::typeof(add_sum), ::Type{T}) where {T<:SmallSigned} = zero(Int) 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{Union{}}) = _empty_reduce_error() +reduce_empty(::typeof(mul_prod), ::Type{T}) where {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(op::BottomRF, T) = reduce_empty(op.rf, T) -reduce_empty(op::MappingRF, T) = mapreduce_empty(op.f, op.rf, T) -reduce_empty(op::FilteringRF, T) = reduce_empty(op.rf, T) -reduce_empty(op::FlipArgs, T) = reduce_empty(op.f, T) +reduce_empty(op::BottomRF, ::Type{T}) where {T} = reduce_empty(op.rf, T) +reduce_empty(op::MappingRF, ::Type{T}) where {T} = mapreduce_empty(op.f, op.rf, T) +reduce_empty(op::FilteringRF, ::Type{T}) where {T} = reduce_empty(op.rf, T) +reduce_empty(op::FlipArgs, ::Type{T}) where {T} = reduce_empty(op.f, T) """ Base.mapreduce_empty(f, op, T) diff --git a/test/reduce.jl b/test/reduce.jl index 69b8b1911e7ea..9501f41f8b77c 100644 --- a/test/reduce.jl +++ b/test/reduce.jl @@ -46,6 +46,8 @@ end @test reduce(max, [8 6 7 5 3 0 9]) == 9 @test reduce(+, 1:5; init=1000) == (1000 + 1 + 2 + 3 + 4 + 5) @test reduce(+, 1) == 1 +@test_throws ArgumentError reduce(*, ()) +@test_throws ArgumentError reduce(*, Union{}[]) # mapreduce @test mapreduce(-, +, [-10 -9 -3]) == ((10 + 9) + 3) @@ -133,6 +135,7 @@ fz = float(z) @test sum(z) === 136 @test sum(fz) === 136.0 +@test_throws ArgumentError sum(Union{}[]) @test_throws ArgumentError sum(sin, Int[]) @test sum(sin, 3) == sin(3.0) @test sum(sin, [3]) == sin(3.0)