let rec by_array_reference x n l =
let s = "[by_array_reference]" in
debug "%s %a of arity %d" s pp_var_type x n;
match l with
| [] ->
oracle "%s %a ByAref" s pp_var_type x;
ByAReference.replace x (n,[])
| (k,(b,Prop))::m ->
if k <= n then
(decr_addr_taken_bool x b; by_array_reference x n m)
else remove_array_reference_param x
| (k,(b,p))::m ->
if k < n || ByValue.mem p || ByPReference.mem p then
remove_array_reference_param x
else
try (match ByAReference.find p with
| (i,[]) ->
if i <= k then
(decr_addr_taken_bool x b; by_array_reference x n m)
else remove_array_reference_param x
| (i,lp) ->
if i <= k then
(by_array_reference p i lp;
by_array_reference x n ((k,(b,p))::m))
else remove_array_reference_param x
)
with Not_found ->
debug "%s %a NOT in ARef param" s pp_var_type p;
let i = brackets_and_stars_var_type_typ p in
add_array_reference_param p i;
if not (ByAReference.mem p) || ByValue.mem p
then remove_array_reference_param x
else by_array_reference x n ((k,(b,p))::m)