summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2022-02-22 07:51:51 (GMT)
committerGitHub <noreply@github.com>2022-02-22 07:51:51 (GMT)
commit090e5c4b946b28f50fce445916c5d3ec45c8f45f (patch)
tree986dba79c0c56cdedf02de47aac01dcfd15860de
parent74127b89a8224d021fc76f679422b76510844ff9 (diff)
downloadcpython-090e5c4b946b28f50fce445916c5d3ec45c8f45f.zip
cpython-090e5c4b946b28f50fce445916c5d3ec45c8f45f.tar.gz
cpython-090e5c4b946b28f50fce445916c5d3ec45c8f45f.tar.bz2
bpo-46820: Fix a SyntaxError in a numeric literal followed by "not in" (GH-31479)
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.
-rw-r--r--Lib/test/test_grammar.py9
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2022-02-21-21-55-23.bpo-46820.4RfUZh.rst3
-rw-r--r--Parser/tokenizer.c3
3 files changed, 15 insertions, 0 deletions
diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py
index a2460ad..3f5a91a 100644
--- a/Lib/test/test_grammar.py
+++ b/Lib/test/test_grammar.py
@@ -251,6 +251,15 @@ class TokenTests(unittest.TestCase):
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 0000000..117a84d
--- /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 b14506a..6698d35 100644
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -1253,6 +1253,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)) {