diff --git a/heap_lang/proofmode.v b/heap_lang/proofmode.v
index b4e5bfc4ce1d1fadcc940addfd66a820a4b21430..2889b52b758bf91442a04d57fb085470642ff7f6 100644
--- a/heap_lang/proofmode.v
+++ b/heap_lang/proofmode.v
@@ -88,6 +88,7 @@ Tactic Notation "wp_apply" open_constr(lem) :=
   match goal with
   | |- _ ⊢ wp ?E ?e ?Q => reshape_expr e ltac:(fun K e' =>
     wp_bind K; iApply lem; try iNext)
+  | _ => fail "wp_apply: not a 'wp'"
   end.
 
 Tactic Notation "wp_alloc" ident(l) "as" constr(H) :=
@@ -103,9 +104,11 @@ Tactic Notation "wp_alloc" ident(l) "as" constr(H) :=
          |intros l; eexists; split;
            [env_cbv; reflexivity || fail 2 "wp_alloc:" H "not fresh"
            |wp_finish]]
-    end)
+    end) || fail "wp_alloc: cannot find 'Alloc' in" e
+  | _ => fail "wp_alloc: not a 'wp'"
   end.
-Tactic Notation "wp_alloc" ident(l) := let H := iFresh in wp_alloc l as H.
+Tactic Notation "wp_alloc" ident(l) :=
+  let H := iFresh in wp_alloc l as H.
 
 Tactic Notation "wp_load" :=
   match goal with
@@ -118,7 +121,8 @@ Tactic Notation "wp_load" :=
          |apply _
          |iAssumptionCore || fail 2 "wp_cas_fail: cannot find" l "↦ ?"
          |wp_finish]
-    end)
+    end) || fail "wp_load: cannot find 'Load' in" e
+  | _ => fail "wp_load: not a 'wp'"
   end.
 
 Tactic Notation "wp_store" :=
@@ -134,14 +138,15 @@ Tactic Notation "wp_store" :=
          |iAssumptionCore || fail 2 "wp_store: cannot find" l "↦ ?"
          |env_cbv; reflexivity
          |wp_finish]
-    end)
+    end) || fail "wp_store: cannot find 'Store' in" e
+  | _ => fail "wp_store: not a 'wp'"
   end.
 
 Tactic Notation "wp_cas_fail" :=
   match goal with
   | |- _ ⊢ wp ?E ?e ?Q => reshape_expr e ltac:(fun K e' =>
     match eval hnf in e' with
-    | CAS (Lit (LitLoc ?l)) ?e1 ?e2 =>
+    | CAS ?l ?e1 ?e2 =>
        wp_bind K; eapply tac_wp_cas_fail;
          [wp_done || fail 2 "wp_cas_fail:" e1 "not a value"
          |wp_done || fail 2 "wp_cas_fail:" e2 "not a value"
@@ -151,14 +156,15 @@ Tactic Notation "wp_cas_fail" :=
          |iAssumptionCore || fail 2 "wp_cas_fail: cannot find" l "↦ ?"
          |try discriminate
          |wp_finish]
-    end)
+    end) || fail "wp_cas_fail: cannot find 'CAS' in" e
+  | _ => fail "wp_cas_fail: not a 'wp'"
   end.
 
 Tactic Notation "wp_cas_suc" :=
   match goal with
   | |- _ ⊢ wp ?E ?e ?Q => reshape_expr e ltac:(fun K e' =>
     match eval hnf in e' with
-    | CAS (Lit (LitLoc ?l)) ?e1 ?e2 =>
+    | CAS ?l ?e1 ?e2 =>
        wp_bind K; eapply tac_wp_cas_suc;
          [wp_done || fail 2 "wp_cas_suc:" e1 "not a value"
          |wp_done || fail 2 "wp_cas_suc:" e1 "not a value"
@@ -168,5 +174,6 @@ Tactic Notation "wp_cas_suc" :=
          |iAssumptionCore || fail 2 "wp_cas_suc: cannot find" l "↦ ?"
          |env_cbv; reflexivity
          |wp_finish]
-    end)
+    end) || fail "wp_cas_suc: cannot find 'CAS' in" e
+  | _ => fail "wp_cas_suc: not a 'wp'"
   end.
