summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp/rx.el
diff options
context:
space:
mode:
authorMattias EngdegÄrd <mattiase@acm.org>2021-02-26 09:52:16 +0100
committerMattias EngdegÄrd <mattiase@acm.org>2021-02-26 10:09:42 +0100
commit70f2d658e42120c289c4a3c043b5d5b1331bc183 (patch)
tree72fccc67118546e6d38b5969a32764dcb3060348 /lisp/emacs-lisp/rx.el
parent6bf56a3614ccd23a31e34ae997b2a6bb0d158489 (diff)
downloademacs-70f2d658e42120c289c4a3c043b5d5b1331bc183.tar.gz
Fix pcase rx pattern bugs
Two unrelated bugs: A missing type check caused an error in rx patterns for non-string match targets, and rx patterns did not work at all in pcase-let or pcase-let*. Second bug reported by Basil Contovounesios and Ag Ibragimov; fixes proposed by Stefan Monnier. Discussion and explanation in thread at https://lists.gnu.org/archive/html/emacs-devel/2021-02/msg01924.html * lisp/emacs-lisp/rx.el (rx): Add (pred stringp) to avoid type errors, and replace the `pred` clause for the actual match with something that works with pcase-let(*) without being optimised away. * test/lisp/emacs-lisp/rx-tests.el (rx-pcase): Add test cases.
Diffstat (limited to 'lisp/emacs-lisp/rx.el')
-rw-r--r--lisp/emacs-lisp/rx.el6
1 files changed, 5 insertions, 1 deletions
diff --git a/lisp/emacs-lisp/rx.el b/lisp/emacs-lisp/rx.el
index 58584f300c9..ffc21951b64 100644
--- a/lisp/emacs-lisp/rx.el
+++ b/lisp/emacs-lisp/rx.el
@@ -1437,7 +1437,11 @@ following constructs:
construct."
(let* ((rx--pcase-vars nil)
(regexp (rx--to-expr (rx--pcase-transform (cons 'seq regexps)))))
- `(and (pred (string-match ,regexp))
+ `(and (pred stringp)
+ ;; `pcase-let' takes a match for granted and discards all unnecessary
+ ;; conditions, which means that a `pred' clause cannot be used for
+ ;; the match condition. The following construct seems to survive.
+ (app (lambda (s) (string-match ,regexp s)) (pred identity))
,@(let ((i 0))
(mapcar (lambda (name)
(setq i (1+ i))