bpo-40631: Disallow single parenthesized star target (GH-24027)
This commit is contained in:
parent
8f8de7380c
commit
2ea320dddd
|
@ -580,18 +580,23 @@ star_targets[expr_ty]:
|
||||||
| a=star_target !',' { a }
|
| a=star_target !',' { a }
|
||||||
| a=star_target b=(',' c=star_target { c })* [','] {
|
| a=star_target b=(',' c=star_target { c })* [','] {
|
||||||
_Py_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Store, EXTRA) }
|
_Py_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Store, EXTRA) }
|
||||||
star_targets_seq[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_target+ [','] { a }
|
star_targets_list_seq[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_target+ [','] { a }
|
||||||
|
star_targets_tuple_seq[asdl_expr_seq*]:
|
||||||
|
| a=star_target b=(',' c=star_target { c })+ [','] { (asdl_expr_seq*) _PyPegen_seq_insert_in_front(p, a, b) }
|
||||||
|
| a=star_target ',' { (asdl_expr_seq*) _PyPegen_singleton_seq(p, a) }
|
||||||
star_target[expr_ty] (memo):
|
star_target[expr_ty] (memo):
|
||||||
| '*' a=(!'*' star_target) {
|
| '*' a=(!'*' star_target) {
|
||||||
_Py_Starred(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), Store, EXTRA) }
|
_Py_Starred(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), Store, EXTRA) }
|
||||||
|
| target_with_star_atom
|
||||||
|
target_with_star_atom[expr_ty] (memo):
|
||||||
| a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Store, EXTRA) }
|
| a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Store, EXTRA) }
|
||||||
| a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Store, EXTRA) }
|
| a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Store, EXTRA) }
|
||||||
| star_atom
|
| star_atom
|
||||||
star_atom[expr_ty]:
|
star_atom[expr_ty]:
|
||||||
| a=NAME { _PyPegen_set_expr_context(p, a, Store) }
|
| a=NAME { _PyPegen_set_expr_context(p, a, Store) }
|
||||||
| '(' a=star_target ')' { _PyPegen_set_expr_context(p, a, Store) }
|
| '(' a=target_with_star_atom ')' { _PyPegen_set_expr_context(p, a, Store) }
|
||||||
| '(' a=[star_targets_seq] ')' { _Py_Tuple(a, Store, EXTRA) }
|
| '(' a=[star_targets_tuple_seq] ')' { _Py_Tuple(a, Store, EXTRA) }
|
||||||
| '[' a=[star_targets_seq] ']' { _Py_List(a, Store, EXTRA) }
|
| '[' a=[star_targets_list_seq] ']' { _Py_List(a, Store, EXTRA) }
|
||||||
|
|
||||||
single_target[expr_ty]:
|
single_target[expr_ty]:
|
||||||
| single_subscript_attribute_target
|
| single_subscript_attribute_target
|
||||||
|
|
|
@ -346,6 +346,31 @@ Now some general starred expressions (all fail).
|
||||||
...
|
...
|
||||||
SyntaxError: can't use starred expression here
|
SyntaxError: can't use starred expression here
|
||||||
|
|
||||||
|
>>> (*x),y = 1, 2 # doctest:+ELLIPSIS
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
SyntaxError: can't use starred expression here
|
||||||
|
|
||||||
|
>>> (((*x))),y = 1, 2 # doctest:+ELLIPSIS
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
SyntaxError: can't use starred expression here
|
||||||
|
|
||||||
|
>>> z,(*x),y = 1, 2, 4 # doctest:+ELLIPSIS
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
SyntaxError: can't use starred expression here
|
||||||
|
|
||||||
|
>>> z,(*x) = 1, 2 # doctest:+ELLIPSIS
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
SyntaxError: can't use starred expression here
|
||||||
|
|
||||||
|
>>> ((*x),y) = 1, 2 # doctest:+ELLIPSIS
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
SyntaxError: can't use starred expression here
|
||||||
|
|
||||||
Some size constraints (all fail.)
|
Some size constraints (all fail.)
|
||||||
|
|
||||||
>>> s = ", ".join("a%d" % i for i in range(1<<8)) + ", *rest = range(1<<8 + 1)"
|
>>> s = ", ".join("a%d" % i for i in range(1<<8)) + ", *rest = range(1<<8 + 1)"
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix regression where a single parenthesized starred expression was a valid
|
||||||
|
assignment target.
|
1639
Parser/parser.c
1639
Parser/parser.c
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue