let user_env pdef =
    let context = push_context "user" in
    try
      let frame = M.userdef_frame () in
      let formals = List.map
        (fun lv ->
           let x = D.fresh lv.lv_name (Mdata.Vacsl lv.lv_type) in
           lv , x
        ) pdef.l_profile
      in
      let here =
        match pdef.l_labels with
          | [] -> Clabels.LabelParam "WP_nowhere" (* Non-expected ! *)
          | LogicLabel (None, first) :: _ -> Clabels.LabelParam first
          | LogicLabel (Some _, _) :: _ -> 
              Wp_parameters.fatal
                "Unexpected redefined labels in user-defined predicates"
          | StmtLabel _ :: _ ->
              Wp_parameters.fatal
                "Unexpected stmt-labels in user-defined predicates"
      in
      context , formals,
      {
        formals_in_pre = false ;
        frame = frame ;
        label = here ;
        lvars =
          List.fold_right
            (fun (lv,x) t -> Logic_var.Map.add lv (F.var x) t) formals Logic_var.Map.empty;
        xvars = Varinfo.Map.empty ;
      }
    with err ->
      kill_context "user env" context; raise err