diff --git a/heap_lang/wp_tactics.v b/heap_lang/wp_tactics.v
index dc73a065f7a6f92a26a79c7b16718e1f674abd8f..7f376360640d333c54522dc4a14b4afd25c4a8cf 100644
--- a/heap_lang/wp_tactics.v
+++ b/heap_lang/wp_tactics.v
@@ -28,7 +28,8 @@ Ltac wp_finish := intros_revert ltac:(
 Tactic Notation "wp_value" :=
   match goal with
   | |- _ ⊢ wp ?E ?e ?Q => reshape_expr e ltac:(fun K e' =>
-    wp_bind K; wp_value_head)
+    wp_bind K; wp_value_head) || fail "wp_value: cannot find value in" e
+  | _ => fail "wp_value: not a wp"
   end.
 
 Tactic Notation "wp_rec" :=
@@ -38,8 +39,9 @@ Tactic Notation "wp_rec" :=
 (* hnf does not reduce through an of_val *)
 (*      match eval hnf in e1 with Rec _ _ _ => *)
     wp_bind K; etrans; [|eapply wp_rec'; wp_done]; simpl_subst; wp_finish
-(*      end *) end)
-   end.
+(*      end *) end) || fail "wp_rec: cannot find 'Rec' in" e
+  | _ => fail "wp_rec: not a 'wp'"
+  end.
 
 Tactic Notation "wp_lam" :=
   match goal with
@@ -47,7 +49,8 @@ Tactic Notation "wp_lam" :=
     match eval hnf in e' with App ?e1 _ =>
 (*    match eval hnf in e1 with Rec BAnon _ _ => *)
     wp_bind K; etrans; [|eapply wp_lam; wp_done]; simpl_subst; wp_finish
-(*    end *) end)
+(*    end *) end) || fail "wp_lam: cannot find 'Lam' in" e
+  | _ => fail "wp_lam: not a 'wp'"
   end.
 
 Tactic Notation "wp_let" := wp_lam.
@@ -64,7 +67,8 @@ Tactic Notation "wp_op" :=
        wp_bind K; etrans; [|eapply wp_bin_op; try fast_done]; wp_finish
     | UnOp _ _ =>
        wp_bind K; etrans; [|eapply wp_un_op; try fast_done]; wp_finish
-    end)
+    end) || fail "wp_op: cannot find 'BinOp' or 'UnOp' in" e
+  | _ => fail "wp_op: not a 'wp'"
   end.
 
 Tactic Notation "wp_proj" :=
@@ -73,30 +77,38 @@ Tactic Notation "wp_proj" :=
     match eval hnf in e' with
     | Fst _ => wp_bind K; etrans; [|eapply wp_fst; wp_done]; wp_finish
     | Snd _ => wp_bind K; etrans; [|eapply wp_snd; wp_done]; wp_finish
-    end)
+    end) || fail "wp_proj: cannot find 'Fst' or 'Snd' in" e
+  | _ => fail "wp_proj: not a 'wp'"
   end.
 
 Tactic Notation "wp_if" :=
   match goal with
   | |- _ ⊢ wp ?E ?e ?Q => reshape_expr e ltac:(fun K e' =>
-    match eval hnf in e' with If _ _ _ =>
-    wp_bind K;
-    etrans; [|eapply wp_if_true || eapply wp_if_false]; wp_finish
-    end)
+    match eval hnf in e' with
+    | If _ _ _ =>
+      wp_bind K;
+      etrans; [|eapply wp_if_true || eapply wp_if_false]; wp_finish
+    end) || fail "wp_if: cannot find 'If' in" e
+  | _ => fail "wp_if: not a 'wp'"
   end.
 
 Tactic Notation "wp_case" :=
   match goal with
   | |- _ ⊢ wp ?E ?e ?Q => reshape_expr e ltac:(fun K e' =>
-    match eval hnf in e' with Case _ _ _ =>
+    match eval hnf in e' with
+    | Case _ _ _ =>
       wp_bind K;
       etrans; [|first[eapply wp_case_inl; wp_done|eapply wp_case_inr; wp_done]];
       wp_finish
-    end)
+    end) || fail "wp_case: cannot find 'Case' in" e
+  | _ => fail "wp_case: not a 'wp'"
   end.
 
 Tactic Notation "wp_focus" open_constr(efoc) :=
   match goal with
   | |- _ ⊢ wp ?E ?e ?Q => reshape_expr e ltac:(fun K e' =>
-    match e' with efoc => unify e' efoc; wp_bind K end)
+    match e' with
+    | efoc => unify e' efoc; wp_bind K
+    end) || fail "wp_focus: cannot find" efoc "in" e
+  | _ => fail "wp_focus: not a 'wp'"
   end.