anchor.diff:                          List.mapi (fun i ((pi, _), (ei, _)) ->
                               let projector = Env.lookup_projector env f.v i in
                               //NS: TODO ... should this be a marked as a record projector? But it doesn't matter for extraction
  -                            match Env.try_lookup_lid env projector with
  -                            | None ->
  -                              failwith (BU.format1 "Impossible: projector %s not found" (Print.lid_to_string projector))
  -                            | _ ->
  -                              let proj = S.fvar (Ident.set_lid_range projector f.p) (Delta_equational_at_level 1) None in
  -                              let sub_term = mk_Tm_app proj [as_arg scrutinee_tm] None f.p in
  -                              build_branch_guard sub_term pi ei) |>
  +                            let scrutinee_tm =
  +                                match Env.try_lookup_lid env projector with
  +                                | None ->
  +                                  None //no projector, e.g., because we are actually typechecking the projector itself
  +                                | _ ->
  +                                  let proj = S.fvar (Ident.set_lid_range projector f.p) (Delta_equational_at_level 1) None in
  +                                  Some (mk_Tm_app proj [as_arg (force_scrutinee())] None f.p)
  +                            in
  +                            build_branch_guard scrutinee_tm pi ei) |>
                           List.flatten
                        in
  -                     discriminate scrutinee_tm f @ sub_term_guards
  +                     discriminate (force_scrutinee()) f @ sub_term_guards
   
               | Pat_dot_term _, _ -> []
                 //a non-pattern sub-term computed via unification; no guard needeed since it is from a dot pattern
  
positive.code:                   t in
  
            (* 6 (c) *)
           let branch_guard = build_and_check_branch_guard scrutinee_tm pattern norm_pat_exp in
  
            (* 6 (d) *)
           let branch_guard =
  
negative.code:       if not (Env.should_verify env)
        then U.t_true
        else (* 6 (a) *)
            let rec build_branch_guard (scrutinee_tm:option<term>) (pattern:pat) pat_exp : list<typ> =
              let discriminate scrutinee_tm f =
                  let is_induc, datacons = Env.datacons_of_typ env (Env.typ_of_datacon env f.v) in
                  (* Why the `not is_induc`? We may be checking an exception pattern. See issue #1535. *)
  