Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Internal error: encountered unexpected error in runtime #42579

Closed
goerch opened this issue Oct 10, 2021 · 4 comments
Closed

Internal error: encountered unexpected error in runtime #42579

goerch opened this issue Oct 10, 2021 · 4 comments

Comments

@goerch
Copy link

goerch commented Oct 10, 2021

MRE:

function Base.iterate(::Nothing)
end

mutable struct TrieSet{K} <: AbstractSet{AbstractArray{K}}
    dict::Dict{K, TrieSet{K}}
    value::Bool
    function TrieSet{K}() where K
        new(Dict{K, TrieSet{K}}(), false)
    end
end

function walk(trie::TrieSet{K}, f, prefix=Vector{K}()) where K
    if trie.value
        f(prefix)
    end
    for (char, subtrie) in trie.dict
        walk(subtrie, f, vcat(prefix, char))
    end
end

function Base.push!(trie::TrieSet{K}, key) where K
    for char in key
        if trie.dict == nothing
            trie.dict = Dict{K, TrieSet{K}}(char => TrieSet{K}())
        elseif !haskey(trie.dict, char)
            trie.dict[char] = TrieSet{K}()
        end
        trie = trie.dict[char]
    end
    trie.value = true
end

function getsubtrie(trie::TrieSet{K}, key) where K
    prefix = Vector{K}()
    for char in key
        if trie.dict == nothing || !haskey(trie.dict, char)
            return nothing
        end
        push!(prefix, char)
        trie = trie.dict[char]
    end
    return trie, prefix
end

struct PrefixTrieSet{K} <: AbstractSet{AbstractArray{K}}
    subtrie::TrieSet{K}
    prefix::Vector{K}
    function PrefixTrieSet{K}(trie, prefix) where K
        new(getsubtrie(trie, prefix)...)
    end
end

function keys(trie::PrefixTrieSet{K}) where K
    result = Vector{Vector{K}}()
    walk(trie.subtrie, x -> push!(result, x), trie.prefix)
    return result
end

set = TrieSet{Char}()
push!(set, "a")
keys(PrefixTrieSet{Char}(set, "a"))

Trace back running the program on 1.6.3:

