let cvar m vi =
    let r = Cvar vi in 
    match Variables_analysis.dispatch_cvar vi with 
      | Variables_analysis.Fvar ->
          oracle 
            "%a is a funvar @." !Ast_printer.d_var vi ;
          Path (mk_path r m.mem)
      | Variables_analysis.Cvar when Crit.isHoare -> 
          oracle 
            "%a is a funvar @." !Ast_printer.d_var vi ;
          Path (mk_path r m.mem)
      | Variables_analysis.Cvar -> 
          oracle 
          "%a is a memvar @." !Ast_printer.d_var vi ;
          Mloc (M.cvar m.mem vi)
      | Variables_analysis.ARarg ->
          oracle
            "%a is a array refvar @." !Ast_printer.d_var vi;
          if vi.vglob then M.global vi;
          ARef (mk_path r m.mem)
      | Variables_analysis.PRarg -> 
          oracle
            "%a is a ptr refvar @." !Ast_printer.d_var vi ;
          PRef (mk_path r m.mem)
      | Variables_analysis.PRpar n ->
          oracle
            "%a is a ptr ref param of arity %d @." !Ast_printer.d_var vi n;
          PRpar (mk_pref r m.mem n None, n)
      | Variables_analysis.ARpar n ->
          oracle
            "%a is a array ref param of arity %d @." !Ast_printer.d_var vi n;
          let (n0,_) = brackets_and_stars_typ vi.vtype in 
          if vi.vglob then global vi;
          ARpar (mk_aref r m.mem n None, n0)