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)