Closed
Description
I'm migrating code from v0.6 to v1.0/v1.1 , and I found this issue that breaks Julia.
abstract type AbstractNode end
struct Node{N1<:AbstractNode, N2<:AbstractNode} <: AbstractNode
a::N1
b::N2
end
struct Leaf <: AbstractNode
end
function gen_nodes(qty::Integer) :: AbstractNode
@assert qty > 0
result = Leaf()
for i in 1:qty
result = Node(result, Leaf())
end
return result
end
Running on Julia v1.0 or v1.1, it runs ok for 10 nested elements, but it never finishes if I try to nest about 50 elements. In the example below, I had to use CTRL+C
to cancel.
julia> include("issue.jl")
gen_nodes (generic function with 1 method)
julia> gen_nodes(10)
Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Leaf,Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf}(Node{Node{Node{Node{Node{Node{Node{Node{Node{Leaf,Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf}(Node{Node{Node{Node{Node{Node{Node{Node{Leaf,Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf}(Node{Node{Node{Node{Node{Node{Node{Leaf,Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf}(Node{Node{Node{Node{Node{Node{Leaf,Leaf},Leaf},Leaf},Leaf},Leaf},Leaf}(Node{Node{Node{Node{Node{Leaf,Leaf},Leaf},Leaf},Leaf},Leaf}(Node{Node{Node{Node{Leaf,Leaf},Leaf},Leaf},Leaf}(Node{Node{Node{Leaf,Leaf},Leaf},Leaf}(Node{Node{Leaf,Leaf},Leaf}(Node{Leaf,Leaf}(Leaf(), Leaf()), Leaf()), Leaf()), Leaf()), Leaf()), Leaf()), Leaf()), Leaf()), Leaf()), Leaf())
julia> gen_nodes(50) ^C^C^C^C^C^C^C^C^CWARNING: Force throwing a SIGINT
Internal error: encountered unexpected error in runtime: InterruptException() is_derived_type at ./compiler/typelimits.jl:32 is_derived_type at ./compiler/typelimits.jl:57
is_derived_type at ./compiler/typelimits.jl:68
is_derived_type at ./compiler/typelimits.jl:57
is_derived_type at ./compiler/typelimits.jl:57
...
is_derived_type_from_any at ./compiler/typelimits.jl:77
type_more_complex at ./compiler/typelimits.jl:199 limit_type_size at ./compiler/typelimits.jl:20 jfptr_limit_type_size_5660.clone_1 at /home/felipenoris/local/julia-1.1.0/lib/julia/sys.so (unknown line) jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2219
abstract_call_method at ./compiler/abstractinterpretation.jl:300
abstract_call_gf_by_type at ./compiler/abstractinterpretation.jl:85
The same code runs without issues on Julia v0.6, even if I increase to 1000 nested elements.
julia> include("issue.jl")
gen_nodes (generic function with 1 method)
julia> gen_nodes(50)
Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Leaf,Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf}(Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Leaf,Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf}(Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Leaf,Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf}(Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Node{Leaf,Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf},Leaf}
...
I would say that this is a major issue for any code that deals with trees or similar data structures.
Activity