Internal error: encountered unexpected error in runtime:
BoundsError(a=svec(), i=0)
getindex at .\essentials.jl:589 [inlined]
unswitchtupleunion at .\compiler\typeutils.jl:219
getfield_elim_pass! at .\compiler/ssair\passes.jl:624
run_passes at .\compiler/ssair\driver.jl:133
optimize at .\compiler\optimize.jl:272 [inlined]
_typeinf at .\compiler\typeinfer.jl:244
typeinf at .\compiler\typeinfer.jl:209
typeinf_ext at .\compiler\typeinfer.jl:892
typeinf_ext_toplevel at .\compiler\typeinfer.jl:925
typeinf_ext_toplevel at .\compiler\typeinfer.jl:921
jfptr_typeinf_ext_toplevel_14355.clone_1 at C:\Users\Win10\AppData\Local\Programs\Julia-1.6.3\lib\julia\sys.dll (unknown line)
_jl_invoke at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2237 [inlined]
jl_apply_generic at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2419 [inlined]
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1703 [inlined]
jl_type_infer at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:298
jl_generate_fptr at /cygdrive/c/buildbot/worker/package_win64/build/src\jitlayers.cpp:340
jl_compile_method_internal at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:1970
jl_compile_method_internal at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:1924 [inlined]
_jl_invoke at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2229 [inlined]
jl_apply_generic at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2419
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1703 [inlined]
do_call at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:115
eval_value at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:204
eval_stmt_value at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:155 [inlined]
eval_body at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:576
jl_interpret_toplevel_thunk at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:670
top-level scope at C:\Users\Win10\source\repos\julia\reduce internal runtime error\src\problem.jl:61
jl_toplevel_eval_flex at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:877
jl_toplevel_eval_flex at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:825
jl_toplevel_eval at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:886 [inlined]
jl_toplevel_eval_in at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:929
eval at .\boot.jl:360 [inlined]
include_string at .\loading.jl:1116
_include at .\loading.jl:1170
include at .\client.jl:444
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1703 [inlined]
do_call at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:115
eval_value at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:204
eval_stmt_value at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:155 [inlined]
eval_body at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:576
jl_interpret_toplevel_thunk at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:670
top-level scope at none:1
jl_toplevel_eval_flex at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:877
jl_toplevel_eval at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:886 [inlined]
jl_toplevel_eval_in at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:929
eval at .\boot.jl:360 [inlined]
repleval at C:\Users\Win10\.julia\packages\Atom\bfwsW\src\repl.jl:198
#242 at C:\Users\Win10\.julia\packages\Atom\bfwsW\src\repl.jl:228
unknown function (ip: 000000005b418dd3)
with_logstate at .\logging.jl:491
with_logger at .\logging.jl:603 [inlined]
evalrepl at C:\Users\Win10\.julia\packages\Atom\bfwsW\src\repl.jl:216
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1703 [inlined]
do_call at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:115
eval_value at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:204
eval_stmt_value at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:155 [inlined]
eval_body at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:576
jl_interpret_toplevel_thunk at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:670
top-level scope at C:\Users\Win10\.julia\packages\Atom\bfwsW\src\repl.jl:264
jl_toplevel_eval_flex at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:877
jl_toplevel_eval at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:886 [inlined]
jl_toplevel_eval_in at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:929
eval at .\boot.jl:360 [inlined]
eval_user_input at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:139
repl_backend_loop at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:200
start_repl_backend at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:185
#run_repl#42 at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:317
run_repl at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:305
#874 at .\client.jl:387
jfptr_YY.874_32319.clone_1 at C:\Users\Win10\AppData\Local\Programs\Julia-1.6.3\lib\julia\sys.dll (unknown line)
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1703 [inlined]
jl_f__call_latest at /cygdrive/c/buildbot/worker/package_win64/build/src\builtins.c:714
#invokelatest#2 at .\essentials.jl:708 [inlined]
invokelatest at .\essentials.jl:706 [inlined]
run_main_repl at .\client.jl:372
exec_options at .\client.jl:302
_start at .\client.jl:485
jfptr__start_22917.clone_1 at C:\Users\Win10\AppData\Local\Programs\Julia-1.6.3\lib\julia\sys.dll (unknown line)
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1703 [inlined]
true_main at /cygdrive/c/buildbot/worker/package_win64/build/src\jlapi.c:560
repl_entrypoint at /cygdrive/c/buildbot/worker/package_win64/build/src\jlapi.c:702
mainCRTStartup at /cygdrive/c/buildbot/worker/package_win64/build/cli\loader_exe.c:51
BaseThreadInitThunk at C:\Windows\System32\KERNEL32.DLL (unknown line)
RtlUserThreadStart at C:\Windows\SYSTEM32\ntdll.dll (unknown line)

Further observations: the program doesn't crash after the trace back. The trace back vanishes, if I remove Base.iterate(::Nothing).

@Seelengrab
Copy link
Contributor

I can't reproduce this on

julia> versioninfo()
Julia Version 1.8.0-DEV.631
Commit 5a98032fa8 (2021-10-01 08:05 UTC)
Platform Info:
  OS: Linux (x86_64-pc-linux-gnu)
  CPU: Intel(R) Core(TM) i7-6600U CPU @ 2.60GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-12.0.1 (ORCJIT, skylake)

though I do get a MethodError for a missing iterate(::TrieSet{Char}) method.

@inkydragon
Copy link
Member

Confirmed on julia 1.6.3

julia> versioninfo()
Julia Version 1.6.3
Commit ae8452a9e0 (2021-09-23 17:34 UTC)
Platform Info:
  OS: Windows (x86_64-w64-mingw32)
  CPU: Intel(R) Core(TM) i5-9400F CPU @ 2.90GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-11.0.1 (ORCJIT, skylake)

After the internal error, REPL does not crash.
If you continue executing keys(PrefixTrieSet{Char}(set, "a")) no error occurs.

error output
julia> function Base.iterate(::Nothing)
       end

julia> mutable struct TrieSet{K} <: AbstractSet{AbstractArray{K}}
           dict::Dict{K, TrieSet{K}}
           value::Bool
           function TrieSet{K}() where K
               new(Dict{K, TrieSet{K}}(), false)
           end
       end

julia> function walk(trie::TrieSet{K}, f, prefix=Vector{K}()) where K
           if trie.value
               f(prefix)
           end
           for (char, subtrie) in trie.dict
               walk(subtrie, f, vcat(prefix, char))
           end
       end
walk (generic function with 2 methods)

