diff options
author | Benjamin Peterson <benjamin@python.org> | 2009-11-19 23:01:36 +0000 |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2009-11-19 23:01:36 +0000 |
commit | 440847cf8e1f60c81e1ac1f722b6e7ad4c295acd (patch) | |
tree | 7a8ebdaebc42ef9c985745fb250ca48f81ba59c4 /Python/ast.c | |
parent | aa4af333eca371f053ed238ddfc12f67441f431d (diff) | |
download | cpython-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.c | 17 |
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; |