Skip to content

Illegal instruction error when handling Union types #32582

Closed
@felipenoris

Description

@felipenoris

I'm working on a package to serialize julia structs to BSON format, similar to BSON.jl .

I hit this when I tried to handle the case to decode Union{Nothing, T}.

I'm using Julia v1.1.1.

I set up a branch isolating the issue. You can setup the environment with:

(v1.1) pkg> activate .

(tmp) pkg> add https://github.com/felipenoris/BSONSerializer.jl.git#julia_issue

On an empty julia session, load BSONSerializer module and define a Option type.

julia> using BSONSerializer

julia> struct Option
           val::Union{Nothing, Int}
       end

The macro BSONSerializable will generate code to serialize/deserialize a struct.
To debug this case, it outputs the generated code for deserialize the Option type.

julia> @BSONSerializable(Option)
DEBUG: deserialize generated code:
begin
    #= /Users/noronha/.julia/packages/BSONSerializer/Po5Y6/src/codegen.jl:60 =#
    function deserialize(bson::Union{BSON, Dict}, ::Type{Serializable{Option}})
        #= /Users/noronha/.julia/packages/BSONSerializer/Po5Y6/src/codegen.jl:61 =#
        args = bson["args"]
        #= /Users/noronha/.julia/packages/BSONSerializer/Po5Y6/src/codegen.jl:62 =#
        (Option)((decode(args["val"], Union{Nothing, Int64}),)...)
    end
end

Calling the decode function by hand has no issues:

julia> instance = Option(1)
Option(1)

julia> bson = BSONSerializer.serialize(instance)
BSON("{ "type" : "Option", "args" : { "val" : 1 } }")

julia> BSONSerializer.decode(1, Union{Nothing, Int}) # manual call to generated code
DEBUG: called decode on union{Nothing, T}
1

Calling the same code by using the generated deserialize method will trigger a Illegal Instruction error.

julia> BSONSerializer.deserialize(bson)
DEBUG: called decode on union{Nothing, T}
Unreachable reached at 0x1133a3bf2

signal (4): Illegal instruction: 4
in expression starting at no file:0
deserialize at /Users/noronha/.julia/packages/BSONSerializer/Po5Y6/src/codegen.jl:62
deserialize at /Users/noronha/.julia/packages/BSONSerializer/Po5Y6/src/serialize.jl:14
deserialize at /Users/noronha/.julia/packages/BSONSerializer/Po5Y6/src/serialize.jl:11
jl_fptr_trampoline at /Users/julia/buildbot/worker/package_macos64/build/src/gf.c:1842
do_call at /Users/julia/buildbot/worker/package_macos64/build/src/interpreter.c:323
eval_stmt_value at /Users/julia/buildbot/worker/package_macos64/build/src/interpreter.c:362 [inlined]
eval_body at /Users/julia/buildbot/worker/package_macos64/build/src/interpreter.c:759
jl_interpret_toplevel_thunk_callback at /Users/julia/buildbot/worker/package_macos64/build/src/interpreter.c:885
unknown function (ip: 0xfffffffffffffffe)
unknown function (ip: 0x113bce85f)
unknown function (ip: 0x0)
jl_interpret_toplevel_thunk at /Users/julia/buildbot/worker/package_macos64/build/src/interpreter.c:894
jl_toplevel_eval_flex at /Users/julia/buildbot/worker/package_macos64/build/src/toplevel.c:764
jl_toplevel_eval at /Users/julia/buildbot/worker/package_macos64/build/src/toplevel.c:773 [inlined]
jl_toplevel_eval_in at /Users/julia/buildbot/worker/package_macos64/build/src/toplevel.c:793
eval at ./boot.jl:328
eval_user_input at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.1/REPL/src/REPL.jl:85
macro expansion at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.1/REPL/src/REPL.jl:117 [inlined]
#26 at ./task.jl:259
jl_apply at /Users/julia/buildbot/worker/package_macos64/build/src/./julia.h:1571 [inlined]
start_task at /Users/julia/buildbot/worker/package_macos64/build/src/task.c:572
Allocations: 11429278 (Pool: 11427475; Big: 1803); GC: 24
[1]    48553 illegal hardware instruction  julia

Metadata

Metadata

Assignees

Labels

bugIndicates an unexpected problem or unintended behaviorregressionRegression in behavior compared to a previous versiontypes and dispatchTypes, subtyping and method dispatch

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions