summaryrefslogtreecommitdiff
path: root/Python
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2009-11-19 22:54:57 +0000
committerBenjamin Peterson <benjamin@python.org>2009-11-19 22:54:57 +0000
commit99a5023c80d9a690e4305e2ded1b2a9cf6b30251 (patch)
tree3fb07d09a0ba874e6607b11b1ad9cc55515c1daa /Python
parentb678de8ba643d940009f26d50d3f6014305f152c (diff)
downloadcpython-git-99a5023c80d9a690e4305e2ded1b2a9cf6b30251.tar.gz
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.
Diffstat (limited to 'Python')
-rw-r--r--Python/ast.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/Python/ast.c b/Python/ast.c
index 7f379a5957..c8875e0747 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -692,7 +692,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? */
@@ -707,6 +708,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;
@@ -719,6 +726,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;
@@ -726,6 +734,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;
@@ -747,7 +756,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;