Skip to content

Commit

Permalink
Fix showing method candidates for invoke-style MethodError
Browse files Browse the repository at this point in the history
Fixes the following issue:
```
julia> invoke(sin, Tuple{NoMethodsDefinedHere}, NoMethodsDefinedHere())
ERROR: ┌ Error: Error showing method candidates, aborted
│   exception =
│    MethodError: no method matching length(::Type{Tuple{NoMethodsDefinedHere}})
│    Closest candidates are:
│      length(::Core.SimpleVector) at essentials.jl:582
│      length(::Base.MethodList) at reflection.jl:732
│      length(::Core.MethodTable) at reflection.jl:806
│      ...
│    Stacktrace:
│     [1] show_method_candidates(::IOContext{Base.GenericIOBuffer{Array{UInt8,1}}}, ::MethodError, ::Any) at ./errorshow.jl:387
│     [2] showerror(::IOContext{Base.GenericIOBuffer{Array{UInt8,1}}}, ::MethodError) at ./errorshow.jl:255
│     [3] (::getfield(Base, Symbol("##613#614")){MethodError})(::IOContext{Base.GenericIOBuffer{Array{UInt8,1}}}) at ./errorshow.jl:76
│     [4] #with_output_color#660(::Bool, ::Function, ::Function, ::Symbol, ::IOContext{REPL.Terminals.TTYTerminal}) at ./util.jl:366
│     [5] with_output_color(::Function, ::Symbol, ::IOContext{REPL.Terminals.TTYTerminal}) at ./util.jl:364
│     [6] #showerror#612(::Bool, ::Function, ::IOContext{REPL.Terminals.TTYTerminal}, ::MethodError, ::Array{Union{Ptr{Nothing}, InterpreterIP},1}) at ./errorshow.jl:75
│     [7] showerror at ./errorshow.jl:74 [inlined]
│     [8] display_error(::IOContext{REPL.Terminals.TTYTerminal}, ::MethodError, ::Array{Union{Ptr{Nothing}, InterpreterIP},1}) at ./client.jl:99
│     [9] #invokelatest#1 at ./essentials.jl:697 [inlined]
│     [10] invokelatest at ./essentials.jl:696 [inlined]
│     [11] print_response(::IO, ::Any, ::Any, ::Bool, ::Bool, ::Any) at /home/keno/julia-1.0/usr/share/julia/stdlib/v1.1/REPL/src/REPL.jl:149
│     [12] print_response(::REPL.AbstractREPL, ::Any, ::Any, ::Bool, ::Bool) at /home/keno/julia-1.0/usr/share/julia/stdlib/v1.1/REPL/src/REPL.jl:140
│     [13] (::getfield(REPL, Symbol("#do_respond#38")){Bool,getfield(REPL, Symbol("##48#57")){REPL.LineEditREPL,REPL.REPLHistoryProvider},REPL.LineEditREPL,REPL.LineEdit.Prompt})(::Any, ::Any, ::Any) at /home/keno/julia-1.0/usr/share/julia/stdlib/v1.1/REPL/src/REPL.jl:714
│     [14] #invokelatest#1 at ./essentials.jl:697 [inlined]
│     [15] invokelatest at ./essentials.jl:696 [inlined]
│     [16] run_interface(::REPL.Terminals.TextTerminal, ::REPL.LineEdit.ModalInterface, ::REPL.LineEdit.MIState) at /home/keno/julia-1.0/usr/share/julia/stdlib/v1.1/REPL/src/LineEdit.jl:2268
│     [17] run_frontend(::REPL.LineEditREPL, ::REPL.REPLBackendRef) at /home/keno/julia-1.0/usr/share/julia/stdlib/v1.1/REPL/src/REPL.jl:1035
│     [18] run_repl(::REPL.AbstractREPL, ::Any) at /home/keno/julia-1.0/usr/share/julia/stdlib/v1.1/REPL/src/REPL.jl:192
│     [19] (::getfield(Base, Symbol("##723#725")){Bool,Bool,Bool,Bool})(::Module) at ./logging.jl:311
│     [20] #invokelatest#1 at ./essentials.jl:697 [inlined]
│     [21] invokelatest at ./essentials.jl:696 [inlined]
│     [22] macro expansion at ./logging.jl:308 [inlined]
│     [23] run_main_repl(::Bool, ::Bool, ::Bool, ::Bool, ::Bool) at ./client.jl:330
│     [24] exec_options(::Base.JLOptions) at ./client.jl:242
│     [25] _start() at ./client.jl:421
└ @ Base errorshow.jl:257
MethodError: no method matching sin(::NoMethodsDefinedHere)
Stacktrace:
 [1] top-level scope at none:0
```
  • Loading branch information
Keno committed Jan 28, 2019
1 parent 77739c8 commit bde465a
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 1 deletion.
2 changes: 1 addition & 1 deletion base/errorshow.jl
Original file line number Diff line number Diff line change
Expand Up @@ -398,7 +398,7 @@ function show_method_candidates(io::IO, ex::MethodError, @nospecialize kwargs=()
end
end

if right_matches > 0 || length(ex.args) < 2
if right_matches > 0 || length(arg_types_param) < 2
if length(t_i) < length(sig)
# If the methods args is longer than input then the method
# arguments is printed as not a match
Expand Down
7 changes: 7 additions & 0 deletions test/errorshow.jl
Original file line number Diff line number Diff line change
Expand Up @@ -547,3 +547,10 @@ end
# issue #30633
@test_throws ArgumentError("invalid index: \"foo\" of type String") [1]["foo"]
@test_throws ArgumentError("invalid index: nothing of type Nothing") [1][nothing]

# test showing MethodError with type argument
struct NoMethodsDefinedHere; end
let buf = IOBuffer()
Base.show_method_candidates(buf, Base.MethodError(sin, Tuple{NoMethodsDefinedHere}))
@test length(take!(buf)) !== 0
end

0 comments on commit bde465a

Please sign in to comment.