diff -r 643b332465d7 Grammar/Grammar --- a/Grammar/Grammar Tue Aug 04 22:51:39 2015 -0500 +++ b/Grammar/Grammar Wed Aug 05 00:36:45 2015 -0400 @@ -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 -r 643b332465d7 Lib/test/test_grammar.py --- a/Lib/test/test_grammar.py Tue Aug 04 22:51:39 2015 -0500 +++ b/Lib/test/test_grammar.py Wed Aug 05 00:36:45 2015 -0400 @@ -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 -r 643b332465d7 Modules/parsermodule.c --- a/Modules/parsermodule.c Tue Aug 04 22:51:39 2015 -0500 +++ b/Modules/parsermodule.c Wed Aug 05 00:36:45 2015 -0400 @@ -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 -r 643b332465d7 Python/ast.c --- a/Python/ast.c Tue Aug 04 22:51:39 2015 -0500 +++ b/Python/ast.c Wed Aug 05 00:36:45 2015 -0400 @@ -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 { + ast_error(c, chch, + "positional argument follows " + "keyword argument"); + } + return NULL; } - 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); - 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) { /* a keyword argument unpacking */ diff -r 643b332465d7 Python/graminit.c --- a/Python/graminit.c Tue Aug 04 22:51:39 2015 -0500 +++ b/Python/graminit.c Wed Aug 05 00:36:45 2015 -0400 @@ -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},