From bde465aa5b20877c872e711ccc4154d10374a88d Mon Sep 17 00:00:00 2001 From: Keno Fischer Date: Thu, 24 Jan 2019 23:19:45 -0500 Subject: [PATCH] Fix showing method candidates for `invoke`-style MethodError MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 ``` --- base/errorshow.jl | 2 +- test/errorshow.jl | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/base/errorshow.jl b/base/errorshow.jl index d6562dbe8e7b3..fb263c98435f1 100644 --- a/base/errorshow.jl +++ b/base/errorshow.jl @@ -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 diff --git a/test/errorshow.jl b/test/errorshow.jl index c2f21d26833e8..5a85430516ffb 100644 --- a/test/errorshow.jl +++ b/test/errorshow.jl @@ -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