From 373f0a718c359bc9e554ec323a9d71844ee76dfc Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Mon, 15 May 2006 07:04:36 +0000 Subject: - Bug #1487966: Fix SystemError with conditional expression in assignment Most of the test_syntax changes are just updating the numbers. --- Lib/test/test_syntax.py | 35 +++++++++++++++++++---------------- Misc/ACKS | 1 + Misc/NEWS | 2 ++ Python/ast.c | 3 +++ 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index ce2e327..9d3ff02 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -86,13 +86,16 @@ SyntaxError: can't assign to literal (, line 1) Traceback (most recent call last): SyntaxError: can't assign to operator (, line 1) +>>> a if 1 else b = 1 +Traceback (most recent call last): +SyntaxError: can't assign to conditional expression (, line 1) From compiler_complex_args(): >>> def f(None=1): ... pass Traceback (most recent call last): -SyntaxError: assignment to None (, line 1) +SyntaxError: assignment to None (, line 1) From ast_for_arguments(): @@ -100,22 +103,22 @@ From ast_for_arguments(): >>> def f(x, y=1, z): ... pass Traceback (most recent call last): -SyntaxError: non-default argument follows default argument (, line 1) +SyntaxError: non-default argument follows default argument (, line 1) >>> def f(x, None): ... pass Traceback (most recent call last): -SyntaxError: assignment to None (, line 1) +SyntaxError: assignment to None (, line 1) >>> def f(*None): ... pass Traceback (most recent call last): -SyntaxError: assignment to None (, line 1) +SyntaxError: assignment to None (, line 1) >>> def f(**None): ... pass Traceback (most recent call last): -SyntaxError: assignment to None (, line 1) +SyntaxError: assignment to None (, line 1) From ast_for_funcdef(): @@ -123,7 +126,7 @@ From ast_for_funcdef(): >>> def None(x): ... pass Traceback (most recent call last): -SyntaxError: assignment to None (, line 1) +SyntaxError: assignment to None (, line 1) From ast_for_call(): @@ -135,7 +138,7 @@ From ast_for_call(): [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> f(x for x in L, 1) Traceback (most recent call last): -SyntaxError: Generator expression must be parenthesized if not sole argument (, line 1) +SyntaxError: Generator expression must be parenthesized if not sole argument (, line 1) >>> f((x for x in L), 1) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] @@ -167,7 +170,7 @@ SyntaxError: Generator expression must be parenthesized if not sole argument (, line 1) +SyntaxError: more than 255 arguments (, line 1) The actual error cases counts positional arguments, keyword arguments, and generator expression arguments separately. This test combines the @@ -201,37 +204,37 @@ three. ... (x for x in i244), i245, i246, i247, i248, i249, i250, i251, ... i252=1, i253=1, i254=1, i255=1) Traceback (most recent call last): -SyntaxError: more than 255 arguments (, line 1) +SyntaxError: more than 255 arguments (, line 1) >>> f(lambda x: x[0] = 3) Traceback (most recent call last): -SyntaxError: lambda cannot contain assignment (, line 1) +SyntaxError: lambda cannot contain assignment (, line 1) The grammar accepts any test (basically, any expression) in the keyword slot of a call site. Test a few different options. >>> f(x()=2) Traceback (most recent call last): -SyntaxError: keyword can't be an expression (, line 1) +SyntaxError: keyword can't be an expression (, line 1) >>> f(a or b=1) Traceback (most recent call last): -SyntaxError: keyword can't be an expression (, line 1) +SyntaxError: keyword can't be an expression (, line 1) >>> f(x.y=1) Traceback (most recent call last): -SyntaxError: keyword can't be an expression (, line 1) +SyntaxError: keyword can't be an expression (, line 1) From ast_for_expr_stmt(): >>> (x for x in x) += 1 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) >>> None += 1 Traceback (most recent call last): -SyntaxError: assignment to None (, line 1) +SyntaxError: assignment to None (, line 1) >>> f() += 1 Traceback (most recent call last): -SyntaxError: illegal expression for augmented assignment (, line 1) +SyntaxError: illegal expression for augmented assignment (, line 1) """ import re diff --git a/Misc/ACKS b/Misc/ACKS index f1caf97..248c433 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -547,6 +547,7 @@ Dietmar Schwertberger Barry Scott Steven Scott Nick Seidenman +Žiga Seilnach Fred Sells Jiwon Seo Denis Severson diff --git a/Misc/NEWS b/Misc/NEWS index f37ed76..c8d64cd 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,8 @@ What's New in Python 2.5 alpha 3? Core and builtins ----------------- +- Bug #1487966: Fix SystemError with conditional expression in assignment + - WindowsError now has two error code attributes: errno, which carries the error values from errno.h, and winerror, which carries the error values from winerror.h. Previous versions put the winerror.h values diff --git a/Python/ast.c b/Python/ast.c index 353514c..fafa253 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -401,6 +401,9 @@ set_context(expr_ty e, expr_context_ty ctx, const node *n) case Repr_kind: expr_name = "repr"; break; + case IfExp_kind: + expr_name = "conditional expression"; + break; default: PyErr_Format(PyExc_SystemError, "unexpected expression in assignment %d (line %d)", -- cgit v0.12