Skip to content

Julia 1.0/1.1 can't handle deep nested structs #31663

Closed
@felipenoris

Description

@felipenoris

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.

Metadata

Metadata

Assignees

Labels

compiler:inferenceType inferencedisplay and printingAesthetics and correctness of printed representations of objects.regressionRegression in behavior compared to a previous version

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions