let by_array_reference_pattern_term t =
let s = "[by_array_reference_pattern_term]" in
match t with
| TStartOf (TVar lvar,off)
| Tat ({term_node = TStartOf (TVar lvar,off) },_)->
debug "%s %a " s!Ast_printer.d_logic_var lvar;
Ok(lvar,true,brackets_lv_typ (Cil.typeOfTermLval (TVar lvar,off)))
|TCastE(ty,{term_node = ( TStartOf (TVar lvar,off)
| Tat ({term_node = TStartOf (TVar lvar,off) },_))}) when
Cil.isPointerType ty ->
debug "%s %a " s!Ast_printer.d_logic_var lvar;
Ok (lvar,true,brackets_lv_typ(Cil.typeOfTermLval (TVar lvar,off)))
| TAddrOf (TMem t, _)
| Tat ({term_node = TAddrOf (TMem t, _) },_) ->
(match delta_ptr_term t.term_node with
| None -> Any
| Some (x,n) ->
debug "%s %a in delta_ptr term" s !Ast_printer.d_logic_var x;
Ok (x,true,n))
| Tat({term_node = t},_)-> help_array_reference_pattern_term s t
| TCastE(ty,{term_node = t}) when (Cil.isPointerType ty)->
help_array_reference_pattern_term s t
| t ->help_array_reference_pattern_term s t