anchor.diff:  module EMB = FStar.Syntax.Embeddings
   module SS = FStar.Syntax.Subst
   
  -let desugar_disjunctive_pattern pats when_opt branch =
  -    pats |> List.map (fun pat -> U.branch(pat, when_opt, branch))
  +type annotated_pat = Syntax.pat * list<(bv * Syntax.typ)>
  +
  +let desugar_disjunctive_pattern annotated_pats when_opt branch =
  +    annotated_pats |> List.map (fun (pat, annots) ->
  +        let branch = List.fold_left (fun br (bv, ty) ->
  +                        let lb = U.mk_letbinding (Inl bv) [] ty C.effect_Tot_lid (S.bv_to_name bv) [] br.pos in
  +                        let branch = SS.close [S.mk_binder bv] branch in
  +                        mk (Tm_let ((false, [lb]), branch)) None br.pos) branch annots in
  +        U.branch(pat, when_opt, branch)
  +    )
   
   let trans_qual r maybe_effect_id = function
     | AST.Private ->       S.Private
  
positive.code:                 | None -> ()
                  | Some _ -> raise_error (Errors.Fatal_TypeWithinPatternsAllowedOnVariablesOnly, "Type ascriptions within patterns are cannot be associated with a tactic") orig.prange
          in
          let loc, env', binder, p, imp = aux loc env p in
          let annot_pat_var p t =
              match p.v with
              | Pat_var x -> {p with v=Pat_var({x with sort=t})}
  
negative.code: 
  (* TODO : Patterns should be checked that there are no incompatible type ascriptions *)
  (* and these type ascriptions should not be dropped !!!                              *)
  let rec desugar_data_pat env p is_mut : (env_t * bnd * list<annotated_pat>) =
    let check_linear_pattern_variables pats r =
      // returns the set of pattern variables
      let rec pat_vars p = match p.v with
  