I ran into the following when tracking down a type instability issue. 
 Consider the following type hierarchy:

```julia

type T1{I<:Number} end

type T2{T<:T1} 
x::T
end

type T3{T<:T2} 
x::T
end

type T4{T<:T3} 
x::T
end

type T5{T<:T4} 
x::T
end
```
Now, two functions, one which returns a `T4`, and one which returns a `T5`.

```julia
function foo() 
t2 = T2( T1{Float64}() )
t3 = T3( t2 )
T4( t3 )
end

function bar() 
t2 = T2( T1{Float64}() )
t3 = T3( t2 )
t4 = T4( t3 )
T5( t4 )
end
```

Julia is able to infer the return type of `foo`, but not of `bar`.

```
julia> @code_warntype foo()
Variables:
  t2::T2{T1{Float64}}
  t3::T3{T2{T1{Float64}}}

Body:
  begin  #
      t2 = $(Expr(:new, T2{T1{Float64}}, :($(Expr(:new, T1{Float64}))))) # 
line 22:
      t3 = $(Expr(:new, T3{T2{T1{Float64}}}, :(t2::T2{T1{Float64}}))) # 
line 23:
      return $(Expr(:new, T4{T3{T2{T1{Float64}}}}, 
:(t3::T3{T2{T1{Float64}}})))
  end::T4{T3{T2{T1{Float64}}}}
Variables:
  t2::T2{T1{Float64}}
  t3::T3{T2{T1{Float64}}}
  t4::T4{T3{T2{T1{Float64}}}}

julia> @code_warntype bar()
Body:
  begin  #
      t2 = $(Expr(:new, T2{T1{Float64}}, :($(Expr(:new, T1{Float64}))))) # 
line 28:
      t3 = $(Expr(:new, T3{T2{T1{Float64}}}, :(t2::T2{T1{Float64}}))) # 
line 29:
      t4 = $(Expr(:new, T4{T3{T2{T1{Float64}}}}, 
:(t3::T3{T2{T1{Float64}}}))) # line 30:
      GenSym(0) = t4::T4{T3{T2{T1{Float64}}}}
      return 
((top(apply_type))(T5,T4{T3{T2{T1{Float64}}}})::TYPE{_<:T5{T<:T4{T<:T3{T<:T2{T<:T1{I<:NUMBER}}}}}})(GenSym(0))::T5{T<:T4{T<:T3{T<:T2{T<:T1{I<:NUMBER}}}}}
  end::T5{T<:T4{T<:T3{T<:T2{T<:T1{I<:NUMBER}}}}}
```
Am I running up against a genuine limit in Julia's type inference?

Reply via email to