let by_array_reference_usage e =
  let s = "[by_array_ref_usage]" in 
  debug "%s" s; 
  match delta_array e with 
    | None ->
        (match bracket_exp e with 
           | None -> 
               debug "%s not a bracket pattern" s;
               Any
           | Some (x,n) ->
               debug "%s %a[]<%d>" s !Ast_printer.d_var x n;
               if x.vformal then 
                 (debug "%s %a is a formal" s !Ast_printer.d_var x;
                  let arr = brackets_and_stars_typ x.vtype in 
                  if (arr >= n) then 
                    (debug "%s %a has dim %d ok!" s !Ast_printer.d_var x arr;
                     Ok (x,arr)) else 
                      (debug "%s %a has dim %d when need %d ko!"
                         s !Ast_printer.d_var x arr n;
                       Ko(x,arr))
                 )
               else 
                 ( debug "%s %a is not a formal" s !Ast_printer.d_var x; 
                   Any) )
    | Some (x,n) -> 
         debug "%s %a[]" s !Ast_printer.d_var x ;
               if x.vformal then Ok (x,n) else Any