JuliaLang / julia

The Julia Programming Language
https://julialang.org/
MIT License
45.53k stars 5.46k forks source link

Unwrapped Union Alls can't be added more than two times to a vector with [] syntax. Reproducible crash when using these vectors. #54418

Open camilodlt opened 4 months ago

camilodlt commented 4 months ago

Version Info

julia> versioninfo()
Julia Version 1.10.3
Commit 0b4590a5507 (2024-04-30 10:59 UTC)
Build Info:
  Official https://julialang.org/ release
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 12 × Intel(R) Core(TM) i7-10850H CPU @ 2.70GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-15.0.7 (ORCJIT, skylake)
Threads: 1 default, 0 interactive, 1 GC (on 12 virtual cores)

Installation

(base) ➜  ~ juliaup add 1.10~x64
'1.10~x64' is already installed.

MWE

If we define and unwrap an UnionAll datatype and then try to add it multiple times to a vector with the syntax [item, item, ...] it doesn't work. It is, at most, added two times to a vector.

julia> a = Base.unwrap_unionall(AbstractMatrix{<:Tuple})
AbstractArray{var"#s1"<:Tuple, 2}

julia> length([a]) # ok
1

julia> length([a,a]) # ok 
2

julia> length([a,a,a]) # not ok 
2

julia> length([a,a,a,a]) # not ok
2

Using push! works :

julia> v = []
Any[]

julia> push!(v, a,a,a,a,a)
5-element Vector{Any}:
 AbstractArray{var"#s1"<:Tuple, 2}
 AbstractArray{var"#s1"<:Tuple, 2}
 AbstractArray{var"#s1"<:Tuple, 2}
 AbstractArray{var"#s1"<:Tuple, 2}
 AbstractArray{var"#s1"<:Tuple, 2}

Collecting a tuple with the items also works :

julia> collect((a, a, a))
3-element Vector{DataType}:
 AbstractArray{var"#s1"<:Tuple, 2}
 AbstractArray{var"#s1"<:Tuple, 2}
 AbstractArray{var"#s1"<:Tuple, 2}

So it seems to be a problem with the syntax [].

Furthermore, I can make Julia crash and segfault if I try to add the vectors created by [] to a struct like this:

julia> struct st
               v1::Vector{<:T} where {T<:Union{UnionAll,DataType}}
               v2::Vector{<:T} where {T<:Union{UnionAll,DataType}}
       end

julia> st([a,a,a], [a])

[53548] signal (11.1): Segmentation fault
in expression starting at REPL[10]:1
sig_match_simple at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/typemap.c:212 [inlined]
jl_typemap_entry_assoc_exact at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/typemap.c:1155
jl_typemap_assoc_exact at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/julia_internal.h:1435 [inlined]
jl_lookup_generic_ at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/gf.c:3017 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/gf.c:3073
vect at ./array.jl:165
_jl_invoke at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
do_call at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/interpreter.c:126
eval_value at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/interpreter.c:223
eval_stmt_value at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/interpreter.c:174 [inlined]
eval_body at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/interpreter.c:617
jl_interpret_toplevel_thunk at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/interpreter.c:775
jl_toplevel_eval_flex at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/toplevel.c:934
jl_toplevel_eval_flex at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/toplevel.c:877
ijl_toplevel_eval_in at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/toplevel.c:985
eval at ./boot.jl:385 [inlined]
eval_user_input at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:150
repl_backend_loop at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:246
#start_repl_backend#46 at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:231
start_repl_backend at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:228
_jl_invoke at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/gf.c:3077
#run_repl#59 at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:389
run_repl at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:375
jfptr_run_repl_91734.1 at /home/irit/.julia/juliaup/julia-1.10.3+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/gf.c:3077
#1013 at ./client.jl:432
jfptr_YY.1013_82700.1 at /home/irit/.julia/juliaup/julia-1.10.3+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
jl_f__call_latest at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/builtins.c:812
#invokelatest#2 at ./essentials.jl:892 [inlined]
invokelatest at ./essentials.jl:889 [inlined]
run_main_repl at ./client.jl:416
exec_options at ./client.jl:333
_start at ./client.jl:552
jfptr__start_82726.1 at /home/irit/.julia/juliaup/julia-1.10.3+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
true_main at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/jlapi.c:582
jl_repl_entrypoint at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/src/jlapi.c:731
main at /cache/build/builder-amdci4-2/julialang/julia-release-1-dot-10/cli/loader_exe.c:58
unknown function (ip: 0x710a21c29d8f)
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x4010b8)
Allocations: 1563065 (Pool: 1562180; Big: 885); GC: 2
[1]    53548 segmentation fault (core dumped)  julia

We discussed a little about this in slack : https://julialang.slack.com/archives/C6A044SQH/p1715192935098339

inkydragon commented 4 months ago

test code:

a = Base.unwrap_unionall(AbstractMatrix{<:Tuple})
struct st;  v1; v2;  end
st([a,a,a], [a])

Windows (x86_64-w64-mingw32)