From 2b8796eea1979fe6891ab9d80cd126fe8980167a Mon Sep 17 00:00:00 2001 From: Mattias EngdegÄrd Date: Sun, 30 Jul 2023 15:30:38 +0200 Subject: Fix rx wrong-code bug: ranges starting with ^ (rx (in (?^ . ?a))) was incorrectly translated to "[^-a]". Change it so that we get "[_-a^]" instead. * lisp/emacs-lisp/rx.el (rx--generate-alt): Split ranges starting with `^` occurring first in a non-negated character alternative. * test/lisp/emacs-lisp/rx-tests.el (rx-any): Add and adapt tests. (cherry picked from commit 5f5d668ac7917d61e9366fe0c3efd7b542671c3d) --- lisp/emacs-lisp/rx.el | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'lisp/emacs-lisp') diff --git a/lisp/emacs-lisp/rx.el b/lisp/emacs-lisp/rx.el index 46f61c26bc4..30195cbae32 100644 --- a/lisp/emacs-lisp/rx.el +++ b/lisp/emacs-lisp/rx.el @@ -445,13 +445,19 @@ classes." (setcar dash-l ?.)) ; Reduce --x to .-x (setq items (nconc items '((?- . ?-)))))) - ;; Deal with leading ^ and range ^-x. - (when (and (consp (car items)) - (eq (caar items) ?^) - (cdr items)) - ;; Move ^ and ^-x to second place. - (setq items (cons (cadr items) - (cons (car items) (cddr items))))) + ;; Deal with leading ^ and range ^-x in non-negated set. + (when (and (eq (car-safe (car items)) ?^) + (not negated)) + (if (eq (cdar items) ?^) + ;; single leading ^ + (when (cdr items) + ;; Move the ^ to second place. + (setq items (cons (cadr items) + (cons (car items) (cddr items))))) + ;; Split ^-x to _-x^ + (setq items (cons (cons ?_ (cdar items)) + (cons '(?^ . ?^) + (cdr items)))))) (cond ;; Empty set: if negated, any char, otherwise match-nothing. -- cgit v1.2.3