From 37c0844b35b9a4d68f7ddf3a8b38d3e013f17d78 Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Fri, 21 Oct 2005 06:24:02 +0000 Subject: [PATCH] Fix SF bug #1167751, Argument genexp corner case Incorrect code was generated for: foo(a = i for i in range(10)) This should have generated a SyntaxError. Fix the Grammar so it raises a SyntaxError and test it. I'm uncertain whether this should be backported. It makes something that was Syntactically valid invalid. However, the code would either be completely broken or do the wrong thing. --- Grammar/Grammar | 2 +- Lib/test/test_genexps.py | 16 ++++++++++++++-- Python/graminit.c | 22 +++++++++++++++------- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/Grammar/Grammar b/Grammar/Grammar index 01e4afd6fc7..d8106e97196 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 894ce6a15a7..7af3ac34355 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 @@ -125,12 +137,12 @@ Verify that syntax error's are raised for genexps used as lvalues >>> (y for y in (1,2)) = 10 Traceback (most recent call last): ... - SyntaxError: assignment to generator expression not possible (, line 1) + SyntaxError: assignment to generator expression not possible (, line 1) >>> (y for y in (1,2)) += 10 Traceback (most recent call last): ... - SyntaxError: augmented assignment to generator expression not possible (, line 1) + SyntaxError: augmented assignment to generator expression not possible (, line 1) ########### Tests borrowed from or inspired by test_generators.py ############ diff --git a/Python/graminit.c b/Python/graminit.c index 91d20f2ad15..769532a16b6 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}, @@ -1806,7 +1814,7 @@ static dfa dfas[79] = { "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000"}, {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\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\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\000"},