]> git.eshelyaron.com Git - emacs.git/commitdiff
Signal an error for the regexp "[:alnum:]"
authorMattias Engdegård <mattiase@acm.org>
Wed, 26 Feb 2020 13:46:01 +0000 (14:46 +0100)
committerMattias Engdegård <mattiase@acm.org>
Wed, 26 Feb 2020 21:09:17 +0000 (22:09 +0100)
Omitting the extra brackets is a common mistake; see discussion at
https://lists.gnu.org/archive/html/emacs-devel/2020-02/msg00215.html

* src/regex-emacs.c (reg_errcode_t, re_error_msgid): Add REG_ECLASSBR.
(regex_compile): Check for the mistake.
* test/src/regex-emacs-tests.el (regexp-invalid): Test.
* etc/NEWS: Announce.

etc/NEWS
src/regex-emacs.c
test/src/regex-emacs-tests.el

index ee3a3c19e7c42023b7a0f1b91f11f433254f74c6..96a612b53408320a375d5f838e31c817d0f2d393 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -202,6 +202,11 @@ Emacs now supports bignums so this old glitch is no longer needed.
 'previous-system-time-locale' have been removed, as they were created
 by mistake and were not useful to Lisp code.
 
+** The regexp mistake '[:digit:]' is now an error.
+The correct syntax is '[[:digit:]]'.  Previously, forgetting the extra
+brackets silently resulted in a regexp that did not at all work as
+intended.
+
 \f
 * Lisp Changes in Emacs 28.1
 
index 694431c95e244408277ecc524f5f673dfb963aba..38824370e056cc78eb332537b402b13cafb231d6 100644 (file)
@@ -818,7 +818,8 @@ typedef enum
   REG_ESIZE,           /* Compiled pattern bigger than 2^16 bytes.  */
   REG_ERPAREN,         /* Unmatched ) or \); not returned from regcomp.  */
   REG_ERANGEX,         /* Range striding over charsets.  */
-  REG_ESIZEBR           /* n or m too big in \{n,m\} */
+  REG_ESIZEBR,          /* n or m too big in \{n,m\} */
+  REG_ECLASSBR,         /* Missing [] around [:class:].  */
 } reg_errcode_t;
 
 static const char *re_error_msgid[] =
@@ -842,6 +843,7 @@ static const char *re_error_msgid[] =
    [REG_ERPAREN] = "Unmatched ) or \\)",
    [REG_ERANGEX ] = "Range striding over charsets",
    [REG_ESIZEBR ] = "Invalid content of \\{\\}",
+   [REG_ECLASSBR] = "Class syntax is [[:digit:]]; missing brackets",
   };
 
 /* For 'regs_allocated'.  */
@@ -2000,6 +2002,23 @@ regex_compile (re_char *pattern, ptrdiff_t size,
 
            laststart = b;
 
+            /* Check for the mistake of forgetting the extra square brackets,
+               as in "[:alpha:]".  */
+            if (*p == ':')
+              {
+                re_char *q = p + 1;
+                while (q != pend && *q != ']')
+                  {
+                    if (*q == ':')
+                      {
+                        if (q + 1 != pend && q[1] == ']' && q > p + 1)
+                          FREE_STACK_RETURN (REG_ECLASSBR);
+                        break;
+                      }
+                    q++;
+                  }
+              }
+
            /* Test '*p == '^' twice, instead of using an if
               statement, so we need only one BUF_PUSH.  */
            BUF_PUSH (*p == '^' ? charset_not : charset);
index f9372e37b110cc75d771019cf59a374ed2b46924..661d416e6a72b1562e0027ade6439525d3fd53b3 100644 (file)
@@ -803,4 +803,9 @@ This evaluates the TESTS test cases from glibc."
   (should-not (string-match "å" "\xe5"))
   (should-not (string-match "[å]" "\xe5")))
 
+(ert-deftest regexp-invalid ()
+  ;; relint suppression: Duplicated
+  (should-error (string-match "[:space:]" "")
+                :type 'invalid-regexp))
+
 ;;; regex-emacs-tests.el ends here