Skip to content

Commit 850b56b

Browse files
committed
Fix showing method candidates for invoke-style MethodError
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 ```
1 parent f908e82 commit 850b56b

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

base/errorshow.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ function show_method_candidates(io::IO, ex::MethodError, @nospecialize kwargs=()
398398
end
399399
end
400400

401-
if right_matches > 0 || length(ex.args) < 2
401+
if right_matches > 0 || length(arg_types_param) < 2
402402
if length(t_i) < length(sig)
403403
# If the methods args is longer than input then the method
404404
# arguments is printed as not a match

test/errorshow.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,3 +547,10 @@ end
547547
# issue #30633
548548
@test_throws ArgumentError("invalid index: \"foo\" of type String") [1]["foo"]
549549
@test_throws ArgumentError("invalid index: nothing of type Nothing") [1][nothing]
550+
551+
# test showing MethodError with type argument
552+
struct NoMethodsDefinedHere; end
553+
let buf = IOBuffer()
554+
Base.show_method_candidates(buf, Base.MethodError(sin, Tuple{NoMethodsDefinedHere}))
555+
@test length(take!(buf)) !== 0
556+
end

0 commit comments

Comments
 (0)