From 89bc9c1fc0be21fbab0f0e66be75a9108e23406e Mon Sep 17 00:00:00 2001 From: Ralf Jung <jung@mpi-sws.org> Date: Wed, 4 Jul 2018 17:12:51 +0200 Subject: [PATCH] make `wp_alloc l as "?"` behave as expected --- tests/heap_lang.ref | 12 ++++++++++++ tests/heap_lang.v | 4 ++-- theories/heap_lang/proofmode.v | 9 +++++---- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/tests/heap_lang.ref b/tests/heap_lang.ref index 942c1aa93..1e739c094 100644 --- a/tests/heap_lang.ref +++ b/tests/heap_lang.ref @@ -18,6 +18,18 @@ --------------------------------------∗ WP #l <- #1 + #1;; ! #l @ E {{ v, ⌜v = #2⌠}} +1 subgoal + + Σ : gFunctors + H : heapG Σ + E : coPset + l : loc + ============================ + "Hl" : l ↦ #1 + --------------------------------------∗ + WP let: "x" := #l in let: "y" := ref #1 in "x" <- ! "x" + #1;; ! "x" + @ E [{ v, ⌜v = #2⌠}] + 1 subgoal Σ : gFunctors diff --git a/tests/heap_lang.v b/tests/heap_lang.v index 0d9361724..e863bf9b6 100644 --- a/tests/heap_lang.v +++ b/tests/heap_lang.v @@ -27,7 +27,7 @@ Section tests. Lemma heap_e_spec E : WP heap_e @ E {{ v, ⌜v = #2⌠}}%I. Proof. iIntros "". rewrite /heap_e. Show. - wp_alloc l. wp_let. wp_load. Show. + wp_alloc l as "?". wp_let. wp_load. Show. wp_op. wp_store. by wp_load. Qed. @@ -39,7 +39,7 @@ Section tests. Lemma heap_e2_spec E : WP heap_e2 @ E [{ v, ⌜v = #2⌠}]%I. Proof. iIntros "". rewrite /heap_e2. - wp_alloc l. wp_let. wp_alloc l'. wp_let. + wp_alloc l as "Hl". Show. wp_let. wp_alloc l'. wp_let. wp_load. wp_op. wp_store. wp_load. done. Qed. diff --git a/theories/heap_lang/proofmode.v b/theories/heap_lang/proofmode.v index 15c2f92de..fe8a81c37 100644 --- a/theories/heap_lang/proofmode.v +++ b/theories/heap_lang/proofmode.v @@ -360,31 +360,32 @@ Tactic Notation "wp_apply" open_constr(lem) := end). Tactic Notation "wp_alloc" ident(l) "as" constr(H) := + let Htmp := iFresh in let finish _ := first [intros l | fail 1 "wp_alloc:" l "not fresh"]; eexists; split; [pm_reflexivity || fail "wp_alloc:" H "not fresh" - |wp_expr_simpl; try wp_value_head] in + |iDestruct Htmp as H; wp_expr_simpl; try wp_value_head] in iStartProof; lazymatch goal with | |- envs_entails _ (wp ?s ?E ?e ?Q) => first [reshape_expr e ltac:(fun K e' => - eapply (tac_wp_alloc _ _ _ _ H K); [iSolveTC|..]) + eapply (tac_wp_alloc _ _ _ _ Htmp K); [iSolveTC|..]) |fail 1 "wp_alloc: cannot find 'Alloc' in" e]; [iSolveTC |finish ()] | |- envs_entails _ (twp ?s ?E ?e ?Q) => first [reshape_expr e ltac:(fun K e' => - eapply (tac_twp_alloc _ _ _ H K); [iSolveTC|..]) + eapply (tac_twp_alloc _ _ _ Htmp K); [iSolveTC|..]) |fail 1 "wp_alloc: cannot find 'Alloc' in" e]; finish () | _ => fail "wp_alloc: not a 'wp'" end. Tactic Notation "wp_alloc" ident(l) := - let H := iFresh in wp_alloc l as H. + wp_alloc l as "?". Tactic Notation "wp_load" := let solve_mapsto _ := -- GitLab