Andrew, I do not understand the details but I believe there are some restrictions when using generated functions. You are not supposed to use functions with side effects, closures, comprehensions and functions like promote_op which rely on inference confuse inference when in generated functions.
On Friday, September 23, 2016 at 10:16:17 PM UTC+2, Andrew Keller wrote: > > Does the promote_op mechanism in v0.5 play nicely with generated > functions? In Unitful.jl, I use a generated function to determine result > units after computations involving quantities with units. I seem to get > errors (@inferred tests fail) if I remove my promote_op specialization. > Perhaps my problems are all a consequence of > https://github.com/JuliaLang/julia/issues/18465 and they will go away > soon...? > > On Friday, September 23, 2016 at 5:54:03 AM UTC-7, Pablo Zubieta wrote: >> >> In julia 0.5 the following should work without needing doing anything to >> promote_op >> >> import Base.+ >> immutable Foo end >> +(a::Foo, b::Foo) =1.0 >> Array{Foo}(0) + Array{Foo}(0)) >> >> promote_op is supposed to be an internal method that you wouldn't need to >> override. If it is not working i because the operation you are doing is >> most likely not type stable. So instead of specializing it you could try to >> remove any type instabilities in the method definitions over your types. >> >> On Friday, September 23, 2016 at 5:35:05 AM UTC+2, Sheehan Olver wrote: >>> >>> >>> The subject says it all: it looks like one can override promote_op to >>> support the following behaviour: >>> >>> *julia> **import Base.+* >>> >>> >>> *julia> **immutable Foo end* >>> >>> WARNING: Method definition (::Type{Main.Foo})() in module Main at >>> REPL[5]:1 overwritten at REPL[10]:1. >>> >>> >>> *julia> **+(a::Foo,b::Foo) = 1.0* >>> >>> *+ (generic function with 164 methods)* >>> >>> >>> *julia> **Base.promote_op(::typeof(+),::Type{Foo},::Type{Foo}) = >>> Float64* >>> >>> >>> *julia> **Array(Foo,0) + Array(Foo,0)* >>> >>> *0-element Array{Float64,1}* >>> >>> >>> Is this documented somewhere? What if we want to override /, -, etc., >>> is the solution to write a promote_op for each case? >>> >>
