Index: Python/ast.c =================================================================== --- Python/ast.c (revision 46757) +++ Python/ast.c (working copy) @@ -1430,10 +1430,18 @@ LINENO(n), n->n_col_offset, c->c_arena); } else { + int nch_n; REQ(CHILD(n, 0), LSQB); - REQ(CHILD(n, 2), RSQB); - n = CHILD(n, 1); - if (NCH(n) == 1) { + if (NCH(n) == 3) { + REQ(CHILD(n, 2), RSQB); + n = CHILD(n, 1); + nch_n = NCH(n); + } + else { + REQ(CHILD(n, 1), RSQB); + nch_n = 0; + } + if (nch_n == 1) { slice_ty slc = ast_for_slice(c, CHILD(n, 0)); if (!slc) return NULL; @@ -1450,10 +1458,10 @@ expr_ty e; bool simple = true; asdl_seq *slices, *elts; - slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + slices = asdl_seq_new((nch_n + 1) / 2, c->c_arena); if (!slices) return NULL; - for (j = 0; j < NCH(n); j += 2) { + for (j = 0; j < nch_n; j += 2) { slc = ast_for_slice(c, CHILD(n, j)); if (!slc) return NULL; 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")