Index: Python/ast.c =================================================================== --- Python/ast.c (revision 46757) +++ Python/ast.c (working copy) @@ -1431,6 +1431,20 @@ } else { REQ(CHILD(n, 0), LSQB); + if (NCH(n) == 2) { + /* Return a subscript with an empty Tuple */ + asdl_seq *elts; + expr_ty e; + REQ(CHILD(n, 1), RSQB); + elts = asdl_seq_new(0, c->c_arena); + if (!elts) + return NULL; + e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena); + if (!e) + return NULL; + return Subscript(left_expr, Index(e, c->c_arena), + Load, LINENO(n), n->n_col_offset, c->c_arena); + } REQ(CHILD(n, 2), RSQB); n = CHILD(n, 1); if (NCH(n) == 1) { Index: Grammar/Grammar =================================================================== --- Grammar/Grammar (revision 46757) +++ Grammar/Grammar (working copy) @@ -119,7 +119,7 @@ listmaker: test ( list_for | (',' test)* [','] ) testlist_gexp: test ( gen_for | (',' test)* [','] ) lambdef: 'lambda' [varargslist] ':' test -trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME +trailer: '(' [arglist] ')' | '[' [subscriptlist] ']' | '.' NAME subscriptlist: subscript (',' subscript)* [','] subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop] sliceop: ':' [test] Index: Modules/parsermodule.c =================================================================== --- Modules/parsermodule.c (revision 46757) +++ Modules/parsermodule.c (working copy) @@ -2713,7 +2713,7 @@ /* trailer: * - * '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME + * '(' [arglist] ')' | '[' [subscriptlist] ']' | '.' NAME */ static int validate_trailer(node *tree) @@ -2729,9 +2729,9 @@ res = validate_arglist(CHILD(tree, 1)); break; case LSQB: - res = (validate_numnodes(tree, 3, "trailer") - && validate_subscriptlist(CHILD(tree, 1)) - && validate_ntype(CHILD(tree, 2), RSQB)); + res = validate_ntype(CHILD(tree, nch - 1), RSQB); + if (res && (nch == 3)) + res = validate_subscriptlist(CHILD(tree, 1)); break; case DOT: res = (validate_numnodes(tree, 2, "trailer")