]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fix SF bug #1167751, Argument genexp corner case
authorNeal Norwitz <nnorwitz@gmail.com>
Fri, 21 Oct 2005 06:24:02 +0000 (06:24 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Fri, 21 Oct 2005 06:24:02 +0000 (06:24 +0000)
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
Lib/test/test_genexps.py
Python/graminit.c

index 01e4afd6fc7c679407e559751cb7cac1afa4a9c0..d8106e971967b744fc1bb82585a7b297462a0629 100644 (file)
@@ -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]
index 894ce6a15a706ef3cfed95ce72c2ad3990b67646..7af3ac343557fa642f7ac72bb57a55b84479a811 100644 (file)
@@ -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': <generator object at ...>}
+
 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 (<doctest test.test_genexps.__test__.doctests[38]>, line 1)
+    SyntaxError: assignment to generator expression not possible (<doctest test.test_genexps.__test__.doctests[40]>, line 1)
 
     >>> (y for y in (1,2)) += 10
     Traceback (most recent call last):
        ...
-    SyntaxError: augmented assignment to generator expression not possible (<doctest test.test_genexps.__test__.doctests[39]>, line 1)
+    SyntaxError: augmented assignment to generator expression not possible (<doctest test.test_genexps.__test__.doctests[41]>, line 1)
 
 
 ########### Tests borrowed from or inspired by test_generators.py ############
index 91d20f2ad1509c3a93ee541090d12442fa5232e2..769532a16b65dd4c75ec9967aaa5e375feb8a992 100644 (file)
@@ -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"},