Signal error for symbol names with strange quotes (Bug#2967)
* src/lread.c (read1): Signal an error when a symbol starts with a non-escaped quote-like character. * test/src/lread-tests.el (lread-tests--funny-quote-symbols): New test. * etc/NEWS: Announce change.
This commit is contained in:
parent
37954f3916
commit
8b18911a5c
3 changed files with 39 additions and 0 deletions
4
etc/NEWS
4
etc/NEWS
|
@ -1154,6 +1154,10 @@ instead of its first.
|
|||
renamed to 'lread--old-style-backquotes'. No user code should use
|
||||
this variable.
|
||||
|
||||
** To avoid confusion caused by "smart quotes", the reader no longer
|
||||
accepts Lisp symbols which begin with the following quotation
|
||||
characters: ‘’‛“”‟〞"', unless they are escaped with backslash.
|
||||
|
||||
+++
|
||||
** Module functions are now implemented slightly differently; in
|
||||
particular, the function 'internal--module-call' has been removed.
|
||||
|
|
18
src/lread.c
18
src/lread.c
|
@ -3479,6 +3479,24 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list)
|
|||
if (! NILP (result))
|
||||
return unbind_to (count, result);
|
||||
}
|
||||
if (!quoted && multibyte)
|
||||
{
|
||||
int ch = STRING_CHAR ((unsigned char *) read_buffer);
|
||||
switch (ch)
|
||||
{
|
||||
case 0x2018: /* LEFT SINGLE QUOTATION MARK */
|
||||
case 0x2019: /* RIGHT SINGLE QUOTATION MARK */
|
||||
case 0x201B: /* SINGLE HIGH-REVERSED-9 QUOTATION MARK */
|
||||
case 0x201C: /* LEFT DOUBLE QUOTATION MARK */
|
||||
case 0x201D: /* RIGHT DOUBLE QUOTATION MARK */
|
||||
case 0x201F: /* DOUBLE HIGH-REVERSED-9 QUOTATION MARK */
|
||||
case 0x301E: /* DOUBLE PRIME QUOTATION MARK */
|
||||
case 0xFF02: /* FULLWIDTH QUOTATION MARK */
|
||||
case 0xFF07: /* FULLWIDTH APOSTROPHE */
|
||||
xsignal2 (Qinvalid_read_syntax, build_string ("strange quote"),
|
||||
CALLN (Fstring, make_number (ch)));
|
||||
}
|
||||
}
|
||||
{
|
||||
Lisp_Object result;
|
||||
ptrdiff_t nbytes = p - read_buffer;
|
||||
|
|
|
@ -142,6 +142,23 @@ literals (Bug#20852)."
|
|||
"unescaped character literals "
|
||||
"`?\"', `?(', `?)', `?;', `?[', `?]' detected!")))))
|
||||
|
||||
(ert-deftest lread-tests--funny-quote-symbols ()
|
||||
"Check that 'smart quotes' or similar trigger errors in symbol names."
|
||||
(dolist (quote-char
|
||||
'(#x2018 ;; LEFT SINGLE QUOTATION MARK
|
||||
#x2019 ;; RIGHT SINGLE QUOTATION MARK
|
||||
#x201B ;; SINGLE HIGH-REVERSED-9 QUOTATION MARK
|
||||
#x201C ;; LEFT DOUBLE QUOTATION MARK
|
||||
#x201D ;; RIGHT DOUBLE QUOTATION MARK
|
||||
#x201F ;; DOUBLE HIGH-REVERSED-9 QUOTATION MARK
|
||||
#x301E ;; DOUBLE PRIME QUOTATION MARK
|
||||
#xFF02 ;; FULLWIDTH QUOTATION MARK
|
||||
#xFF07 ;; FULLWIDTH APOSTROPHE
|
||||
))
|
||||
(let ((str (format "%cfoo" quote-char)))
|
||||
(should-error (read str) :type 'invalid-read-syntax)
|
||||
(should (eq (read (concat "\\" str)) (intern str))))))
|
||||
|
||||
(ert-deftest lread-test-bug26837 ()
|
||||
"Test for http://debbugs.gnu.org/26837 ."
|
||||
(let ((load-path (cons
|
||||
|
|
Loading…
Add table
Reference in a new issue