diff --git a/src/ccall.cpp b/src/ccall.cpp index f67268b1a0007..ff435ff5fdf2e 100644 --- a/src/ccall.cpp +++ b/src/ccall.cpp @@ -909,6 +909,11 @@ static jl_cgval_t emit_llvmcall(jl_codectx_t &ctx, jl_value_t **args, size_t nar jl_value_t *tti = jl_svecref(tt,i); bool toboxed; Type *t = julia_type_to_llvm(ctx, tti, &toboxed); + if (t == getVoidTy(ctx.builder.getContext())) { + emit_error(ctx, "llvmcall does not support zero-sized argument types"); + JL_GC_POP(); + return jl_cgval_t(); + } argtypes.push_back(t); if (4 + i > nargs) { emit_error(ctx, "Missing arguments to llvmcall!"); @@ -927,6 +932,11 @@ static jl_cgval_t emit_llvmcall(jl_codectx_t &ctx, jl_value_t **args, size_t nar jl_value_t *rtt = rt; bool retboxed; Type *rettype = julia_type_to_llvm(ctx, rtt, &retboxed); + if (jl_is_datatype(rtt) && jl_datatype_size((jl_datatype_t*)rtt) == 0 && rettype != getVoidTy(ctx.builder.getContext())) { + emit_error(ctx, "llvmcall does not support zero-sized return types"); + JL_GC_POP(); + return jl_cgval_t(); + } // Make sure to find a unique name std::string ir_name; diff --git a/test/llvmcall.jl b/test/llvmcall.jl index 9fd0505e24319..aaa780fffbc26 100644 --- a/test/llvmcall.jl +++ b/test/llvmcall.jl @@ -218,3 +218,9 @@ s = MyStruct() @test eltype(supertype(Core.LLVMPtr{UInt8,1})) <: UInt8 @test s.kern == 0 @test reinterpret(Int, s.ptr) == 0 + +f_zero_arg(x::T) where T = Base.llvmcall("ret i8 %0", Int8, Tuple{T}, x) +@test_throws ErrorException f_zero_arg(nothing) + +f_zero_ret(x::Int8) = Base.llvmcall("ret void", Nothing, Tuple{Int8}, x) +@test_throws ErrorException f_zero_ret(Int8(1))