Skip to content

Commit f705e60

Browse files
authored
Implement reduce_empty(op, Union{}) (#35843)
1 parent 852ff2b commit f705e60

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

base/reduce.jl

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -306,25 +306,29 @@ with reduction `op` over an empty array with element type of `T`.
306306
307307
If not defined, this will throw an `ArgumentError`.
308308
"""
309-
reduce_empty(op, T) = _empty_reduce_error()
310-
reduce_empty(::typeof(+), T) = zero(T)
309+
reduce_empty(op, ::Type{T}) where {T} = _empty_reduce_error()
310+
reduce_empty(::typeof(+), ::Type{Union{}}) = _empty_reduce_error()
311+
reduce_empty(::typeof(+), ::Type{T}) where {T} = zero(T)
311312
reduce_empty(::typeof(+), ::Type{Bool}) = zero(Int)
312-
reduce_empty(::typeof(*), T) = one(T)
313+
reduce_empty(::typeof(*), ::Type{Union{}}) = _empty_reduce_error()
314+
reduce_empty(::typeof(*), ::Type{T}) where {T} = one(T)
313315
reduce_empty(::typeof(*), ::Type{<:AbstractChar}) = ""
314316
reduce_empty(::typeof(&), ::Type{Bool}) = true
315317
reduce_empty(::typeof(|), ::Type{Bool}) = false
316318

317-
reduce_empty(::typeof(add_sum), T) = reduce_empty(+, T)
319+
reduce_empty(::typeof(add_sum), ::Type{Union{}}) = _empty_reduce_error()
320+
reduce_empty(::typeof(add_sum), ::Type{T}) where {T} = reduce_empty(+, T)
318321
reduce_empty(::typeof(add_sum), ::Type{T}) where {T<:SmallSigned} = zero(Int)
319322
reduce_empty(::typeof(add_sum), ::Type{T}) where {T<:SmallUnsigned} = zero(UInt)
320-
reduce_empty(::typeof(mul_prod), T) = reduce_empty(*, T)
323+
reduce_empty(::typeof(mul_prod), ::Type{Union{}}) = _empty_reduce_error()
324+
reduce_empty(::typeof(mul_prod), ::Type{T}) where {T} = reduce_empty(*, T)
321325
reduce_empty(::typeof(mul_prod), ::Type{T}) where {T<:SmallSigned} = one(Int)
322326
reduce_empty(::typeof(mul_prod), ::Type{T}) where {T<:SmallUnsigned} = one(UInt)
323327

324-
reduce_empty(op::BottomRF, T) = reduce_empty(op.rf, T)
325-
reduce_empty(op::MappingRF, T) = mapreduce_empty(op.f, op.rf, T)
326-
reduce_empty(op::FilteringRF, T) = reduce_empty(op.rf, T)
327-
reduce_empty(op::FlipArgs, T) = reduce_empty(op.f, T)
328+
reduce_empty(op::BottomRF, ::Type{T}) where {T} = reduce_empty(op.rf, T)
329+
reduce_empty(op::MappingRF, ::Type{T}) where {T} = mapreduce_empty(op.f, op.rf, T)
330+
reduce_empty(op::FilteringRF, ::Type{T}) where {T} = reduce_empty(op.rf, T)
331+
reduce_empty(op::FlipArgs, ::Type{T}) where {T} = reduce_empty(op.f, T)
328332

329333
"""
330334
Base.mapreduce_empty(f, op, T)

test/reduce.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ end
4646
@test reduce(max, [8 6 7 5 3 0 9]) == 9
4747
@test reduce(+, 1:5; init=1000) == (1000 + 1 + 2 + 3 + 4 + 5)
4848
@test reduce(+, 1) == 1
49+
@test_throws ArgumentError reduce(*, ())
50+
@test_throws ArgumentError reduce(*, Union{}[])
4951

5052
# mapreduce
5153
@test mapreduce(-, +, [-10 -9 -3]) == ((10 + 9) + 3)
@@ -133,6 +135,7 @@ fz = float(z)
133135
@test sum(z) === 136
134136
@test sum(fz) === 136.0
135137

138+
@test_throws ArgumentError sum(Union{}[])
136139
@test_throws ArgumentError sum(sin, Int[])
137140
@test sum(sin, 3) == sin(3.0)
138141
@test sum(sin, [3]) == sin(3.0)

0 commit comments

Comments
 (0)