diff --git a/theories/proofmode/tactics.v b/theories/proofmode/tactics.v index 2983b97c182ba2393dc2ec7e1dfb8ca689532ed1..c9379be107c5bb373c05138e046c51677042acc4 100644 --- a/theories/proofmode/tactics.v +++ b/theories/proofmode/tactics.v @@ -535,16 +535,17 @@ a goal [P] for non-dependent arguments [x_i : P]. *) Tactic Notation "iIntoValid" open_constr(t) := let rec go t := let tT := type of t in - first - [apply (proj1 (_ : AsValid tT _) t) - |lazymatch eval hnf in tT with - | ?P → ?Q => let H := fresh in assert P as H; [|go uconstr:(t H); clear H] - | ∀ _ : ?T, _ => - (* Put [T] inside an [id] to avoid TC inference from being invoked. *) - (* This is a workarround for Coq bug #4969. *) - let e := fresh in evar (e:id T); - let e' := eval unfold e in e in clear e; go (t e') - end] in + lazymatch eval hnf in tT with + | ?P → ?Q => let H := fresh in assert P as H; [|go uconstr:(t H); clear H] + | ∀ _ : ?T, _ => + (* Put [T] inside an [id] to avoid TC inference from being invoked. *) + (* This is a workarround for Coq bug #4969. *) + let e := fresh in evar (e:id T); + let e' := eval unfold e in e in clear e; go (t e') + | _ => + let tT' := eval cbv zeta in tT in apply (proj1 (_ : AsValid tT' _) t) + || fail "iPoseProof: not a uPred" + end in go t. (* The tactic [tac] is called with a temporary fresh name [H]. The argument diff --git a/theories/tests/proofmode.v b/theories/tests/proofmode.v index c9afe2d6eeb62ea2612bb6272d3d9af5f9687efb..e09f3f234346ce9450c1a9d04211873979c232e3 100644 --- a/theories/tests/proofmode.v +++ b/theories/tests/proofmode.v @@ -201,6 +201,18 @@ Lemma test_True_intros : (True : uPred M) -∗ True. Proof. iIntros "?". done. Qed. + +Lemma test_iPoseProof_let P Q : + (let R := True%I in R ∗ P ⊢ Q) → + P ⊢ Q. +Proof. + iIntros (help) "HP". + iPoseProof (help with "[$HP]") as "?". done. +Qed. + +Lemma test_iIntros_let P : + ∀ Q, let R := True%I in P -∗ R -∗ Q -∗ P ∗ Q. +Proof. iIntros (Q R) "$ HR $". Qed. End tests. Section more_tests.