mirror of
https://github.com/python/cpython.git
synced 2024-11-27 11:55:13 +08:00
bpo-40903: Handle multiple '=' in invalid assignment rules in the PEG parser (GH-20697)
Automerge-Triggered-By: @pablogsal
This commit is contained in:
parent
843c277656
commit
9f495908c5
@ -92,7 +92,7 @@ assignment[stmt_ty]:
|
||||
| a=('(' b=single_target ')' { b }
|
||||
| single_subscript_attribute_target) ':' b=expression c=['=' d=annotated_rhs { d }] {
|
||||
CHECK_VERSION(6, "Variable annotations syntax is", _Py_AnnAssign(a, b, c, 0, EXTRA)) }
|
||||
| a=(z=star_targets '=' { z })+ b=(yield_expr | star_expressions) tc=[TYPE_COMMENT] {
|
||||
| a=(z=star_targets '=' { z })+ b=(yield_expr | star_expressions) !'=' tc=[TYPE_COMMENT] {
|
||||
_Py_Assign(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) }
|
||||
| a=single_target b=augassign c=(yield_expr | star_expressions) {
|
||||
_Py_AugAssign(a, b->kind, c, EXTRA) }
|
||||
@ -646,10 +646,11 @@ invalid_assignment:
|
||||
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "only single target (not tuple) can be annotated") }
|
||||
| a=expression ':' expression ['=' annotated_rhs] {
|
||||
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "illegal target for annotation") }
|
||||
| a=star_expressions '=' (yield_expr | star_expressions) {
|
||||
| (star_targets '=')* a=star_expressions '=' {
|
||||
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
|
||||
_PyPegen_get_invalid_target(a),
|
||||
"cannot assign to %s", _PyPegen_get_expr_name(_PyPegen_get_invalid_target(a))) }
|
||||
| (star_targets '=')* a=yield_expr '=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "assignment to yield expression not possible") }
|
||||
| a=star_expressions augassign (yield_expr | star_expressions) {
|
||||
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
|
||||
a,
|
||||
|
@ -63,6 +63,10 @@ SyntaxError: cannot assign to __debug__
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: cannot assign to function call
|
||||
|
||||
>>> yield = 1
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: assignment to yield expression not possible
|
||||
|
||||
>>> del f()
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: cannot delete function call
|
||||
@ -136,6 +140,18 @@ SyntaxError: cannot assign to operator
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: cannot assign to conditional expression
|
||||
|
||||
>>> True = True = 3
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: cannot assign to True
|
||||
|
||||
>>> x = y = True = z = 3
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: cannot assign to True
|
||||
|
||||
>>> x = y = yield = 1
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: assignment to yield expression not possible
|
||||
|
||||
>>> a, b += 1, 2
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: 'tuple' is an illegal expression for augmented assignment
|
||||
@ -148,6 +164,10 @@ SyntaxError: 'tuple' is an illegal expression for augmented assignment
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: 'list' is an illegal expression for augmented assignment
|
||||
|
||||
>>> p = p =
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: invalid syntax
|
||||
|
||||
From compiler_complex_args():
|
||||
|
||||
>>> def f(None=1):
|
||||
@ -155,7 +175,6 @@ From compiler_complex_args():
|
||||
Traceback (most recent call last):
|
||||
SyntaxError: invalid syntax
|
||||
|
||||
|
||||
From ast_for_arguments():
|
||||
|
||||
>>> def f(x, y=1, z):
|
||||
|
@ -0,0 +1 @@
|
||||
Fixed a possible segfault in the new PEG parser when producing error messages for invalid assignments of the form :code:`p=p=`. Patch by Pablo Galindo
|
File diff suppressed because it is too large
Load Diff
@ -161,6 +161,7 @@ byte_offset_to_character_offset(PyObject *line, int col_offset)
|
||||
const char *
|
||||
_PyPegen_get_expr_name(expr_ty e)
|
||||
{
|
||||
assert(e != NULL);
|
||||
switch (e->kind) {
|
||||
case Attribute_kind:
|
||||
return "attribute";
|
||||
|
Loading…
Reference in New Issue
Block a user