From ecea1217541573ef327aebdc2bee9c997b9f7288 Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Sun, 23 Oct 2005 00:44:03 +0000 Subject: Backport: SF bug #1167751: fix incorrect code being for generator expressions. --- Grammar/Grammar | 2 +- Lib/test/test_genexps.py | 12 ++++++++++++ Misc/NEWS | 3 +++ Python/graminit.c | 22 +++++++++++++++------- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/Grammar/Grammar b/Grammar/Grammar index 9e4dad8..b99f8ad 100644 --- a/Grammar/Grammar +++ b/Grammar/Grammar @@ -102,7 +102,7 @@ dictmaker: test ':' test (',' test ':' test)* [','] classdef: 'class' NAME ['(' testlist ')'] ':' suite arglist: (argument ',')* (argument [',']| '*' test [',' '**' test] | '**' test) -argument: [test '='] test [gen_for] # Really [keyword '='] test +argument: test [gen_for] | test '=' test ['(' gen_for ')'] # Really [keyword '='] test list_iter: list_for | list_if list_for: 'for' exprlist 'in' testlist_safe [list_iter] diff --git a/Lib/test/test_genexps.py b/Lib/test/test_genexps.py index 04694f8..5cd12bc 100644 --- a/Lib/test/test_genexps.py +++ b/Lib/test/test_genexps.py @@ -82,6 +82,18 @@ Verify that parenthesis are required in a statement ... SyntaxError: invalid syntax +Verify that parenthesis are required when used as a keyword argument value + + >>> dict(a = i for i in xrange(10)) + Traceback (most recent call last): + ... + SyntaxError: invalid syntax + +Verify that parenthesis are required when used as a keyword argument value + + >>> dict(a = (i for i in xrange(10))) #doctest: +ELLIPSIS + {'a': } + Verify early binding for the outermost for-expression >>> x=10 diff --git a/Misc/NEWS b/Misc/NEWS index 84ee619..ab43a0c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.4.3c1? Core and builtins ----------------- +- SF bug #1167751: fix incorrect code being for generator expressions. + The following code now raises a SyntaxError: foo(a = i for i in range(10)) + - SF Bug #976608: fix SystemError when mtime of an imported file is -1. - SF Bug #887946: fix segfault when redirecting stdin from a directory. diff --git a/Python/graminit.c b/Python/graminit.c index c4fe661..c37bdc0 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -1496,26 +1496,34 @@ static arc arcs_69_0[1] = { {26, 1}, }; static arc arcs_69_1[3] = { - {25, 2}, - {147, 3}, + {147, 2}, + {25, 3}, {0, 1}, }; static arc arcs_69_2[1] = { - {26, 4}, + {0, 2}, }; static arc arcs_69_3[1] = { - {0, 3}, + {26, 4}, }; static arc arcs_69_4[2] = { - {147, 3}, + {13, 5}, {0, 4}, }; -static state states_69[5] = { +static arc arcs_69_5[1] = { + {147, 6}, +}; +static arc arcs_69_6[1] = { + {15, 2}, +}; +static state states_69[7] = { {1, arcs_69_0}, {3, arcs_69_1}, {1, arcs_69_2}, {1, arcs_69_3}, {2, arcs_69_4}, + {1, arcs_69_5}, + {1, arcs_69_6}, }; static arc arcs_70_0[2] = { {146, 1}, @@ -1791,7 +1799,7 @@ static dfa dfas[78] = { "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002"}, {324, "arglist", 0, 8, states_68, "\000\040\010\060\000\000\000\000\000\000\000\000\000\002\000\140\010\111\023\000"}, - {325, "argument", 0, 5, states_69, + {325, "argument", 0, 7, states_69, "\000\040\010\000\000\000\000\000\000\000\000\000\000\002\000\140\010\111\023\000"}, {326, "list_iter", 0, 2, states_70, "\000\000\000\000\000\000\000\000\000\000\000\042\000\000\000\000\000\000\000\000"}, -- cgit v0.12