Skip to content

Commit 4231a73

Browse files
committedNov 3, 2017
Remove final uses of Inference.return_type
With this approach based on the eltype of tuple of computed elements, we get the correct dynamic result independently of whether inference can infer the return type. This fixes some of the residual issues from #198.
1 parent 400fd9c commit 4231a73

File tree

3 files changed

+18
-22
lines changed

3 files changed

+18
-22
lines changed
 

‎src/broadcast.jl

+2-4
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,10 @@ end
102102
end
103103
end
104104

105-
eltype_exprs = [t <: AbstractArray ? :($(eltype(t))) : :($t) for t a]
106-
newtype_expr = :(Core.Inference.return_type(f, Tuple{$(eltype_exprs...)}))
107-
108105
return quote
109106
@_inline_meta
110-
@inbounds return similar_type($first_staticarray, $newtype_expr, Size($newsize))(tuple($(exprs...)))
107+
elements = tuple($(exprs...))
108+
@inbounds return similar_type($first_staticarray, eltype(elements), Size($newsize))(elements)
111109
end
112110
end
113111

‎src/mapreduce.jl

+4-6
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,10 @@ end
2222
tmp = [:(a[$j][$i]) for j 1:length(a)]
2323
exprs[i] = :(f($(tmp...)))
2424
end
25-
eltypes = [eltype(a[j]) for j 1:length(a)] # presumably, `eltype` is "hyperpure"?
26-
newT = :(Core.Inference.return_type(f, Tuple{$(eltypes...)}))
2725
return quote
2826
@_inline_meta
29-
@inbounds return similar_type(typeof(_first(a...)), $newT, Size(S))(tuple($(exprs...)))
27+
elements = tuple($(exprs...))
28+
@inbounds return similar_type(typeof(_first(a...)), eltype(elements), Size(S))(elements)
3029
end
3130
end
3231

@@ -110,8 +109,6 @@ end
110109
@generated function _mapreducedim(f, op, ::Size{S}, a::StaticArray, ::Type{Val{D}}) where {S,D}
111110
N = length(S)
112111
Snew = ([n==D ? 1 : S[n] for n = 1:N]...)
113-
T0 = eltype(a)
114-
T = :((T1 = Core.Inference.return_type(f, Tuple{$T0}); Core.Inference.return_type(op, Tuple{T1,T1})))
115112

116113
exprs = Array{Expr}(Snew)
117114
itr = [1:n for n Snew]
@@ -128,7 +125,8 @@ end
128125

129126
return quote
130127
@_inline_meta
131-
@inbounds return similar_type(a, $T, Size($Snew))(tuple($(exprs...)))
128+
elements = tuple($(exprs...))
129+
@inbounds return similar_type(a, eltype(elements), Size($Snew))(elements)
132130
end
133131
end
134132

‎test/broadcast.jl

+12-12
Original file line numberDiff line numberDiff line change
@@ -134,22 +134,22 @@ end
134134
@testset "eltype after broadcast" begin
135135
# test cases issue #198
136136
let a = SVector{4, Number}(2, 2.0, 4//2, 2+0im)
137-
@test_broken eltype(a + 2) == Number
138-
@test_broken eltype(a - 2) == Number
139-
@test_broken eltype(a * 2) == Number
140-
@test_broken eltype(a / 2) == Number
137+
@test eltype(a + 2) == Number
138+
@test eltype(a - 2) == Number
139+
@test eltype(a * 2) == Number
140+
@test eltype(a / 2) == Number
141141
end
142142
let a = SVector{3, Real}(2, 2.0, 4//2)
143-
@test_broken eltype(a + 2) == Real
144-
@test_broken eltype(a - 2) == Real
145-
@test_broken eltype(a * 2) == Real
146-
@test_broken eltype(a / 2) == Real
143+
@test eltype(a + 2) == Real
144+
@test eltype(a - 2) == Real
145+
@test eltype(a * 2) == Real
146+
@test eltype(a / 2) == Real
147147
end
148148
let a = SVector{3, Real}(2, 2.0, 4//2)
149-
@test_broken eltype(a + 2.0) == Float64
150-
@test_broken eltype(a - 2.0) == Float64
151-
@test_broken eltype(a * 2.0) == Float64
152-
@test_broken eltype(a / 2.0) == Float64
149+
@test eltype(a + 2.0) == Float64
150+
@test eltype(a - 2.0) == Float64
151+
@test eltype(a * 2.0) == Float64
152+
@test eltype(a / 2.0) == Float64
153153
end
154154
let a = broadcast(Float32, SVector(3, 4, 5))
155155
@test eltype(a) == Float32

0 commit comments

Comments
 (0)
Please sign in to comment.