Issue #24791: Fix grammar regression for call syntax: 'g(*a or b)'.
diff --git a/Grammar/Grammar b/Grammar/Grammar
index 86ec432..99fcea0 100644
--- a/Grammar/Grammar
+++ b/Grammar/Grammar
@@ -137,7 +137,7 @@
argument: ( test [comp_for] |
test '=' test |
'**' test |
- star_expr )
+ '*' test )
comp_iter: comp_for | comp_if
comp_for: 'for' exprlist 'in' or_test [comp_iter]
diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py
index 8f0cf16..ec3d783 100644
--- a/Lib/test/test_grammar.py
+++ b/Lib/test/test_grammar.py
@@ -205,6 +205,8 @@
d01()
d01(1)
d01(*(1,))
+ d01(*[] or [2])
+ d01(*() or (), *{} and (), **() or {})
d01(**{'a':2})
d01(**{'a':2} or {})
def d11(a, b=1): pass
diff --git a/Misc/NEWS b/Misc/NEWS
index 11e1996..56e61e2 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -40,6 +40,8 @@
- Issue #23812: Fix asyncio.Queue.get() to avoid loosing items on cancellation.
Patch by Gustavo J. A. M. Carneiro.
+- Issue #24791: Fix grammar regression for call syntax: 'g(*a or b)'.
+
Documentation
-------------
diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c
index 2a16dba..8023558 100644
--- a/Modules/parsermodule.c
+++ b/Modules/parsermodule.c
@@ -2859,8 +2859,8 @@
/* argument: ( test [comp_for] |
* test '=' test |
- * '**' expr |
- * star_expr )
+ * '**' test |
+ * '*' test )
*/
static int
validate_argument(node *tree)
@@ -2873,8 +2873,11 @@
if (TYPE(CHILD(tree, 0)) == DOUBLESTAR) {
res = validate_test(CHILD(tree, 1));
}
+ else if (TYPE(CHILD(tree, 0)) == STAR) {
+ res = validate_test(CHILD(tree, 1));
+ }
else if (nch == 1) {
- res = validate_test_or_star_expr(CHILD(tree, 0));
+ res = validate_test(CHILD(tree, 0));
}
else if (nch == 2) {
res = (validate_test(CHILD(tree, 0))
diff --git a/Python/ast.c b/Python/ast.c
index bb28437..b572088 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -2664,45 +2664,44 @@
expr_ty e;
node *chch = CHILD(ch, 0);
if (NCH(ch) == 1) {
- if (TYPE(chch) == star_expr) {
- /* an iterable argument unpacking */
- expr_ty starred;
+ /* a positional argument */
+ if (nkeywords) {
if (ndoublestars) {
ast_error(c, chch,
- "iterable argument unpacking follows "
+ "positional argument follows "
"keyword argument unpacking");
- return NULL;
}
- e = ast_for_expr(c, CHILD(chch, 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 {
- /* 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;
+ else {
+ ast_error(c, chch,
+ "positional argument follows "
+ "keyword argument");
}
- e = ast_for_expr(c, chch);
- if (!e)
- return NULL;
- asdl_seq_SET(args, nargs++, e);
+ return NULL;
}
+ 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) {
/* a keyword argument unpacking */
diff --git a/Python/graminit.c b/Python/graminit.c
index 14ac24f..8212b2a 100644
--- a/Python/graminit.c
+++ b/Python/graminit.c
@@ -1744,7 +1744,7 @@
static arc arcs_78_0[3] = {
{26, 1},
{34, 2},
- {50, 3},
+ {33, 2},
};
static arc arcs_78_1[3] = {
{164, 3},