julia> function Base.push!(trie::TrieSet{K}, key) where K
           for char in key
               if trie.dict == nothing
                   trie.dict = Dict{K, TrieSet{K}}(char => TrieSet{K}())
               elseif !haskey(trie.dict, char)
                   trie.dict[char] = TrieSet{K}()
               end
               trie = trie.dict[char]
           end
           trie.value = true
       end

julia> function getsubtrie(trie::TrieSet{K}, key) where K
           prefix = Vector{K}()
           for char in key
               if trie.dict == nothing || !haskey(trie.dict, char)
                   return nothing
               end
               push!(prefix, char)
               trie = trie.dict[char]
           end
           return trie, prefix
       end
getsubtrie (generic function with 1 method)

julia> struct PrefixTrieSet{K} <: AbstractSet{AbstractArray{K}}
           subtrie::TrieSet{K}
           prefix::Vector{K}
           function PrefixTrieSet{K}(trie, prefix) where K
               new(getsubtrie(trie, prefix)...)
           end
       end

julia> function keys(trie::PrefixTrieSet{K}) where K
           result = Vector{Vector{K}}()
           walk(trie.subtrie, x -> push!(result, x), trie.prefix)
           return result
       end
keys (generic function with 1 method)

julia>

julia> set = TrieSet{Char}()
Error showing value of type TrieSet{Char}:
ERROR: MethodError: no method matching iterate(::TrieSet{Char})
Closest candidates are:
  iterate(::Union{LinRange, StepRangeLen}) at range.jl:664
  iterate(::Union{LinRange, StepRangeLen}, ::Int64) at range.jl:664
  iterate(::T) where T<:Union{Base.KeySet{var"#s77", var"#s76"} where {var"#s77", var"#s76"<:Dict}, Base.ValueIterator{var"#s75"} where var"#s75"<:Dict} at dict.jl:693
  ...
