diff --git a/tests/atomic.ref b/tests/atomic.ref index 6184f371c9cb452e5276630face9bbee9598cc9a..ba5c5ad608616ab2992086c7e9411483ad6fe03e 100644 --- a/tests/atomic.ref +++ b/tests/atomic.ref @@ -12,6 +12,14 @@ AACC << ∀ (v0 : val) (q : Qp), l ↦{q} v0 ABORT l ↦ v >> @ ⊤, ∅ << l ↦{q} v0, COMM Q -∗ Q >> +"non_laterable" + : string +The command has indeed failed with message: +Tactic failure: iAuIntro: not all spatial assumptions are laterable. +The command has indeed failed with message: +Tactic failure: iAuIntro: not all spatial assumptions are laterable. +"printing" + : string 1 subgoal Σ : gFunctors diff --git a/tests/atomic.v b/tests/atomic.v index 6e3b5707708c36a2c59723e04b74956901b3d132..125a261c18bfaa41ae9246fa617025aa02104174 100644 --- a/tests/atomic.v +++ b/tests/atomic.v @@ -17,7 +17,24 @@ Section tests. Qed. End tests. +(* Test if we get reasonable error messages with non-laterable assertions in the context. *) +Section error. + Context `{!heapG Σ} {aheap: atomic_heap Σ}. + Import atomic_heap.notation. + + Check "non_laterable". + Lemma non_laterable (P : iProp Σ) (l : loc) : + P -∗ WP !#l {{ _, True }}. + Proof. + iIntros "HP". wp_apply load_spec. Fail iAuIntro. + Restart. + iIntros "HP". Fail awp_apply load_spec. + Abort. +End error. + + (* Test if AWP and the AU obtained from AWP print. *) +Check "printing". Section printing. Context `{!heapG Σ}. diff --git a/theories/heap_lang/proofmode.v b/theories/heap_lang/proofmode.v index fc4913c1bcc81d016f23c6e229bbc7a19cbdfc55..d1632a886c41ec2fb8b5787ec375480c84a1eda0 100644 --- a/theories/heap_lang/proofmode.v +++ b/theories/heap_lang/proofmode.v @@ -16,7 +16,7 @@ Lemma tac_twp_expr_eval `{!heapG Σ} Δ s E Φ e e' : envs_entails Δ (WP e' @ s; E [{ Φ }]) → envs_entails Δ (WP e @ s; E [{ Φ }]). Proof. by intros ->. Qed. -Tactic Notation "wp_expr_eval" tactic(t) := +Tactic Notation "wp_expr_eval" tactic3(t) := iStartProof; lazymatch goal with | |- envs_entails _ (wp ?s ?E ?e ?Q) => @@ -408,7 +408,7 @@ End heap. [wp_bind K; tac H] for every possible evaluation context. [tac] can do [iApplyHyp H] to actually apply the hypothesis. TC resolution of [lem] premises happens *after* [tac H] got executed. *) -Tactic Notation "wp_apply_core" open_constr(lem) tactic(tac) := +Tactic Notation "wp_apply_core" open_constr(lem) tactic3(tac) := wp_pures; iPoseProofCore lem as false (fun H => lazymatch goal with @@ -435,9 +435,11 @@ the context, which is intended to be the non-laterable assertions that iAuIntro would choke on. You get them all back in the continuation of the atomic operation. *) Tactic Notation "awp_apply" open_constr(lem) := - wp_apply_core lem (fun H => iApplyHyp H; last iAuIntro). + wp_apply_core lem (fun H => iApplyHyp H); + last iAuIntro. Tactic Notation "awp_apply" open_constr(lem) "without" constr(Hs) := - wp_apply_core lem (fun H => iApply wp_frame_wand_l; iSplitL Hs; [iAccu|iApplyHyp H; last iAuIntro]). + wp_apply_core lem (fun H => iApply wp_frame_wand_l; iSplitL Hs; [iAccu|iApplyHyp H]); + last iAuIntro. Tactic Notation "wp_alloc" ident(l) "as" constr(H) := let Htmp := iFresh in