emacs/test/lisp/emacs-lisp
Mattias Engdegård bdea1883cc Fix pcase 'rx' pattern match-data bug
The pcase 'rx' pattern would in some cases allow the match data to be
clobbered before it is read.  For example:

  (pcase "PQR"
    ((and (rx (let a nonl)) (rx ?z)) (list 'one a))
    ((rx (let b ?Q))                 (list 'two b)))

The above returned (two "P") instead of the correct (two "Q").
This occurred because the calls to string-match and match-string were
presented as separate patterns to pcase, which would interleave them
with other patterns.

As a remedy, combine string matching and match-data extraction into a
single pcase pattern.  This introduces a slight inefficiency for two
or more submatches as they are grouped into a list structure which
then has to be destructured.

Found by Stefan Monnier.  See discussion at
https://lists.gnu.org/archive/html/emacs-devel/2021-02/msg02010.html

* lisp/emacs-lisp/rx.el (rx--reduce-right): New helper.
(rx [pcase macro]): Combine string-match and match-string calls into a
single pcase pattern.
* test/lisp/emacs-lisp/rx-tests.el (rx-pcase): Add test cases.
2021-02-28 13:06:24 +01:00
..
bytecomp-resources Fix spurious "Lexical argument shadows the dynamic variable" due to inlining 2021-01-21 13:15:05 -05:00
edebug-resources * Edebug: Generalize &lookup, use it for cl-macrolet and cl-generic 2021-02-14 21:34:09 -05:00
eieio-tests Update copyright year to 2021 2021-01-01 01:13:56 -08:00
faceup-resources Update copyright year to 2021 2021-01-01 01:13:56 -08:00
faceup-tests Update copyright year to 2021 2021-01-01 01:13:56 -08:00
macroexp-resources * test/lisp/emacs-lisp/macroexp-tests.el (macroexp--tests-file-name): Add case 2021-02-24 18:39:06 -05:00
package-resources Update copyright year to 2021 2021-01-01 01:13:56 -08:00
shadow-resources Use lexical-binding in most remaining emacs-lisp tests 2020-04-30 12:09:51 +02:00
testcover-resources ; Minor license statement fixes 2021-02-08 09:10:57 +01:00
backquote-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
backtrace-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
benchmark-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
bindat-tests.el * lisp/emacs-lisp/bindat.el (bindat-spec): New macro. 2021-02-15 21:25:15 -05:00
bytecomp-tests.el Prefer declare over a put of list-indent-function. 2021-02-22 11:54:17 -05:00
cconv-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
check-declare-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
checkdoc-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
cl-extra-tests.el ; Minor license statement fixes 2021-02-08 09:10:57 +01:00
cl-generic-tests.el * Edebug: Generalize &lookup, use it for cl-macrolet and cl-generic 2021-02-14 21:34:09 -05:00
cl-lib-tests.el ; Minor license statement fixes 2021-02-08 09:10:57 +01:00
cl-macs-tests.el ; Minor license statement fixes 2021-02-08 09:10:57 +01:00
cl-preloaded-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
cl-print-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
cl-seq-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
copyright-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
derived-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
easy-mmode-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
edebug-tests.el * test/lisp/emacs-lisp/edebug-tests.el: Adjust to new edebug-eval-defun. 2021-02-19 12:08:00 -05:00
ert-tests.el ; Minor license statement fixes 2021-02-08 09:10:57 +01:00
ert-x-tests.el ; Minor license statement fixes 2021-02-08 09:10:57 +01:00
find-func-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
float-sup-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
generator-tests.el Prefer declare over a put of list-indent-function. 2021-02-22 11:54:17 -05:00
gv-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
hierarchy-tests.el Use lexical-binding in more tests 2020-08-29 22:41:51 +02:00
let-alist-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
lisp-mode-tests.el ; Minor license statement fixes 2021-02-08 09:10:57 +01:00
lisp-tests.el ; Minor license statement fixes 2021-02-08 09:10:57 +01:00
macroexp-tests.el * test/lisp/emacs-lisp/macroexp-tests.el (macroexp--tests-file-name): Add case 2021-02-24 18:39:06 -05:00
map-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
memory-report-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
nadvice-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
package-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
pcase-tests.el * lisp/emacs-lisp/pcase.el: Add support for not to pred 2021-01-16 14:21:57 -05:00
pp-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
regexp-opt-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
ring-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
rmc-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
rx-tests.el Fix pcase 'rx' pattern match-data bug 2021-02-28 13:06:24 +01:00
seq-tests.el Fix recently uncovered 'make check' failures 2021-01-23 23:38:19 +00:00
shadow-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
subr-x-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
syntax-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
tabulated-list-test.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
testcover-tests.el ; Minor license statement fixes 2021-02-08 09:10:57 +01:00
text-property-search-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
thunk-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
timer-tests.el Prefer skip-unless in more tests 2021-01-13 17:39:53 +01:00
unsafep-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00
warnings-tests.el Update copyright year to 2021 2021-01-01 01:13:56 -08:00