anchor.diff:                mk <| Tm_let((false, [mk_lb (attrs, Inr fv, t, t1, t1.pos)]), body), aq
   
               | LocalBinder (x,_) ->
  +                // TODO GGGGG unsure if keep _ or [] on second comp below
                 let body, aq = desugar_term_aq env t2 in
                 let body = match pat with
                   | []
  -                | [{v=Pat_wild _}] -> body
  +                | [{v=Pat_wild _}, _] -> body
                   | _ ->
                     S.mk (Tm_match(S.bv_to_name x, desugar_disjunctive_pattern pat None body)) None top.range in
                 mk <| Tm_let((false, [mk_lb (attrs, Inl x, x.sort, t1, t1.pos)]), Subst.close [S.mk_binder x] body), aq
  
positive.code:         let e, x = if is_mut then push_bv_mutable e x else push_bv e x in
          (x::l), e, x
    in
    let rec aux' (top:bool) (loc:lenv_t) env (p:pattern) =
      let pos q = Syntax.withinfo q p.prange in
      let pos_r r q = Syntax.withinfo q r in
      let orig = p in
  
negative.code:     match p.pat with
        | PatOr [] -> failwith "impossible"
        | PatOr (p::ps) ->
          let loc, env, var, p, ans, _ = aux' true loc env p in
          let loc, env, ps = List.fold_left (fun (loc, env, ps) p ->
            let loc, env, _, p, ans, _ = aux' true loc env p in
            loc, env, (p,ans)::ps) (loc, env, []) ps in
          let pats = ((p,ans)::List.rev ps) in
          env, var, pats
        | _ ->
          let loc, env, vars, pat, ans, b = aux' true loc env p in
          env, vars, [(pat, ans)]
    in
    let env, b, pats = aux_maybe_or env p in
    check_linear_pattern_variables (List.map fst pats) p.prange;
    env, b, pats
  
  and desugar_binding_pat_maybe_top top env p is_mut : (env_t * bnd * list<annotated_pat>) =
    let mklet x = env, LetBinder(qualify env x, (tun, None)), [] in
    if top
    then match p.pat with
  