[Python-checkins] bpo-46820: Fix a SyntaxError in a numeric literal followed by "not in" (GH-31479) (GH-31493)

serhiy-storchaka webhook-mailer at python.org
Tue Feb 22 05:00:55 EST 2022


https://github.com/python/cpython/commit/f20ac2ed076df63a77f65ff2660148af9f1a9b3c
commit: f20ac2ed076df63a77f65ff2660148af9f1a9b3c
branch: 3.10
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: serhiy-storchaka <storchaka at gmail.com>
date: 2022-02-22T12:00:50+02:00
summary:

bpo-46820: Fix a SyntaxError in a numeric literal followed by "not in" (GH-31479) (GH-31493)

Fix parsing a numeric literal immediately (without spaces) followed by
"not in" keywords, like in "1not in x". Now the parser only emits
a warning, not a syntax error.
(cherry picked from commit 090e5c4b946b28f50fce445916c5d3ec45c8f45f)

Co-authored-by: Serhiy Storchaka <storchaka at gmail.com>

files:
A Misc/NEWS.d/next/Core and Builtins/2022-02-21-21-55-23.bpo-46820.4RfUZh.rst
M Lib/test/test_grammar.py
M Parser/tokenizer.c

diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py
index b6c457465609a..9d473770f3b20 100644
--- a/Lib/test/test_grammar.py
+++ b/Lib/test/test_grammar.py
@@ -251,6 +251,15 @@ def check_error(test):
         check("1e3in x")
         check("1jin x")
 
+        check("0xfnot in x")
+        check("0o7not in x")
+        check("0b1not in x")
+        check("9not in x")
+        check("0not in x")
+        check("1.not in x")
+        check("1e3not in x")
+        check("1jnot in x")
+
         with warnings.catch_warnings():
             warnings.simplefilter('ignore', SyntaxWarning)
             check("0xfis x")
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-02-21-21-55-23.bpo-46820.4RfUZh.rst b/Misc/NEWS.d/next/Core and Builtins/2022-02-21-21-55-23.bpo-46820.4RfUZh.rst
new file mode 100644
index 0000000000000..117a84d0cbfaf
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-02-21-21-55-23.bpo-46820.4RfUZh.rst	
@@ -0,0 +1,3 @@
+Fix parsing a numeric literal immediately (without spaces) followed by "not
+in" keywords, like in ``1not in x``. Now the parser only emits a warning,
+not a syntax error.
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c
index eb15ef7a5d5f7..267ccec33fd77 100644
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -1251,6 +1251,9 @@ verify_end_of_number(struct tok_state *tok, int c, const char *kind)
     else if (c == 'o') {
         r = lookahead(tok, "r");
     }
+    else if (c == 'n') {
+        r = lookahead(tok, "ot");
+    }
     if (r) {
         tok_backup(tok, c);
         if (parser_warn(tok, "invalid %s literal", kind)) {



More information about the Python-checkins mailing list