Skip to content

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

Closed
@felipenoris

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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