module Test
import Base: length, iterate, real
abstract type AbstractType{T} end
@inline length(p::T) where T <: AbstractType = 1
@inline iterate(p::T) where T <: AbstractType = (p,nothing)
#@inline iterate(p::T,st) where T <: AbstractType = nothing
@inline real(p::T) where T <: AbstractType = p
end # module Test
import .Test.AbstractType
struct S{T<:Number} <: AbstractType{T}
x::T
end
test(x, y) = x
@code_warntype test.(S(0), [0])
Gives output:
julia> @code_warntype test.(S(0), [0])
Variables
#self#::Core.Const(var"##dotfunction#245#5"())
x1::S{Int64}
x2::Vector{Int64}
Body::Union{}
1 ─ Base.broadcasted(Main.test, x1, x2)
│ Core.Const(:(Base.materialize(%1)))
└── Core.Const(:(return %2))
If uncomment @inline iterate(p::T,st) where T <: AbstractType = nothing, it gives a type unstable warning:
julia> @code_warntype test.(S(0), [0])
Variables
#self#::Core.Const(var"##dotfunction#245#5"())
x1::S{Int64}
x2::Vector{Int64}
Body::AbstractVector{var"#s827"} where var"#s827"
1 ─ %1 = Base.broadcasted(Main.test, x1, x2)::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(test), Tuple{Vector{Any}, Vector{Int64}}}
│ %2 = Base.materialize(%1)::AbstractVector{var"#s827"} where var"#s827"
└── return %2
julia> versioninfo()
Julia Version 1.6.0-beta1.0
Commit b84990e1ac (2021-01-08 12:42 UTC)
Platform Info:
OS: Windows (x86_64-w64-mingw32)
CPU: Intel(R) Xeon(R) W-10885M CPU @ 2.40GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-11.0.0 (ORCJIT, skylake)
Environment:
JULIA_DEPOT_PATH = E:\.julia
JULIA_NUM_THREADS = 4
JULIA_EDITOR = "D:\Programs\Microsoft VS Code\Code.exe"
julia 1.7.0-DEV.334 gives unstable warning:
julia> @code_warntype test.(S(0), [0])
Variables
#self#::Core.Const(var"##dotfunction#257#1"())
x1::S{Int64}
x2::Vector{Int64}
Body::AbstractVector{var"#s829"} where var"#s829"
1 ─ %1 = Base.broadcasted(Main.test, x1, x2)::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(test), Tuple{Vector{Any}, Vector{Int64}}}
│ %2 = Base.materialize(%1)::AbstractVector{var"#s829"} where var"#s829"
└── return %2
julia 1.5.2 gives a different unstable warning:
julia> @code_warntype test.(S(0), [0])
Variables
#self#::Core.Compiler.Const(var"##dotfunction#253#1"(), false)
x1::S{Int64}
x2::Array{Int64,1}
Body::Union{BitArray{1}, Array}
1 ─ %1 = Base.broadcasted(Main.test, x1, x2)::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Nothing,typeof(test),Tuple{Array{Any,1},Array{Int64,1}}}
│ %2 = Base.materialize(%1)::Union{BitArray{1}, Array}
└── return %2
It seems that the compiler is confused with BitArray and Array.
Gives output:
If uncomment
@inline iterate(p::T,st) where T <: AbstractType = nothing, it gives a type unstable warning:julia 1.7.0-DEV.334gives unstable warning:julia 1.5.2gives a different unstable warning:It seems that the compiler is confused with
BitArrayandArray.