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

Tuple bug (getindex has no method matching getindex(::Void, ::Int64)) #11357

Closed
yurivish opened this issue May 19, 2015 · 3 comments
Closed

Tuple bug (getindex has no method matching getindex(::Void, ::Int64)) #11357

yurivish opened this issue May 19, 2015 · 3 comments

Comments

@yurivish
Copy link
Contributor

I ran into what appears to be a bug involving the new tuple types using the latest Julia nightly (julia-0.4.0-c777d31727-osx).

There is a type, ByteRGB, which I want to change to a tuple type, so I replaced this

immutable ByteRGB
    r::UInt8
    g::UInt8
    b::UInt8
end
Base.length(c::ByteRGB) = 3
Base.getindex(c::ByteRGB, n) = c.(n)

with this:

typealias ByteRGB Tuple{UInt8, UInt8, UInt8}
ByteRGB(r, g, b) = (r::UInt8, g::UInt8, b::UInt8)

which results in this when running a program that works fine with the non-tuple definition:

ERROR: LoadError: MethodError: `getindex` has no method matching getindex(::Void, ::Int64)
 in anonymous at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_call_gf at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_apply at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_interpret at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in typeinf_uncached at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in typeinf at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib (repeats 2 times)
 in abstract_call_gf at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_interpret at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in typeinf_uncached at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in typeinf at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib (repeats 2 times)
 in abstract_call_gf at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_interpret at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in typeinf_uncached at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in typeinf at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib (repeats 2 times)
 in abstract_call_gf at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_interpret at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in typeinf_uncached at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in typeinf at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib (repeats 2 times)
 in abstract_call_gf at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in typeinf_uncached at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in typeinf at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib (repeats 2 times)
 in abstract_call_gf at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in typeinf_uncached at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in typeinf at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib (repeats 2 times)
 in abstract_call_gf at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval_call at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in abstract_eval at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in typeinf_uncached at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in typeinf at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in typeinf_ext at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in placepixels at /Users/yurivish/Dropbox/Public/Magic/code/placepixels.min.jl:113
 in generate_art at /Users/yurivish/Dropbox/Public/Magic/code/generate.jl:25
 in generate_card at /Users/yurivish/Dropbox/Public/Magic/code/generate.jl:16
 in create_variations at /Users/yurivish/Dropbox/Public/Magic/code/magic.jl:56
 in anonymous at no file:83
 in include at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in include_from_node1 at loading.jl:134
 in process_options at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
 in _start at /Applications/Julia-0.4.0-dev.app/Contents/Resources/julia/lib/julia/sys.dylib
while loading /Users/yurivish/Dropbox/Public/Magic/code/magic.jl, in expression starting on line 60

Line 113 in placepixels.min.jl is candidate = nearest(canvas.frontier, color) where color is of type ByteRGB and the function nearest is defined inside a package I wrote.

The full program is somewhat extensive and I haven't been able to successfully make a reduced test case. If the bug is not diagnosable from the information I've given here, then I can try to get a better stack trace. What's the best way to do so?

@yurivish yurivish changed the title Tuple bug? (getindex has no method matching getindex(::Void, ::Int64)) Tuple bug (getindex has no method matching getindex(::Void, ::Int64)) May 19, 2015
@ihnorton
Copy link
Member

See also #11278

I can try to get a better stack trace. What's the best way to do so?

This is kind of tricky because it is dying inside type inference. If you don't mind using gdb, you could run julia-debug under gdb and set a breakpoint at jl_error. This will be triggered when the MethodError is thrown. Then walk up the stack to the call to jl_apply immediately preceding the calls to abstract_call and abstract_call_gf. In the jl_apply frame, the args variable will contain the arguments passed to those (Julia-implemented) functions. Call jl_(args[0,1,2, etc.]) to print the arguments (see nargs). It would be useful to see several of the preceding frames to know what is leading to the failure.

Alternatively, if you can provide a minimal repro script, that would be helpful (requiring to clone/use your package is ok if you can't reduce it)

@JeffBezanson
Copy link
Sponsor Member

I think this is a reduced test case:

julia> function foo()
       x = (1,2,3)
       i = (1,)
       x[i...]
       end
foo (generic function with 1 method)

julia> foo()
ERROR: MethodError: `getindex` has no method matching getindex(::Void, ::Int64)
 in anonymous at ./inference.jl:261
 in abstract_call_gf at ./inference.jl:598
 in abstract_call at ./inference.jl:848
 in abstract_apply at ./inference.jl:777
 in abstract_call at ./inference.jl:865
 in abstract_eval_call at ./inference.jl:912

In the future, it's good to provide instructions for reproducing the bug even if it involves running a huge program and you don't have a reduced case.

@yurivish
Copy link
Contributor Author

Thanks, Jeff! I will do so in the future.

mbauman pushed a commit to mbauman/julia that referenced this issue Jun 6, 2015
tkelman pushed a commit to tkelman/julia that referenced this issue Jun 6, 2015
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

3 participants