Stacktrace:
  [1] isempty(itr::TrieSet{Char})
    @ Base .\essentials.jl:767
  [2] show(io::IOContext{Base.TTY}, #unused#::MIME{Symbol("text/plain")}, t::TrieSet{Char})
    @ Base .\show.jl:153
  [3] (::REPL.var"#38#39"{REPL.REPLDisplay{REPL.LineEditREPL}, MIME{Symbol("text/plain")}, Base.RefValue{Any}})(io::Any)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:220
  [4] with_repl_linfo(f::Any, repl::REPL.LineEditREPL)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:462
  [5] display(d::REPL.REPLDisplay, mime::MIME{Symbol("text/plain")}, x::Any)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:213
  [6] display(d::REPL.REPLDisplay, x::Any)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:225
  [7] display(x::Any)
    @ Base.Multimedia .\multimedia.jl:328
  [8] #invokelatest#2
    @ .\essentials.jl:708 [inlined]
  [9] invokelatest
    @ .\essentials.jl:706 [inlined]
 [10] print_response(errio::IO, response::Any, show_value::Bool, have_color::Bool, specialdisplay::Union{Nothing, AbstractDisplay})
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:247
 [11] (::REPL.var"#40#41"{REPL.LineEditREPL, Pair{Any, Bool}, Bool, Bool})(io::Any)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:231
 [12] with_repl_linfo(f::Any, repl::REPL.LineEditREPL)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:462
 [13] print_response(repl::REPL.AbstractREPL, response::Any, show_value::Bool, have_color::Bool)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:229
 [14] (::REPL.var"#do_respond#61"{Bool, Bool, REPL.var"#72#82"{REPL.LineEditREPL, REPL.REPLHistoryProvider}, REPL.LineEditREPL, REPL.LineEdit.Prompt})(s::REPL.LineEdit.MIState, buf::Any, ok::Bool)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:798
 [15] #invokelatest#2
    @ .\essentials.jl:708 [inlined]
 [16] invokelatest
    @ .\essentials.jl:706 [inlined]
 [17] run_interface(terminal::REPL.Terminals.TextTerminal, m::REPL.LineEdit.ModalInterface, s::REPL.LineEdit.MIState)
    @ REPL.LineEdit C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\LineEdit.jl:2441
 [18] run_frontend(repl::REPL.LineEditREPL, backend::REPL.REPLBackendRef)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:1126
 [19] (::REPL.var"#44#49"{REPL.LineEditREPL, REPL.REPLBackendRef})()
    @ REPL .\task.jl:411

julia> push!(set, "a")
true

julia> keys(PrefixTrieSet{Char}(set, "a"))
Internal error: encountered unexpected error in runtime:
BoundsError(a=svec(), i=0)
getindex at .\essentials.jl:589 [inlined]
unswitchtupleunion at .\compiler\typeutils.jl:219
getfield_elim_pass! at .\compiler/ssair\passes.jl:624
run_passes at .\compiler/ssair\driver.jl:133
optimize at .\compiler\optimize.jl:272 [inlined]
_typeinf at .\compiler\typeinfer.jl:244
typeinf at .\compiler\typeinfer.jl:209
typeinf_ext at .\compiler\typeinfer.jl:892
typeinf_ext_toplevel at .\compiler\typeinfer.jl:925
typeinf_ext_toplevel at .\compiler\typeinfer.jl:921
jfptr_typeinf_ext_toplevel_14355.clone_1 at C:\Users\woclass\AppData\Local\Programs\Julia-1.6.3\lib\julia\sys.dll (unknown line)
_jl_invoke at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2237 [inlined]
jl_apply_generic at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2419 [inlined]
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1703 [inlined]
jl_type_infer at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:298
jl_generate_fptr at /cygdrive/c/buildbot/worker/package_win64/build/src\jitlayers.cpp:340
jl_compile_method_internal at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:1970
jl_compile_method_internal at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:1924 [inlined]
_jl_invoke at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2229 [inlined]
jl_apply_generic at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2419
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1703 [inlined]
do_call at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:115
eval_value at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:204
eval_stmt_value at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:155 [inlined]
eval_body at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:576
jl_interpret_toplevel_thunk at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:670
top-level scope at REPL[10]:1
jl_toplevel_eval_flex at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:877
jl_toplevel_eval_flex at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:825
jl_toplevel_eval at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:886 [inlined]
jl_toplevel_eval_in at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:929
eval at .\boot.jl:360 [inlined]
eval_user_input at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:139
repl_backend_loop at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:200
start_repl_backend at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:185
#run_repl#42 at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:317
run_repl at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:305
#874 at .\client.jl:387
jfptr_YY.874_32319.clone_1 at C:\Users\woclass\AppData\Local\Programs\Julia-1.6.3\lib\julia\sys.dll (unknown line)
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1703 [inlined]
jl_f__call_latest at /cygdrive/c/buildbot/worker/package_win64/build/src\builtins.c:714
#invokelatest#2 at .\essentials.jl:708 [inlined]
invokelatest at .\essentials.jl:706 [inlined]
run_main_repl at .\client.jl:372
exec_options at .\client.jl:302
_start at .\client.jl:485
jfptr__start_22917.clone_1 at C:\Users\woclass\AppData\Local\Programs\Julia-1.6.3\lib\julia\sys.dll (unknown line)
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1703 [inlined]
true_main at /cygdrive/c/buildbot/worker/package_win64/build/src\jlapi.c:560
repl_entrypoint at /cygdrive/c/buildbot/worker/package_win64/build/src\jlapi.c:702
mainCRTStartup at /cygdrive/c/buildbot/worker/package_win64/build/cli\loader_exe.c:51
BaseThreadInitThunk at C:\WINDOWS\System32\KERNEL32.DLL (unknown line)
RtlUserThreadStart at C:\WINDOWS\SYSTEM32\ntdll.dll (unknown line)
1-element Vector{Vector{Char}}:
 ['a']

julia>


julia> set2 = TrieSet{Char}()
Error showing value of type TrieSet{Char}:
ERROR: MethodError: no method matching iterate(::TrieSet{Char})
Closest candidates are:
  iterate(::Union{LinRange, StepRangeLen}) at range.jl:664
  iterate(::Union{LinRange, StepRangeLen}, ::Int64) at range.jl:664
  iterate(::T) where T<:Union{Base.KeySet{var"#s77", var"#s76"} where {var"#s77", var"#s76"<:Dict}, Base.ValueIterator{var"#s75"} where var"#s75"<:Dict} at dict.jl:693
  ...
Stacktrace:
  [1] isempty(itr::TrieSet{Char})
    @ Base .\essentials.jl:767
  [2] show(io::IOContext{Base.TTY}, #unused#::MIME{Symbol("text/plain")}, t::TrieSet{Char})
    @ Base .\show.jl:153
  [3] (::REPL.var"#38#39"{REPL.REPLDisplay{REPL.LineEditREPL}, MIME{Symbol("text/plain")}, Base.RefValue{Any}})(io::Any)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:220
  [4] with_repl_linfo(f::Any, repl::REPL.LineEditREPL)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:462
  [5] display(d::REPL.REPLDisplay, mime::MIME{Symbol("text/plain")}, x::Any)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:213
  [6] display(d::REPL.REPLDisplay, x::Any)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:225
  [7] display(x::Any)
    @ Base.Multimedia .\multimedia.jl:328
  [8] #invokelatest#2
    @ .\essentials.jl:708 [inlined]
  [9] invokelatest
    @ .\essentials.jl:706 [inlined]
 [10] print_response(errio::IO, response::Any, show_value::Bool, have_color::Bool, specialdisplay::Union{Nothing, AbstractDisplay})
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:247
 [11] (::REPL.var"#40#41"{REPL.LineEditREPL, Pair{Any, Bool}, Bool, Bool})(io::Any)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:231
 [12] with_repl_linfo(f::Any, repl::REPL.LineEditREPL)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:462
 [13] print_response(repl::REPL.AbstractREPL, response::Any, show_value::Bool, have_color::Bool)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:229
 [14] (::REPL.var"#do_respond#61"{Bool, Bool, REPL.var"#72#82"{REPL.LineEditREPL, REPL.REPLHistoryProvider}, REPL.LineEditREPL, REPL.LineEdit.Prompt})(s::REPL.LineEdit.MIState, buf::Any, ok::Bool)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:798
 [15] #invokelatest#2
    @ .\essentials.jl:708 [inlined]
 [16] invokelatest
    @ .\essentials.jl:706 [inlined]
 [17] run_interface(terminal::REPL.Terminals.TextTerminal, m::REPL.LineEdit.ModalInterface, s::REPL.LineEdit.MIState)
    @ REPL.LineEdit C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\LineEdit.jl:2441
 [18] run_frontend(repl::REPL.LineEditREPL, backend::REPL.REPLBackendRef)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:1126
 [19] (::REPL.var"#44#49"{REPL.LineEditREPL, REPL.REPLBackendRef})()
    @ REPL .\task.jl:411

julia> push!(set2, "a")
true

julia> keys(PrefixTrieSet{Char}(set2, "a"))
1-element Vector{Vector{Char}}:
 ['a']

julia> set === set2
false


julia> set
Error showing value of type TrieSet{Char}:
ERROR: MethodError: no method matching iterate(::TrieSet{Char})
Closest candidates are:
  iterate(::Union{LinRange, StepRangeLen}) at range.jl:664
  iterate(::Union{LinRange, StepRangeLen}, ::Int64) at range.jl:664
  iterate(::T) where T<:Union{Base.KeySet{var"#s77", var"#s76"} where {var"#s77", var"#s76"<:Dict}, Base.ValueIterator{var"#s75"} where var"#s75"<:Dict} at dict.jl:693
  ...
Stacktrace:
  [1] isempty(itr::TrieSet{Char})
    @ Base .\essentials.jl:767
  [2] show(io::IOContext{Base.TTY}, #unused#::MIME{Symbol("text/plain")}, t::TrieSet{Char})
    @ Base .\show.jl:153
  [3] (::REPL.var"#38#39"{REPL.REPLDisplay{REPL.LineEditREPL}, MIME{Symbol("text/plain")}, Base.RefValue{Any}})(io::Any)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:220
  [4] with_repl_linfo(f::Any, repl::REPL.LineEditREPL)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:462
  [5] display(d::REPL.REPLDisplay, mime::MIME{Symbol("text/plain")}, x::Any)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:213
  [6] display(d::REPL.REPLDisplay, x::Any)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:225
  [7] display(x::Any)
    @ Base.Multimedia .\multimedia.jl:328
  [8] #invokelatest#2
    @ .\essentials.jl:708 [inlined]
  [9] invokelatest
    @ .\essentials.jl:706 [inlined]
 [10] print_response(errio::IO, response::Any, show_value::Bool, have_color::Bool, specialdisplay::Union{Nothing, AbstractDisplay})
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:247
 [11] (::REPL.var"#40#41"{REPL.LineEditREPL, Pair{Any, Bool}, Bool, Bool})(io::Any)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:231
 [12] with_repl_linfo(f::Any, repl::REPL.LineEditREPL)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:462
 [13] print_response(repl::REPL.AbstractREPL, response::Any, show_value::Bool, have_color::Bool)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:229
 [14] (::REPL.var"#do_respond#61"{Bool, Bool, REPL.var"#72#82"{REPL.LineEditREPL, REPL.REPLHistoryProvider}, REPL.LineEditREPL, REPL.LineEdit.Prompt})(s::REPL.LineEdit.MIState, buf::Any, ok::Bool)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:798
 [15] #invokelatest#2
    @ .\essentials.jl:708 [inlined]
 [16] invokelatest
    @ .\essentials.jl:706 [inlined]
 [17] run_interface(terminal::REPL.Terminals.TextTerminal, m::REPL.LineEdit.ModalInterface, s::REPL.LineEdit.MIState)
    @ REPL.LineEdit C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\LineEdit.jl:2441
 [18] run_frontend(repl::REPL.LineEditREPL, backend::REPL.REPLBackendRef)
    @ REPL C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:1126
 [19] (::REPL.var"#44#49"{REPL.LineEditREPL, REPL.REPLBackendRef})()
    @ REPL .\task.jl:411

julia> keys(PrefixTrieSet{Char}(set, "a"))
1-element Vector{Vector{Char}}:
 ['a']

@inkydragon
Copy link
Member

inkydragon commented Oct 10, 2021

Simplified test code:

function Base.iterate(::Nothing) end

function retnothing()
    always_true = isempty(Dict())
    if always_true
        return  # Always returns nothing 
    end
    return nothing, nothing
end

struct Foo
    f::Any
    _  # unused
    Foo() = new(retnothing()...)
end

Foo()

Only throw error on Julia 1.6.3, 1.7.0 works fine.

looong output
julia> function Base.iterate(::Nothing) end

julia> function retnothing()
           always_true = isempty(Dict())
           if always_true
               return  # Always returns nothing
           end
           return nothing, nothing
       end
retnothing (generic function with 1 method)


julia> @code_warntype retnothing()
Variables
  #self#::Core.Const(retnothing)
  always_true::Bool

Body::Union{Nothing, Tuple{Nothing, Nothing}}
1%1 = Main.Dict()::Dict{Any, Any}
│        (always_true = Main.isempty(%1))
└──      goto #3 if not always_true
2return nothing
3%5 = Core.tuple(Main.nothing, Main.nothing)::Core.Const((nothing, nothing))
└──      return %5

julia> @code_typed retnothing()
CodeInfo(
1%1 = invoke Dict{Any, Any}()::Dict{Any, Any}%2 = Base.getfield(%1, :count)::Int64%3 = (%2 === 0)::Bool
└──      goto #3 if not %3
2return nothing
3return (nothing, nothing)
) => Union{Nothing, Tuple{Nothing, Nothing}}

julia> @code_llvm retnothing()
;  @ REPL[2]:1 within `retnothing'
; Function Attrs: uwtable
define i8 @julia_retnothing_389() #0 {
top:
;  @ REPL[2]:2 within `retnothing'
; ┌ @ dict.jl:118 within `Dict'
   %0 = call nonnull {}* @j1_Dict_391({}* inttoptr (i64 1802257408 to {}*), {}** null, i32 0)
; └
; ┌ @ dict.jl:690 within `isempty'
; │┌ @ Base.jl:33 within `getproperty'
    %1 = bitcast {}* %0 to i8*
    %2 = getelementptr inbounds i8, i8* %1, i64 32
    %3 = bitcast i8* %2 to i64*
    %4 = load i64, i64* %3, align 8
; │└
; │┌ @ promotion.jl:410 within `=='
    %.not = icmp eq i64 %4, 0
; └└
;  @ REPL[2]:3 within `retnothing'
  %spec.select = select i1 %.not, i8 1, i8 2
;  @ REPL[2]:4 within `retnothing'
  ret i8 %spec.select
}


julia> struct Foo
           f::Any
           _  # unused
           Foo() = new(retnothing()...)
       end

julia> Foo()
Internal error: encountered unexpected error in runtime:
BoundsError(a=svec(), i=0)
getindex at .\essentials.jl:589 [inlined]
unswitchtupleunion at .\compiler\typeutils.jl:219
getfield_elim_pass! at .\compiler/ssair\passes.jl:624
run_passes at .\compiler/ssair\driver.jl:133
optimize at .\compiler\optimize.jl:272 [inlined]
_typeinf at .\compiler\typeinfer.jl:244
typeinf at .\compiler\typeinfer.jl:209
typeinf_ext at .\compiler\typeinfer.jl:892
typeinf_ext_toplevel at .\compiler\typeinfer.jl:925
typeinf_ext_toplevel at .\compiler\typeinfer.jl:921
jfptr_typeinf_ext_toplevel_14355.clone_1 at C:\Users\woclass\AppData\Local\Programs\Julia-1.6.3\lib\julia\sys.dll (unknown line)
_jl_invoke at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2237 [inlined]
jl_apply_generic at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2419 [inlined]
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1703 [inlined]
jl_type_infer at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:298
jl_generate_fptr at /cygdrive/c/buildbot/worker/package_win64/build/src\jitlayers.cpp:340
jl_compile_method_internal at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:1970
jl_compile_method_internal at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:1924 [inlined]
_jl_invoke at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2229 [inlined]
jl_apply_generic at /cygdrive/c/buildbot/worker/package_win64/build/src\gf.c:2419
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1703 [inlined]
do_call at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:115
eval_value at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:204
eval_stmt_value at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:155 [inlined]
eval_body at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:576
jl_interpret_toplevel_thunk at /cygdrive/c/buildbot/worker/package_win64/build/src\interpreter.c:670
top-level scope at REPL[4]:1
jl_toplevel_eval_flex at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:877
jl_toplevel_eval_flex at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:825
jl_toplevel_eval at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:886 [inlined]
jl_toplevel_eval_in at /cygdrive/c/buildbot/worker/package_win64/build/src\toplevel.c:929
eval at .\boot.jl:360 [inlined]
eval_user_input at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:139
repl_backend_loop at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:200
start_repl_backend at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:185
#run_repl#42 at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:317
run_repl at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\REPL\src\REPL.jl:305
#874 at .\client.jl:387
jfptr_YY.874_32319.clone_1 at C:\Users\woclass\AppData\Local\Programs\Julia-1.6.3\lib\julia\sys.dll (unknown line)
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1703 [inlined]
jl_f__call_latest at /cygdrive/c/buildbot/worker/package_win64/build/src\builtins.c:714
#invokelatest#2 at .\essentials.jl:708 [inlined]
invokelatest at .\essentials.jl:706 [inlined]
run_main_repl at .\client.jl:372
exec_options at .\client.jl:302
_start at .\client.jl:485
jfptr__start_22917.clone_1 at C:\Users\woclass\AppData\Local\Programs\Julia-1.6.3\lib\julia\sys.dll (unknown line)
jl_apply at /cygdrive/c/buildbot/worker/package_win64/build/src\julia.h:1703 [inlined]
true_main at /cygdrive/c/buildbot/worker/package_win64/build/src\jlapi.c:560
repl_entrypoint at /cygdrive/c/buildbot/worker/package_win64/build/src\jlapi.c:702
mainCRTStartup at /cygdrive/c/buildbot/worker/package_win64/build/cli\loader_exe.c:51
BaseThreadInitThunk at C:\WINDOWS\System32\KERNEL32.DLL (unknown line)
RtlUserThreadStart at C:\WINDOWS\SYSTEM32\ntdll.dll (unknown line)
ERROR: ArgumentError: new: too few arguments (expected 2)
Stacktrace:
 [1] Foo()
   @ Main .\REPL[3]:4
 [2] top-level scope
   @ REPL[4]:1

julia> versioninfo()
Julia Version 1.6.3
Commit ae8452a9e0 (2021-09-23 17:34 UTC)
Platform Info:
  OS: Windows (x86_64-w64-mingw32)
  CPU: Intel(R) Core(TM) i5-9400F CPU @ 2.90GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-11.0.1 (ORCJIT, skylake)

@vtjnash
Copy link
Member

vtjnash commented Oct 18, 2021

Looks like the fix for this was hidden in #39754. I'll push a cherry-pick to the backports-release-1.6 branch

vtjnash added a commit that referenced this issue Oct 18, 2021
@vtjnash vtjnash closed this as completed Oct 18, 2021
KristofferC pushed a commit that referenced this issue Nov 11, 2021
staticfloat pushed a commit that referenced this issue Dec 23, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants