Issue #24791: Fix grammar regression for call syntax: 'g(*a or b)'.
This commit is contained in:
parent
cedef652fa
commit
14acf5f41d
|
@ -137,7 +137,7 @@ arglist: argument (',' argument)* [',']
|
||||||
argument: ( test [comp_for] |
|
argument: ( test [comp_for] |
|
||||||
test '=' test |
|
test '=' test |
|
||||||
'**' test |
|
'**' test |
|
||||||
star_expr )
|
'*' test )
|
||||||
|
|
||||||
comp_iter: comp_for | comp_if
|
comp_iter: comp_for | comp_if
|
||||||
comp_for: 'for' exprlist 'in' or_test [comp_iter]
|
comp_for: 'for' exprlist 'in' or_test [comp_iter]
|
||||||
|
|
|
@ -205,6 +205,8 @@ class GrammarTests(unittest.TestCase):
|
||||||
d01()
|
d01()
|
||||||
d01(1)
|
d01(1)
|
||||||
d01(*(1,))
|
d01(*(1,))
|
||||||
|
d01(*[] or [2])
|
||||||
|
d01(*() or (), *{} and (), **() or {})
|
||||||
d01(**{'a':2})
|
d01(**{'a':2})
|
||||||
d01(**{'a':2} or {})
|
d01(**{'a':2} or {})
|
||||||
def d11(a, b=1): pass
|
def d11(a, b=1): pass
|
||||||
|
|
|
@ -40,6 +40,8 @@ Library
|
||||||
- Issue #23812: Fix asyncio.Queue.get() to avoid loosing items on cancellation.
|
- Issue #23812: Fix asyncio.Queue.get() to avoid loosing items on cancellation.
|
||||||
Patch by Gustavo J. A. M. Carneiro.
|
Patch by Gustavo J. A. M. Carneiro.
|
||||||
|
|
||||||
|
- Issue #24791: Fix grammar regression for call syntax: 'g(*a or b)'.
|
||||||
|
|
||||||
Documentation
|
Documentation
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
|
|
|
@ -2859,8 +2859,8 @@ validate_arglist(node *tree)
|
||||||
|
|
||||||
/* argument: ( test [comp_for] |
|
/* argument: ( test [comp_for] |
|
||||||
* test '=' test |
|
* test '=' test |
|
||||||
* '**' expr |
|
* '**' test |
|
||||||
* star_expr )
|
* '*' test )
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
validate_argument(node *tree)
|
validate_argument(node *tree)
|
||||||
|
@ -2873,8 +2873,11 @@ validate_argument(node *tree)
|
||||||
if (TYPE(CHILD(tree, 0)) == DOUBLESTAR) {
|
if (TYPE(CHILD(tree, 0)) == DOUBLESTAR) {
|
||||||
res = validate_test(CHILD(tree, 1));
|
res = validate_test(CHILD(tree, 1));
|
||||||
}
|
}
|
||||||
|
else if (TYPE(CHILD(tree, 0)) == STAR) {
|
||||||
|
res = validate_test(CHILD(tree, 1));
|
||||||
|
}
|
||||||
else if (nch == 1) {
|
else if (nch == 1) {
|
||||||
res = validate_test_or_star_expr(CHILD(tree, 0));
|
res = validate_test(CHILD(tree, 0));
|
||||||
}
|
}
|
||||||
else if (nch == 2) {
|
else if (nch == 2) {
|
||||||
res = (validate_test(CHILD(tree, 0))
|
res = (validate_test(CHILD(tree, 0))
|
||||||
|
|
65
Python/ast.c
65
Python/ast.c
|
@ -2664,45 +2664,44 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)
|
||||||
expr_ty e;
|
expr_ty e;
|
||||||
node *chch = CHILD(ch, 0);
|
node *chch = CHILD(ch, 0);
|
||||||
if (NCH(ch) == 1) {
|
if (NCH(ch) == 1) {
|
||||||
if (TYPE(chch) == star_expr) {
|
/* a positional argument */
|
||||||
/* an iterable argument unpacking */
|
if (nkeywords) {
|
||||||
expr_ty starred;
|
|
||||||
if (ndoublestars) {
|
if (ndoublestars) {
|
||||||
ast_error(c, chch,
|
ast_error(c, chch,
|
||||||
"iterable argument unpacking follows "
|
"positional argument follows "
|
||||||
"keyword argument unpacking");
|
"keyword argument unpacking");
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
e = ast_for_expr(c, CHILD(chch, 1));
|
else {
|
||||||
if (!e)
|
ast_error(c, chch,
|
||||||
return NULL;
|
"positional argument follows "
|
||||||
starred = Starred(e, Load, LINENO(chch),
|
"keyword argument");
|
||||||
chch->n_col_offset,
|
|
||||||
c->c_arena);
|
|
||||||
if (!starred)
|
|
||||||
return NULL;
|
|
||||||
asdl_seq_SET(args, nargs++, starred);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* a positional argument */
|
|
||||||
if (nkeywords) {
|
|
||||||
if (ndoublestars) {
|
|
||||||
ast_error(c, chch,
|
|
||||||
"positional argument follows "
|
|
||||||
"keyword argument unpacking");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ast_error(c, chch,
|
|
||||||
"positional argument follows "
|
|
||||||
"keyword argument");
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
e = ast_for_expr(c, chch);
|
return NULL;
|
||||||
if (!e)
|
|
||||||
return NULL;
|
|
||||||
asdl_seq_SET(args, nargs++, e);
|
|
||||||
}
|
}
|
||||||
|
e = ast_for_expr(c, chch);
|
||||||
|
if (!e)
|
||||||
|
return NULL;
|
||||||
|
asdl_seq_SET(args, nargs++, e);
|
||||||
|
}
|
||||||
|
else if (TYPE(chch) == STAR) {
|
||||||
|
/* an iterable argument unpacking */
|
||||||
|
expr_ty starred;
|
||||||
|
if (ndoublestars) {
|
||||||
|
ast_error(c, chch,
|
||||||
|
"iterable argument unpacking follows "
|
||||||
|
"keyword argument unpacking");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
e = ast_for_expr(c, CHILD(ch, 1));
|
||||||
|
if (!e)
|
||||||
|
return NULL;
|
||||||
|
starred = Starred(e, Load, LINENO(chch),
|
||||||
|
chch->n_col_offset,
|
||||||
|
c->c_arena);
|
||||||
|
if (!starred)
|
||||||
|
return NULL;
|
||||||
|
asdl_seq_SET(args, nargs++, starred);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (TYPE(chch) == DOUBLESTAR) {
|
else if (TYPE(chch) == DOUBLESTAR) {
|
||||||
/* a keyword argument unpacking */
|
/* a keyword argument unpacking */
|
||||||
|
|
|
@ -1744,7 +1744,7 @@ static state states_77[3] = {
|
||||||
static arc arcs_78_0[3] = {
|
static arc arcs_78_0[3] = {
|
||||||
{26, 1},
|
{26, 1},
|
||||||
{34, 2},
|
{34, 2},
|
||||||
{50, 3},
|
{33, 2},
|
||||||
};
|
};
|
||||||
static arc arcs_78_1[3] = {
|
static arc arcs_78_1[3] = {
|
||||||
{164, 3},
|
{164, 3},
|
||||||
|
|
Loading…
Reference in New Issue