aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Martin-Dorel2019-04-16 03:18:03 +0200
committerErik Martin-Dorel2019-04-23 20:22:41 +0200
commit92e2bb2bebc99b6a72ea0babad9a1c374129a0c0 (patch)
treedfde6ab328fa036dc62398489bb8b33f1aa8f8ad
parent36488400952da5e12c8af451b1a936a34b26039d (diff)
[ssr] set under's tactic argument at LEVEL 3
So if the underlying tactic "contains a ;" one should actually write: under eq_bigl => i do [rewrite andb_idl; first by move/eqP->].
-rw-r--r--plugins/ssr/ssrparser.mlg20
-rw-r--r--test-suite/output/ssr_under.v2
-rw-r--r--test-suite/ssr/under.v2
3 files changed, 20 insertions, 4 deletions
diff --git a/plugins/ssr/ssrparser.mlg b/plugins/ssr/ssrparser.mlg
index 4286ace519..4d65fc81d1 100644
--- a/plugins/ssr/ssrparser.mlg
+++ b/plugins/ssr/ssrparser.mlg
@@ -86,6 +86,15 @@ GRAMMAR EXTEND Gram
ssrtacarg: [[ tac = tactic_expr LEVEL "5" -> { tac } ]];
END
+(* Copy of ssrtacarg with LEVEL "3", useful for: "under ... do ..." *)
+ARGUMENT EXTEND ssrtac3arg TYPED AS tactic PRINTED BY { pr_ssrtacarg env sigma }
+| [ "YouShouldNotTypeThis" ] -> { CErrors.anomaly (Pp.str "Grammar placeholder match") }
+END
+GRAMMAR EXTEND Gram
+ GLOBAL: ssrtac3arg;
+ ssrtac3arg: [[ tac = tactic_expr LEVEL "3" -> { tac } ]];
+END
+
{
(* Lexically closed tactic for tacticals. *)
@@ -1065,6 +1074,13 @@ ARGUMENT EXTEND ssrhintarg TYPED AS (bool * ssrortacs) PRINTED BY { pr_ssrhintar
| [ ssrtacarg(arg) ] -> { mk_hint arg }
END
+(* Copy of ssrhintarg with LEVEL "3", useful for: "under ... do ..." *)
+ARGUMENT EXTEND ssrhint3arg TYPED AS (bool * ssrortacs) PRINTED BY { pr_ssrhintarg env sigma }
+| [ "[" "]" ] -> { nullhint }
+| [ "[" ssrortacs(tacs) "]" ] -> { mk_orhint tacs }
+| [ ssrtac3arg(arg) ] -> { mk_hint arg }
+END
+
ARGUMENT EXTEND ssrortacarg TYPED AS ssrhintarg PRINTED BY { pr_ssrhintarg env sigma }
| [ "[" ssrortacs(tacs) "]" ] -> { mk_orhint tacs }
END
@@ -2686,11 +2702,11 @@ TACTIC EXTEND under
check_under_arg arg;
Ssrfwd.undertac ist (Some ipats) arg nohint
}
- | [ "under" ssrrwarg(arg) ssrintros_ne(ipats) "do" ssrhintarg(h) ] -> {
+ | [ "under" ssrrwarg(arg) ssrintros_ne(ipats) "do" ssrhint3arg(h) ] -> {
check_under_arg arg;
Ssrfwd.undertac ist (Some ipats) arg h
}
- | [ "under" ssrrwarg(arg) "do" ssrhintarg(h) ] -> { (* implicit "=> [*|*]" *)
+ | [ "under" ssrrwarg(arg) "do" ssrhint3arg(h) ] -> { (* implicit "=> [*|*]" *)
check_under_arg arg;
Ssrfwd.undertac ~pad_intro:true ist (Some [IPatAnon All]) arg h
}
diff --git a/test-suite/output/ssr_under.v b/test-suite/output/ssr_under.v
index 7335c87e61..fb7503d902 100644
--- a/test-suite/output/ssr_under.v
+++ b/test-suite/output/ssr_under.v
@@ -10,7 +10,7 @@ Axiom eq_G :
Ltac show := match goal with [|-?g] => idtac g end.
Lemma example_G (n : nat) : G (fun n => n - n) n >= 0.
-under eq_G => m do show; rewrite subnn.
+under eq_G => m do [show; rewrite subnn].
show.
Abort.
diff --git a/test-suite/ssr/under.v b/test-suite/ssr/under.v
index 84f6b9ad03..f285ad138b 100644
--- a/test-suite/ssr/under.v
+++ b/test-suite/ssr/under.v
@@ -175,7 +175,7 @@ Qed.
Lemma test_big_andb (F : nat -> nat) (m n : nat) :
\sum_(0 <= i < 5 | odd i && (i == 1)) i = 1.
Proof.
-under eq_bigl => i do rewrite andb_idl; first by move/eqP->.
+under eq_bigl => i do [rewrite andb_idl; first by move/eqP->].
under eq_bigr => i do move/eqP=>{1}->. (* the 2nd occ should not be touched *)
myadmit.
Qed.