bpo-44368: Ensure we don't raise incorrect custom syntax errors with soft keywords (GH-26630)

This commit is contained in:
Pablo Galindo 2021-06-09 22:20:01 +01:00 committed by GitHub
parent 878d7e4ee4
commit 457ce60fc7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 5 deletions

View File

@ -215,6 +215,7 @@ class ExceptionTests(unittest.TestCase):
check('[\nfile\nfor str(file)\nin\n[]\n]', 3, 5) check('[\nfile\nfor str(file)\nin\n[]\n]', 3, 5)
check('[file for\n str(file) in []]', 2, 2) check('[file for\n str(file) in []]', 2, 2)
check("ages = {'Alice'=22, 'Bob'=23}", 1, 16) check("ages = {'Alice'=22, 'Bob'=23}", 1, 16)
check('match ...:\n case {**rest, "key": value}:\n ...', 2, 19)
# Errors thrown by compile.c # Errors thrown by compile.c
check('class foo:return 1', 1, 11) check('class foo:return 1', 1, 11)

View File

@ -267,7 +267,7 @@ Traceback (most recent call last):
SyntaxError: invalid syntax. Perhaps you forgot a comma? SyntaxError: invalid syntax. Perhaps you forgot a comma?
# Make sure soft keywords constructs don't raise specialized # Make sure soft keywords constructs don't raise specialized
# errors regarding missing commas # errors regarding missing commas or other spezialiced errors
>>> match x: >>> match x:
... y = 3 ... y = 3
@ -280,6 +280,24 @@ SyntaxError: invalid syntax
Traceback (most recent call last): Traceback (most recent call last):
SyntaxError: invalid syntax SyntaxError: invalid syntax
>>> match x:
... case $:
... ...
Traceback (most recent call last):
SyntaxError: invalid syntax
>>> match ...:
... case {**rest, "key": value}:
... ...
Traceback (most recent call last):
SyntaxError: invalid syntax
>>> match ...:
... case {**_}:
... ...
Traceback (most recent call last):
SyntaxError: invalid syntax
From compiler_complex_args(): From compiler_complex_args():
>>> def f(None=1): >>> def f(None=1):

View File

@ -936,10 +936,9 @@ _PyPegen_get_last_nonnwhitespace_token(Parser *p)
return token; return token;
} }
expr_ty static expr_ty
_PyPegen_name_token(Parser *p) _PyPegen_name_from_token(Parser *p, Token* t)
{ {
Token *t = _PyPegen_expect_token(p, NAME);
if (t == NULL) { if (t == NULL) {
return NULL; return NULL;
} }
@ -957,6 +956,14 @@ _PyPegen_name_token(Parser *p)
t->end_col_offset, p->arena); t->end_col_offset, p->arena);
} }
expr_ty
_PyPegen_name_token(Parser *p)
{
Token *t = _PyPegen_expect_token(p, NAME);
return _PyPegen_name_from_token(p, t);
}
void * void *
_PyPegen_string_token(Parser *p) _PyPegen_string_token(Parser *p)
{ {
@ -974,7 +981,7 @@ expr_ty _PyPegen_soft_keyword_token(Parser *p) {
PyBytes_AsStringAndSize(t->bytes, &the_token, &size); PyBytes_AsStringAndSize(t->bytes, &the_token, &size);
for (char **keyword = p->soft_keywords; *keyword != NULL; keyword++) { for (char **keyword = p->soft_keywords; *keyword != NULL; keyword++) {
if (strncmp(*keyword, the_token, size) == 0) { if (strncmp(*keyword, the_token, size) == 0) {
return _PyPegen_name_token(p); return _PyPegen_name_from_token(p, t);
} }
} }
return NULL; return NULL;