@@ -3485,7 +3485,39 @@ function refine_partial_type(@nospecialize t)
3485
3485
return t
3486
3486
end
3487
3487
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
+
3488
3510
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
3489
3521
mi = frame_instance (sv)
3490
3522
t = sp_type_rewrap (e. args[2 ], mi, true )
3491
3523
for i = 3 : length (e. args)
0 commit comments