Skip to content

Commit

Permalink
bpo-40903: Handle multiple '=' in invalid assignment rules in the PEG…
Browse files Browse the repository at this point in the history
… parser (GH-20697)

Automerge-Triggered-By: @pablogsal
  • Loading branch information
pablogsal committed Jun 8, 2020
1 parent 843c277 commit 9f49590
Show file tree
Hide file tree
Showing 5 changed files with 453 additions and 237 deletions.
5 changes: 3 additions & 2 deletions Grammar/python.gram
Expand Up @@ -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) }
Expand Down Expand Up @@ -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,
Expand Down
21 changes: 20 additions & 1 deletion Lib/test/test_syntax.py
Expand Up @@ -63,6 +63,10 @@
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
Expand Down Expand Up @@ -136,6 +140,18 @@
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
Expand All @@ -148,14 +164,17 @@
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):
... pass
Traceback (most recent call last):
SyntaxError: invalid syntax
From ast_for_arguments():
>>> def f(x, y=1, z):
Expand Down
@@ -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

0 comments on commit 9f49590

Please sign in to comment.