Skip to content

Commit 1c6a89d

Browse files
committed
fix #57749, model ccall binding access in inference
1 parent 056e68b commit 1c6a89d

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

Compiler/src/abstractinterpretation.jl

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3485,7 +3485,39 @@ function refine_partial_type(@nospecialize t)
34853485
return t
34863486
end
34873487

3488+
function abstract_eval_nonlinearized_foreigncall_name(interp::AbstractInterpreter, e, sstate::StatementState, sv::AbsIntState)
3489+
if isexpr(e, :call)
3490+
n = length(e.args)
3491+
argtypes = Vector{Any}(undef, n)
3492+
for i = 1:n
3493+
argtypes[i] = abstract_eval_nonlinearized_foreigncall_name(interp, e.args[i], sstate, sv)
3494+
end
3495+
result = abstract_call(interp, ArgInfo(e.args, argtypes), sstate, sv)
3496+
else
3497+
result = abstract_eval_basic_statement(interp, e, sstate, sv)
3498+
end
3499+
if result isa Future
3500+
if !isready(result)
3501+
result
3502+
else
3503+
result[].rt
3504+
end
3505+
else
3506+
result.rt
3507+
end
3508+
end
3509+
34883510
function abstract_eval_foreigncall(interp::AbstractInterpreter, e::Expr, sstate::StatementState, sv::AbsIntState)
3511+
callee = e.args[1]
3512+
if isexpr(callee, :call) && length(callee.args) > 1 && callee.args[1] == GlobalRef(Core, :tuple)
3513+
# NOTE these expressions are not properly linearized
3514+
abstract_eval_nonlinearized_foreigncall_name(interp, callee.args[2], sstate, sv)
3515+
if length(callee.args) > 2
3516+
abstract_eval_nonlinearized_foreigncall_name(interp, callee.args[3], sstate, sv)
3517+
end
3518+
else
3519+
abstract_eval_value(interp, callee, sstate, sv)
3520+
end
34893521
mi = frame_instance(sv)
34903522
t = sp_type_rewrap(e.args[2], mi, true)
34913523
for i = 3:length(e.args)

test/ccall.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1979,3 +1979,11 @@ let llvm = sprint(code_llvm, gc_safe_ccall, ())
19791979
# check for the gc_safe store
19801980
@test occursin("store atomic i8 2", llvm)
19811981
end
1982+
1983+
module Test57749
1984+
using Test, Zstd_jll
1985+
const prefix = "Zstd version: "
1986+
const sym = :ZSTD_versionString
1987+
get_zstd_version() = prefix * unsafe_string(ccall((sym, libzstd), Cstring, ()))
1988+
@test startswith(get_zstd_version(), "Zstd")
1989+
end

0 commit comments

Comments
 (0)