note that the signature of the function `abstract_call_gf` in which we see the confusion occur is:
```
(lldb) print jl_(f->linfo)
Base.abstract_call_gf(Type{Void<:T<:Union(Any, Undef)}, Array{Any, 1}, Type{Void<:T<:Union(Any, Undef)}, Expr)
(lldb) print jl_(args[0])
Base.SubString{Void<:T<:String}
(lldb) print jl_(args[1])
Array{Any, 1}[:str, :i, Expr(:call, :prevind, :str, :j)::Any]
(lldb) print jl_(args[2])
(Void<:T<:String, Int64, Any)
(lldb) print jl_(args[3])
Expr(:call, :SubString, :str, :i, Expr(:call, :prevind, :str, :j)::Any)::Any
```