]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] gh-130077: Properly match full soft keywords in the parser (GH-135317) (#135348)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 11 Jun 2025 01:01:37 +0000 (03:01 +0200)
committerGitHub <noreply@github.com>
Wed, 11 Jun 2025 01:01:37 +0000 (02:01 +0100)
gh-130077: Properly match full soft keywords in the parser (GH-135317)
(cherry picked from commit ff2b5f40c2bf5c71255caac8a743c09ba0758c02)

Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>
Lib/test/test_syntax.py
Misc/NEWS.d/next/Core_and_Builtins/2025-06-09-23-57-37.gh-issue-130077.MHknDB.rst [new file with mode: 0644]
Parser/pegen.c

index fadafd9b3d3aead29dbd33294075530084a8eda3..2624588a41b1657ffd79fdef71d4d496b3f40cdc 100644 (file)
@@ -382,6 +382,13 @@ SyntaxError: invalid syntax
 Traceback (most recent call last):
 SyntaxError: invalid syntax
 
+# But prefixes of soft keywords should
+# still raise specialized errors
+
+>>> (mat x)
+Traceback (most recent call last):
+SyntaxError: invalid syntax. Perhaps you forgot a comma?
+
 From compiler_complex_args():
 
 >>> def f(None=1):
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-06-09-23-57-37.gh-issue-130077.MHknDB.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-06-09-23-57-37.gh-issue-130077.MHknDB.rst
new file mode 100644 (file)
index 0000000..a7d0242
--- /dev/null
@@ -0,0 +1,2 @@
+Properly raise custom syntax errors when incorrect syntax containing names
+that are prefixes of soft keywords is encountered.  Patch by Pablo Galindo.
index 0919ff417f19164af55ec2359ab96e2083514ff0..50641de27d37fdfd6abe6ccd5e492fb5b27a478c 100644 (file)
@@ -610,7 +610,8 @@ expr_ty _PyPegen_soft_keyword_token(Parser *p) {
     Py_ssize_t size;
     PyBytes_AsStringAndSize(t->bytes, &the_token, &size);
     for (char **keyword = p->soft_keywords; *keyword != NULL; keyword++) {
-        if (strncmp(*keyword, the_token, (size_t)size) == 0) {
+        if (strlen(*keyword) == (size_t)size &&
+            strncmp(*keyword, the_token, (size_t)size) == 0) {
             return _PyPegen_name_from_token(p, t);
         }
     }