let lvar m lv x=
let r = Lvar lv in
match Variables_analysis.dispatch_lvar lv with
| Variables_analysis.Fvar ->
oracle
"%a is a funvar @." !Ast_printer.d_logic_var lv ;
Path (mk_path r m.mem)
| Variables_analysis.Cvar when Crit.isHoare ->
oracle
"%a is a funvar @." !Ast_printer.d_logic_var lv ;
Path (mk_path r m.mem)
| Variables_analysis.Cvar ->
oracle
"%a is a memvar @." !Ast_printer.d_logic_var lv ;
Mloc (M.lvar m.mem lv x)
| Variables_analysis.ARarg ->
oracle
"%a is a array refvar @." !Ast_printer.d_logic_var lv;
ARef (mk_path r m.mem)
| Variables_analysis.PRarg ->
oracle
"%a is a ptr refvar @." !Ast_printer.d_logic_var lv ;
PRef (mk_path r m.mem)
| Variables_analysis.PRpar n ->
oracle
"%a is a ptr ref param of arity %d @."
!Ast_printer.d_logic_var lv n;
PRpar (mk_pref r m.mem n (Some x), n)
| Variables_analysis.ARpar n ->
oracle
"%a is a array ref param of arity %d @."
!Ast_printer.d_logic_var lv n;
let (n0,_) = brackets_and_stars_lv_typ lv.lv_type in
ARpar (mk_aref r m.mem n (Some x), n0)