summaryrefslogtreecommitdiff
path: root/Python/ast.c
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2009-11-19 23:01:36 +0000
committerBenjamin Peterson <benjamin@python.org>2009-11-19 23:01:36 +0000
commit440847cf8e1f60c81e1ac1f722b6e7ad4c295acd (patch)
tree7a8ebdaebc42ef9c985745fb250ca48f81ba59c4 /Python/ast.c
parentaa4af333eca371f053ed238ddfc12f67441f431d (diff)
downloadcpython-git-440847cf8e1f60c81e1ac1f722b6e7ad4c295acd.tar.gz
Merged revisions 76416-76417 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r76416 | benjamin.peterson | 2009-11-19 16:54:57 -0600 (Thu, 19 Nov 2009) | 10 lines improve several corner cases related with argument names in parenthesis - Fix #7362: give a good error message for parenthesized arguments with defaults. - Add a py3k warning for any parenthesized arguments since those are not allowed in Py3. This warning is not given in tuple unpacking, since that incurs the tuple unpacking warning. ........ r76417 | benjamin.peterson | 2009-11-19 16:58:01 -0600 (Thu, 19 Nov 2009) | 1 line add news notes for r76416 ........
Diffstat (limited to 'Python/ast.c')
-rw-r--r--Python/ast.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/Python/ast.c b/Python/ast.c
index b89e29c55c..574a3d817c 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -682,7 +682,8 @@ ast_for_arguments(struct compiling *c, const node *n)
while (i < NCH(n)) {
ch = CHILD(n, i);
switch (TYPE(ch)) {
- case fpdef:
+ case fpdef: {
+ int complex_args = 0, parenthesized = 0;
handle_fpdef:
/* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
anything other than EQUAL or a comma? */
@@ -697,6 +698,12 @@ ast_for_arguments(struct compiling *c, const node *n)
found_default = 1;
}
else if (found_default) {
+ /* def f((x)=4): pass should raise an error.
+ def f((x, (y))): pass will just incur the tuple unpacking warning. */
+ if (parenthesized && !complex_args) {
+ ast_error(n, "parenthesized arg with default");
+ goto error;
+ }
ast_error(n,
"non-default argument follows default argument");
goto error;
@@ -709,6 +716,7 @@ ast_for_arguments(struct compiling *c, const node *n)
if (Py_Py3kWarningFlag && !ast_warn(c, ch,
"tuple parameter unpacking has been removed in 3.x"))
goto error;
+ complex_args = 1;
asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
if (!asdl_seq_GET(args, k-1))
goto error;
@@ -716,6 +724,7 @@ ast_for_arguments(struct compiling *c, const node *n)
/* def foo((x)): setup for checking NAME below. */
/* Loop because there can be many parens and tuple
unpacking mixed in. */
+ parenthesized = 1;
ch = CHILD(ch, 0);
assert(TYPE(ch) == fpdef);
goto handle_fpdef;
@@ -737,7 +746,13 @@ ast_for_arguments(struct compiling *c, const node *n)
}
i += 2; /* the name and the comma */
+ if (parenthesized && Py_Py3kWarningFlag &&
+ !ast_warn(c, ch, "parenthesized argument names "
+ "are invalid in 3.x"))
+ goto error;
+
break;
+ }
case STAR:
if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1))))
goto error;