diff --git a/tests/proofmode.ref b/tests/proofmode.ref index e1ab0ee889e8ae99abeb59db2dad4ae123432db7..2f8b19f5551a70a18ce638b5c7406c890d08633c 100644 --- a/tests/proofmode.ref +++ b/tests/proofmode.ref @@ -126,7 +126,7 @@ Tactic failure: iSpecialize: cannot instantiate (⌜φ⌠→ P -∗ False)%I wi : string The command has indeed failed with message: In nested Ltac calls to "iSimpl in (constr)", -"iEval (tactic) in (constr)" and "<iris.proofmode.ltac_tactics.iEval_go>", +"iEval (tactic3) in (constr)" and "<iris.proofmode.ltac_tactics.iEval_go>", last call failed. Tactic failure: iEval: %: unsupported selection pattern. "test_iFrame_later_1" @@ -443,8 +443,8 @@ Tactic failure: iModIntro: spatial context is non-empty. : string The command has indeed failed with message: In nested Ltac calls to "iDestruct (open_constr) as (constr)", -"iDestructCore (open_constr) as (constr) (tactic)" and -"iDestructCore (open_constr) as (constr) (tactic)", last call failed. +"iDestructCore (open_constr) as (constr) (tactic3)" and +"iDestructCore (open_constr) as (constr) (tactic3)", last call failed. Tactic failure: iDestruct: "HQ" not found. "iIntros_dup_name" : string @@ -553,14 +553,14 @@ Tactic failure: iStartProof: not a BI assertion. : string The command has indeed failed with message: In nested Ltac calls to "iPoseProof (open_constr) as (constr)", -"iPoseProofCore (open_constr) as (constr) (constr) (tactic)", -"iPoseProofCoreLem (constr) as (constr) before_tc (tactic)" and +"iPoseProofCore (open_constr) as (constr) (constr) (tactic3)", +"iPoseProofCoreLem (constr) as (constr) before_tc (tactic3)" and "<iris.proofmode.ltac_tactics.iIntoEmpValid>", last call failed. Tactic failure: iPoseProof: not a BI assertion. The command has indeed failed with message: In nested Ltac calls to "iPoseProof (open_constr) as (constr)", -"iPoseProofCore (open_constr) as (constr) (constr) (tactic)", -"iPoseProofCoreLem (constr) as (constr) before_tc (tactic)", +"iPoseProofCore (open_constr) as (constr) (constr) (tactic3)", +"iPoseProofCoreLem (constr) as (constr) before_tc (tactic3)", "tac" (bound to spec_tac ltac:(()); [ .. | tac Htmp ]), "tac" (bound to spec_tac ltac:(()); [ .. | tac Htmp ]), "tac" (bound to fun H => iDestructHyp H as pat), @@ -573,15 +573,15 @@ Tactic failure: iRename: "H" not fresh. : string The command has indeed failed with message: In nested Ltac calls to "iPoseProof (open_constr) as (constr)", -"iPoseProofCore (open_constr) as (constr) (constr) (tactic)" and +"iPoseProofCore (open_constr) as (constr) (constr) (tactic3)" and "iPoseProofCoreHyp (constr) as (constr)", last call failed. Tactic failure: iPoseProof: "Hx" not found. "iPoseProof_not_found_fail2" : string The command has indeed failed with message: In nested Ltac calls to "iPoseProof (open_constr) as (constr)", -"iPoseProofCore (open_constr) as (constr) (constr) (tactic)", -"iPoseProofCoreLem (constr) as (constr) before_tc (tactic)", +"iPoseProofCore (open_constr) as (constr) (constr) (tactic3)", +"iPoseProofCoreLem (constr) as (constr) before_tc (tactic3)", "tac" (bound to spec_tac ltac:(()); [ .. | tac Htmp ]), "tac" (bound to spec_tac ltac:(()); [ .. | tac Htmp ]), "spec_tac" (bound to @@ -616,9 +616,9 @@ Tactic failure: iElaborateSelPat: "H" not found. : string The command has indeed failed with message: In nested Ltac calls to "iDestruct (open_constr) as (constr)", -"iDestructCore (open_constr) as (constr) (tactic)", -"iDestructCore (open_constr) as (constr) (tactic)", -"iDestructCore (open_constr) as (constr) (tactic)", +"iDestructCore (open_constr) as (constr) (tactic3)", +"iDestructCore (open_constr) as (constr) (tactic3)", +"iDestructCore (open_constr) as (constr) (tactic3)", "tac" (bound to fun H => iDestructHyp H as pat), "iDestructHyp (constr) as (constr)", "<iris.proofmode.ltac_tactics.iDestructHypFindPat>" and @@ -627,9 +627,9 @@ Tactic failure: iDestruct: "{HP}" should contain exactly one proper introduction pattern. The command has indeed failed with message: In nested Ltac calls to "iDestruct (open_constr) as (constr)", -"iDestructCore (open_constr) as (constr) (tactic)", -"iDestructCore (open_constr) as (constr) (tactic)", -"iDestructCore (open_constr) as (constr) (tactic)", +"iDestructCore (open_constr) as (constr) (tactic3)", +"iDestructCore (open_constr) as (constr) (tactic3)", +"iDestructCore (open_constr) as (constr) (tactic3)", "tac" (bound to fun H => iDestructHyp H as pat), "iDestructHyp (constr) as (constr)", "<iris.proofmode.ltac_tactics.iDestructHypFindPat>" and @@ -648,7 +648,7 @@ Tactic failure: iOrDestruct: "H1" or "H'" not fresh. : string The command has indeed failed with message: In nested Ltac calls to "iApply (open_constr)", -"iPoseProofCore (open_constr) as (constr) (constr) (tactic)", +"iPoseProofCore (open_constr) as (constr) (constr) (tactic3)", "tac" (bound to fun H => iApplyHyp H) and "iApplyHyp (constr)", last call failed. Tactic failure: iApply: cannot apply P. @@ -656,7 +656,7 @@ Tactic failure: iApply: cannot apply P. : string The command has indeed failed with message: In nested Ltac calls to "iApply (open_constr)", -"iPoseProofCore (open_constr) as (constr) (constr) (tactic)", +"iPoseProofCore (open_constr) as (constr) (constr) (tactic3)", "tac" (bound to fun H => iApplyHyp H) and "iApplyHyp (constr)", last call failed. Tactic failure: iApply: Q @@ -665,7 +665,7 @@ not absorbing and the remaining hypotheses not affine. : string The command has indeed failed with message: In nested Ltac calls to "iApply (open_constr)", -"iPoseProofCore (open_constr) as (constr) (constr) (tactic)", +"iPoseProofCore (open_constr) as (constr) (constr) (tactic3)", "tac" (bound to fun H => iApplyHyp H) and "iApplyHyp (constr)", last call failed. Tactic failure: iApply: Q diff --git a/tests/proofmode.v b/tests/proofmode.v index 515cb9dbd80f741b8193195789d066dd882a0a8e..f1b43337b65f11f4110fb8c0de3429d0ef03bb23 100644 --- a/tests/proofmode.v +++ b/tests/proofmode.v @@ -480,6 +480,13 @@ Proof. done. Qed. +Lemma test_iEval_precedence : True ⊢ True : PROP. +Proof. + iIntros. + (* Ensure that in [iEval (a); b], b is not parsed as part of the argument of [iEval]. *) + iEval (rewrite /=); iPureIntro; exact I. +Qed. + Check "test_iSimpl_in". Lemma test_iSimpl_in x y : ⌜ (3 + x)%nat = y ⌠-∗ ⌜ S (S (S x)) = y ⌠: PROP. Proof. iIntros "H". iSimpl in "H". Show. done. Qed. diff --git a/tests/proofmode_iris.ref b/tests/proofmode_iris.ref index 0dbca72f4bf79e467472c44b99700f3542570f5c..6ebe13d84e424d0fe758d1da03beb2b76a065c16 100644 --- a/tests/proofmode_iris.ref +++ b/tests/proofmode_iris.ref @@ -111,20 +111,20 @@ : string The command has indeed failed with message: In nested Ltac calls to "iInv (constr) as (constr)", -"iInvCore (constr) in (tactic)" and -"iInvCore (constr) with (constr) as (open_constr) in (tactic)", last call +"iInvCore (constr) in (tactic3)" and +"iInvCore (constr) with (constr) as (open_constr) in (tactic3)", last call failed. Tactic failure: iInv: selector 34 is not of the right type . The command has indeed failed with message: In nested Ltac calls to "iInv (constr) as (constr)", -"iInvCore (constr) in (tactic)" and -"iInvCore (constr) with (constr) as (open_constr) in (tactic)", last call +"iInvCore (constr) in (tactic3)" and +"iInvCore (constr) with (constr) as (open_constr) in (tactic3)", last call failed. Tactic failure: iInv: invariant nroot not found. The command has indeed failed with message: In nested Ltac calls to "iInv (constr) as (constr)", -"iInvCore (constr) in (tactic)" and -"iInvCore (constr) with (constr) as (open_constr) in (tactic)", last call +"iInvCore (constr) in (tactic3)" and +"iInvCore (constr) with (constr) as (open_constr) in (tactic3)", last call failed. Tactic failure: iInv: invariant "H2" not found. "test_iInv" diff --git a/theories/proofmode/ltac_tactics.v b/theories/proofmode/ltac_tactics.v index dff46653bee6b1936ba82cf24161028370356167..a6c6da9700887bf8007a0eee636d2da61465970e 100644 --- a/theories/proofmode/ltac_tactics.v +++ b/theories/proofmode/ltac_tactics.v @@ -195,7 +195,7 @@ Tactic Notation "iClear" "(" ident_list(xs) ")" constr(Hs) := iClear Hs; clear xs. (** ** Simplification *) -Tactic Notation "iEval" tactic(t) := +Tactic Notation "iEval" tactic3(t) := iStartProof; eapply tac_eval; [let x := fresh in intros x; t; unfold x; reflexivity @@ -212,7 +212,7 @@ Local Ltac iEval_go t Hs := |pm_reduce; iEval_go t Hs] end. -Tactic Notation "iEval" tactic(t) "in" constr(Hs) := +Tactic Notation "iEval" tactic3(t) "in" constr(Hs) := iStartProof; let Hs := iElaborateSelPat Hs in iEval_go t Hs. Tactic Notation "iSimpl" := iEval (simpl). @@ -726,7 +726,7 @@ Tactic Notation "iPoseProofCoreHyp" constr(H) "as" constr(Hnew) := end. Tactic Notation "iPoseProofCoreLem" - constr(lem) "as" constr(Hnew) "before_tc" tactic(tac) := + constr(lem) "as" constr(Hnew) "before_tc" tactic3(tac) := eapply tac_pose_proof with Hnew _; (* (j:=H) *) [iIntoEmpValid lem |pm_reduce; @@ -1015,7 +1015,7 @@ Both variants of [lazy_tc] are used in other tactics that build on top of because it may be not possible to eliminate logical connectives before all type class constraints have been resolved. *) Tactic Notation "iPoseProofCore" open_constr(lem) - "as" constr(p) constr(lazy_tc) tactic(tac) := + "as" constr(p) constr(lazy_tc) tactic3(tac) := iStartProof; let Htmp := iFresh in let t := lazymatch lem with ITrm ?t ?xs ?pat => t | _ => lem end in @@ -1032,7 +1032,7 @@ Tactic Notation "iPoseProofCore" open_constr(lem) | true => iPoseProofCoreLem t as Htmp before_tc (spec_tac (); [..|tac Htmp]) | false => - iPoseProofCoreLem t as Htmp before_tc (spec_tac ()); [..|tac Htmp] + iPoseProofCoreLem t as Htmp before_tc (spec_tac (); [..|tac Htmp]) end end. @@ -1634,7 +1634,7 @@ Tactic Notation "iIntros" constr(p) "(" simple_intropattern(x1) (* Used for generalization in iInduction and iLöb *) -Tactic Notation "iRevertIntros" constr(Hs) "with" tactic(tac) := +Tactic Notation "iRevertIntros" constr(Hs) "with" tactic3(tac) := let rec go Hs := lazymatch Hs with | [] => tac @@ -1643,56 +1643,56 @@ Tactic Notation "iRevertIntros" constr(Hs) "with" tactic(tac) := end in try iStartProof; let Hs := iElaborateSelPat Hs in go Hs. -Tactic Notation "iRevertIntros" "(" ident(x1) ")" constr(Hs) "with" tactic(tac):= +Tactic Notation "iRevertIntros" "(" ident(x1) ")" constr(Hs) "with" tactic3(tac):= iRevertIntros Hs with (iRevert (x1); tac; iIntros (x1)). Tactic Notation "iRevertIntros" "(" ident(x1) ident(x2) ")" constr(Hs) - "with" tactic(tac):= + "with" tactic3(tac):= iRevertIntros Hs with (iRevert (x1 x2); tac; iIntros (x1 x2)). Tactic Notation "iRevertIntros" "(" ident(x1) ident(x2) ident(x3) ")" constr(Hs) - "with" tactic(tac):= + "with" tactic3(tac):= iRevertIntros Hs with (iRevert (x1 x2 x3); tac; iIntros (x1 x2 x3)). Tactic Notation "iRevertIntros" "(" ident(x1) ident(x2) ident(x3) ident(x4) ")" - constr(Hs) "with" tactic(tac):= + constr(Hs) "with" tactic3(tac):= iRevertIntros Hs with (iRevert (x1 x2 x3 x4); tac; iIntros (x1 x2 x3 x4)). Tactic Notation "iRevertIntros" "(" ident(x1) ident(x2) ident(x3) ident(x4) - ident(x5) ")" constr(Hs) "with" tactic(tac):= + ident(x5) ")" constr(Hs) "with" tactic3(tac):= iRevertIntros Hs with (iRevert (x1 x2 x3 x4 x5); tac; iIntros (x1 x2 x3 x4 x5)). Tactic Notation "iRevertIntros" "(" ident(x1) ident(x2) ident(x3) ident(x4) - ident(x5) ident(x6) ")" constr(Hs) "with" tactic(tac):= + ident(x5) ident(x6) ")" constr(Hs) "with" tactic3(tac):= iRevertIntros Hs with (iRevert (x1 x2 x3 x4 x5 x6); tac; iIntros (x1 x2 x3 x4 x5 x6)). Tactic Notation "iRevertIntros" "(" ident(x1) ident(x2) ident(x3) ident(x4) - ident(x5) ident(x6) ident(x7) ")" constr(Hs) "with" tactic(tac):= + ident(x5) ident(x6) ident(x7) ")" constr(Hs) "with" tactic3(tac):= iRevertIntros Hs with (iRevert (x1 x2 x3 x4 x5 x6 x7); tac; iIntros (x1 x2 x3 x4 x5 x6 x7)). Tactic Notation "iRevertIntros" "(" ident(x1) ident(x2) ident(x3) ident(x4) - ident(x5) ident(x6) ident(x7) ident(x8) ")" constr(Hs) "with" tactic(tac):= + ident(x5) ident(x6) ident(x7) ident(x8) ")" constr(Hs) "with" tactic3(tac):= iRevertIntros Hs with (iRevert (x1 x2 x3 x4 x5 x6 x7 x8); tac; iIntros (x1 x2 x3 x4 x5 x6 x7 x8)). -Tactic Notation "iRevertIntros" "with" tactic(tac) := +Tactic Notation "iRevertIntros" "with" tactic3(tac) := iRevertIntros "" with tac. -Tactic Notation "iRevertIntros" "(" ident(x1) ")" "with" tactic(tac):= +Tactic Notation "iRevertIntros" "(" ident(x1) ")" "with" tactic3(tac):= iRevertIntros (x1) "" with tac. -Tactic Notation "iRevertIntros" "(" ident(x1) ident(x2) ")" "with" tactic(tac):= +Tactic Notation "iRevertIntros" "(" ident(x1) ident(x2) ")" "with" tactic3(tac):= iRevertIntros (x1 x2) "" with tac. Tactic Notation "iRevertIntros" "(" ident(x1) ident(x2) ident(x3) ")" - "with" tactic(tac):= + "with" tactic3(tac):= iRevertIntros (x1 x2 x3) "" with tac. Tactic Notation "iRevertIntros" "(" ident(x1) ident(x2) ident(x3) ident(x4) ")" - "with" tactic(tac):= + "with" tactic3(tac):= iRevertIntros (x1 x2 x3 x4) "" with tac. Tactic Notation "iRevertIntros" "(" ident(x1) ident(x2) ident(x3) ident(x4) - ident(x5) ")" "with" tactic(tac):= + ident(x5) ")" "with" tactic3(tac):= iRevertIntros (x1 x2 x3 x4 x5) "" with tac. Tactic Notation "iRevertIntros" "(" ident(x1) ident(x2) ident(x3) ident(x4) - ident(x5) ident(x6) ")" "with" tactic(tac):= + ident(x5) ident(x6) ")" "with" tactic3(tac):= iRevertIntros (x1 x2 x3 x4 x5 x6) "" with tac. Tactic Notation "iRevertIntros" "(" ident(x1) ident(x2) ident(x3) ident(x4) - ident(x5) ident(x6) ident(x7) ")" "with" tactic(tac):= + ident(x5) ident(x6) ident(x7) ")" "with" tactic3(tac):= iRevertIntros (x1 x2 x3 x4 x5 x6 x7) "" with tac. Tactic Notation "iRevertIntros" "(" ident(x1) ident(x2) ident(x3) ident(x4) - ident(x5) ident(x6) ident(x7) ident(x8) ")" "with" tactic(tac):= + ident(x5) ident(x6) ident(x7) ident(x8) ")" "with" tactic3(tac):= iRevertIntros (x1 x2 x3 x4 x5 x6 x7 x8) "" with tac. (** * Destruct tactic *) @@ -1710,7 +1710,7 @@ Instance copy_destruct_affinely {PROP : bi} (P : PROP) : Instance copy_destruct_persistently {PROP : bi} (P : PROP) : CopyDestruct P → CopyDestruct (<pers> P) := {}. -Tactic Notation "iDestructCore" open_constr(lem) "as" constr(p) tactic(tac) := +Tactic Notation "iDestructCore" open_constr(lem) "as" constr(p) tactic3(tac) := let ident := lazymatch type of lem with | ident => constr:(Some lem) @@ -1869,7 +1869,7 @@ result in the following actions: - Introduce the spatial hypotheses and intuitionistic hypotheses involving [x] - Introduce the proofmode hypotheses [Hs] *) -Tactic Notation "iInductionCore" tactic(tac) "as" constr(IH) := +Tactic Notation "iInductionCore" tactic3(tac) "as" constr(IH) := let rec fix_ihs rev_tac := lazymatch goal with | H : context [envs_entails _ _] |- _ => @@ -1901,7 +1901,7 @@ Ltac iHypsContaining x := let Γs := lazymatch goal with |- envs_entails (Envs _ ?Γs _) _ => Γs end in let Hs := go Γp x (@nil ident) in go Γs x Hs. -Tactic Notation "iInductionRevert" constr(x) constr(Hs) "with" tactic(tac) := +Tactic Notation "iInductionRevert" constr(x) constr(Hs) "with" tactic3(tac) := iRevertIntros Hs with ( iRevertIntros "∗" with ( idtac; @@ -2083,7 +2083,7 @@ Tactic Notation "iLöbCore" "as" constr (IH) := | _ => idtac end]. -Tactic Notation "iLöbRevert" constr(Hs) "with" tactic(tac) := +Tactic Notation "iLöbRevert" constr(Hs) "with" tactic3(tac) := iRevertIntros Hs with ( iRevertIntros "∗" with tac ). @@ -2144,7 +2144,7 @@ Tactic Notation "iLöb" "as" constr (IH) "forall" "(" ident(x1) ident(x2) Boolean or an introduction pattern, which will be coerced into [true] if it only contains `#` or `%` patterns at the top-level, and [false] otherwise. *) Tactic Notation "iAssertCore" open_constr(Q) - "with" constr(Hs) "as" constr(p) tactic(tac) := + "with" constr(Hs) "as" constr(p) tactic3(tac) := iStartProof; let pats := spec_pat.parse Hs in lazymatch pats with @@ -2156,7 +2156,7 @@ Tactic Notation "iAssertCore" open_constr(Q) [pm_reduce; iSpecializeCore H with hnil pats as p; [..|tac H]]. -Tactic Notation "iAssertCore" open_constr(Q) "as" constr(p) tactic(tac) := +Tactic Notation "iAssertCore" open_constr(Q) "as" constr(p) tactic3(tac) := let p := intro_pat_intuitionistic p in lazymatch p with | true => iAssertCore Q with "[#]" as p tac @@ -2314,7 +2314,7 @@ Tactic Notation "iAssumptionInv" constr(N) := (* The argument [select] is the namespace [N] or hypothesis name ["H"] of the invariant. *) -Tactic Notation "iInvCore" constr(select) "with" constr(pats) "as" open_constr(Hclose) "in" tactic(tac) := +Tactic Notation "iInvCore" constr(select) "with" constr(pats) "as" open_constr(Hclose) "in" tactic3(tac) := iStartProof; let pats := spec_pat.parse pats in lazymatch pats with @@ -2361,13 +2361,13 @@ Tactic Notation "iInvCore" constr(select) "with" constr(pats) "as" open_constr(H )]. (* Without closing view shift *) -Tactic Notation "iInvCore" constr(N) "with" constr(pats) "in" tactic(tac) := +Tactic Notation "iInvCore" constr(N) "with" constr(pats) "in" tactic3(tac) := iInvCore N with pats as (@None string) in ltac:(tac). (* Without pattern *) -Tactic Notation "iInvCore" constr(N) "as" constr(Hclose) "in" tactic(tac) := +Tactic Notation "iInvCore" constr(N) "as" constr(Hclose) "in" tactic3(tac) := iInvCore N with "[$]" as Hclose in ltac:(tac). (* Without both *) -Tactic Notation "iInvCore" constr(N) "in" tactic(tac) := +Tactic Notation "iInvCore" constr(N) "in" tactic3(tac) := iInvCore N with "[$]" as (@None string) in ltac:(tac). (* With everything *)