mirror of
https://github.com/python/cpython
synced 2026-09-29 12:10:30 +03:00
bpo-40618: Disallow invalid targets in augassign and except clauses (GH-20083)
This commit fixes the new parser to disallow invalid targets in the following scenarios: - Augmented assignments must only accept a single target (Name, Attribute or Subscript), but no tuples or lists. - `except` clauses should only accept a single `Name` as a target. Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
This commit is contained in:
parent
bcc3036095
commit
ce21cfca7b
5 changed files with 82 additions and 46 deletions
|
|
@ -199,8 +199,8 @@ static KeywordToken *reserved_keywords[] = {
|
|||
#define star_targets_seq_type 1128
|
||||
#define star_target_type 1129
|
||||
#define star_atom_type 1130
|
||||
#define inside_paren_ann_assign_target_type 1131
|
||||
#define ann_assign_subscript_attribute_target_type 1132
|
||||
#define single_target_type 1131
|
||||
#define single_subscript_attribute_target_type 1132
|
||||
#define del_targets_type 1133
|
||||
#define del_target_type 1134
|
||||
#define del_t_atom_type 1135
|
||||
|
|
@ -501,8 +501,8 @@ static expr_ty star_targets_rule(Parser *p);
|
|||
static asdl_seq* star_targets_seq_rule(Parser *p);
|
||||
static expr_ty star_target_rule(Parser *p);
|
||||
static expr_ty star_atom_rule(Parser *p);
|
||||
static expr_ty inside_paren_ann_assign_target_rule(Parser *p);
|
||||
static expr_ty ann_assign_subscript_attribute_target_rule(Parser *p);
|
||||
static expr_ty single_target_rule(Parser *p);
|
||||
static expr_ty single_subscript_attribute_target_rule(Parser *p);
|
||||
static asdl_seq* del_targets_rule(Parser *p);
|
||||
static expr_ty del_target_rule(Parser *p);
|
||||
static expr_ty del_t_atom_rule(Parser *p);
|
||||
|
|
@ -1590,9 +1590,9 @@ compound_stmt_rule(Parser *p)
|
|||
|
||||
// assignment:
|
||||
// | NAME ':' expression ['=' annotated_rhs]
|
||||
// | ('(' inside_paren_ann_assign_target ')' | ann_assign_subscript_attribute_target) ':' expression ['=' annotated_rhs]
|
||||
// | ('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs]
|
||||
// | ((star_targets '='))+ (yield_expr | star_expressions) TYPE_COMMENT?
|
||||
// | target augassign (yield_expr | star_expressions)
|
||||
// | single_target augassign (yield_expr | star_expressions)
|
||||
// | invalid_assignment
|
||||
static stmt_ty
|
||||
assignment_rule(Parser *p)
|
||||
|
|
@ -1642,13 +1642,13 @@ assignment_rule(Parser *p)
|
|||
}
|
||||
p->mark = _mark;
|
||||
}
|
||||
{ // ('(' inside_paren_ann_assign_target ')' | ann_assign_subscript_attribute_target) ':' expression ['=' annotated_rhs]
|
||||
{ // ('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs]
|
||||
Token * _literal;
|
||||
void *a;
|
||||
expr_ty b;
|
||||
void *c;
|
||||
if (
|
||||
(a = _tmp_20_rule(p)) // '(' inside_paren_ann_assign_target ')' | ann_assign_subscript_attribute_target
|
||||
(a = _tmp_20_rule(p)) // '(' single_target ')' | single_subscript_attribute_target
|
||||
&&
|
||||
(_literal = _PyPegen_expect_token(p, 11)) // token=':'
|
||||
&&
|
||||
|
|
@ -1703,12 +1703,12 @@ assignment_rule(Parser *p)
|
|||
}
|
||||
p->mark = _mark;
|
||||
}
|
||||
{ // target augassign (yield_expr | star_expressions)
|
||||
{ // single_target augassign (yield_expr | star_expressions)
|
||||
expr_ty a;
|
||||
AugOperator* b;
|
||||
void *c;
|
||||
if (
|
||||
(a = target_rule(p)) // target
|
||||
(a = single_target_rule(p)) // single_target
|
||||
&&
|
||||
(b = augassign_rule(p)) // augassign
|
||||
&&
|
||||
|
|
@ -3350,7 +3350,7 @@ try_stmt_rule(Parser *p)
|
|||
return _res;
|
||||
}
|
||||
|
||||
// except_block: 'except' expression ['as' target] ':' block | 'except' ':' block
|
||||
// except_block: 'except' expression ['as' NAME] ':' block | 'except' ':' block
|
||||
static excepthandler_ty
|
||||
except_block_rule(Parser *p)
|
||||
{
|
||||
|
|
@ -3367,7 +3367,7 @@ except_block_rule(Parser *p)
|
|||
UNUSED(_start_lineno); // Only used by EXTRA macro
|
||||
int _start_col_offset = p->tokens[_mark]->col_offset;
|
||||
UNUSED(_start_col_offset); // Only used by EXTRA macro
|
||||
{ // 'except' expression ['as' target] ':' block
|
||||
{ // 'except' expression ['as' NAME] ':' block
|
||||
Token * _keyword;
|
||||
Token * _literal;
|
||||
asdl_seq* b;
|
||||
|
|
@ -3378,7 +3378,7 @@ except_block_rule(Parser *p)
|
|||
&&
|
||||
(e = expression_rule(p)) // expression
|
||||
&&
|
||||
(t = _tmp_48_rule(p), 1) // ['as' target]
|
||||
(t = _tmp_48_rule(p), 1) // ['as' NAME]
|
||||
&&
|
||||
(_literal = _PyPegen_expect_token(p, 11)) // token=':'
|
||||
&&
|
||||
|
|
@ -9605,25 +9605,22 @@ star_atom_rule(Parser *p)
|
|||
return _res;
|
||||
}
|
||||
|
||||
// inside_paren_ann_assign_target:
|
||||
// | ann_assign_subscript_attribute_target
|
||||
// | NAME
|
||||
// | '(' inside_paren_ann_assign_target ')'
|
||||
// single_target: single_subscript_attribute_target | NAME | '(' single_target ')'
|
||||
static expr_ty
|
||||
inside_paren_ann_assign_target_rule(Parser *p)
|
||||
single_target_rule(Parser *p)
|
||||
{
|
||||
if (p->error_indicator) {
|
||||
return NULL;
|
||||
}
|
||||
expr_ty _res = NULL;
|
||||
int _mark = p->mark;
|
||||
{ // ann_assign_subscript_attribute_target
|
||||
expr_ty ann_assign_subscript_attribute_target_var;
|
||||
{ // single_subscript_attribute_target
|
||||
expr_ty single_subscript_attribute_target_var;
|
||||
if (
|
||||
(ann_assign_subscript_attribute_target_var = ann_assign_subscript_attribute_target_rule(p)) // ann_assign_subscript_attribute_target
|
||||
(single_subscript_attribute_target_var = single_subscript_attribute_target_rule(p)) // single_subscript_attribute_target
|
||||
)
|
||||
{
|
||||
_res = ann_assign_subscript_attribute_target_var;
|
||||
_res = single_subscript_attribute_target_var;
|
||||
goto done;
|
||||
}
|
||||
p->mark = _mark;
|
||||
|
|
@ -9643,14 +9640,14 @@ inside_paren_ann_assign_target_rule(Parser *p)
|
|||
}
|
||||
p->mark = _mark;
|
||||
}
|
||||
{ // '(' inside_paren_ann_assign_target ')'
|
||||
{ // '(' single_target ')'
|
||||
Token * _literal;
|
||||
Token * _literal_1;
|
||||
expr_ty a;
|
||||
if (
|
||||
(_literal = _PyPegen_expect_token(p, 7)) // token='('
|
||||
&&
|
||||
(a = inside_paren_ann_assign_target_rule(p)) // inside_paren_ann_assign_target
|
||||
(a = single_target_rule(p)) // single_target
|
||||
&&
|
||||
(_literal_1 = _PyPegen_expect_token(p, 8)) // token=')'
|
||||
)
|
||||
|
|
@ -9669,11 +9666,11 @@ inside_paren_ann_assign_target_rule(Parser *p)
|
|||
return _res;
|
||||
}
|
||||
|
||||
// ann_assign_subscript_attribute_target:
|
||||
// single_subscript_attribute_target:
|
||||
// | t_primary '.' NAME !t_lookahead
|
||||
// | t_primary '[' slices ']' !t_lookahead
|
||||
static expr_ty
|
||||
ann_assign_subscript_attribute_target_rule(Parser *p)
|
||||
single_subscript_attribute_target_rule(Parser *p)
|
||||
{
|
||||
if (p->error_indicator) {
|
||||
return NULL;
|
||||
|
|
@ -11907,7 +11904,7 @@ _tmp_19_rule(Parser *p)
|
|||
return _res;
|
||||
}
|
||||
|
||||
// _tmp_20: '(' inside_paren_ann_assign_target ')' | ann_assign_subscript_attribute_target
|
||||
// _tmp_20: '(' single_target ')' | single_subscript_attribute_target
|
||||
static void *
|
||||
_tmp_20_rule(Parser *p)
|
||||
{
|
||||
|
|
@ -11916,14 +11913,14 @@ _tmp_20_rule(Parser *p)
|
|||
}
|
||||
void * _res = NULL;
|
||||
int _mark = p->mark;
|
||||
{ // '(' inside_paren_ann_assign_target ')'
|
||||
{ // '(' single_target ')'
|
||||
Token * _literal;
|
||||
Token * _literal_1;
|
||||
expr_ty b;
|
||||
if (
|
||||
(_literal = _PyPegen_expect_token(p, 7)) // token='('
|
||||
&&
|
||||
(b = inside_paren_ann_assign_target_rule(p)) // inside_paren_ann_assign_target
|
||||
(b = single_target_rule(p)) // single_target
|
||||
&&
|
||||
(_literal_1 = _PyPegen_expect_token(p, 8)) // token=')'
|
||||
)
|
||||
|
|
@ -11937,13 +11934,13 @@ _tmp_20_rule(Parser *p)
|
|||
}
|
||||
p->mark = _mark;
|
||||
}
|
||||
{ // ann_assign_subscript_attribute_target
|
||||
expr_ty ann_assign_subscript_attribute_target_var;
|
||||
{ // single_subscript_attribute_target
|
||||
expr_ty single_subscript_attribute_target_var;
|
||||
if (
|
||||
(ann_assign_subscript_attribute_target_var = ann_assign_subscript_attribute_target_rule(p)) // ann_assign_subscript_attribute_target
|
||||
(single_subscript_attribute_target_var = single_subscript_attribute_target_rule(p)) // single_subscript_attribute_target
|
||||
)
|
||||
{
|
||||
_res = ann_assign_subscript_attribute_target_var;
|
||||
_res = single_subscript_attribute_target_var;
|
||||
goto done;
|
||||
}
|
||||
p->mark = _mark;
|
||||
|
|
@ -13073,7 +13070,7 @@ _loop1_47_rule(Parser *p)
|
|||
return _seq;
|
||||
}
|
||||
|
||||
// _tmp_48: 'as' target
|
||||
// _tmp_48: 'as' NAME
|
||||
static void *
|
||||
_tmp_48_rule(Parser *p)
|
||||
{
|
||||
|
|
@ -13082,13 +13079,13 @@ _tmp_48_rule(Parser *p)
|
|||
}
|
||||
void * _res = NULL;
|
||||
int _mark = p->mark;
|
||||
{ // 'as' target
|
||||
{ // 'as' NAME
|
||||
Token * _keyword;
|
||||
expr_ty z;
|
||||
if (
|
||||
(_keyword = _PyPegen_expect_token(p, 531)) // token='as'
|
||||
&&
|
||||
(z = target_rule(p)) // target
|
||||
(z = _PyPegen_name_token(p)) // NAME
|
||||
)
|
||||
{
|
||||
_res = z;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue