summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2009-11-19 22:54:57 (GMT)
committerBenjamin Peterson <benjamin@python.org>2009-11-19 22:54:57 (GMT)
commit99a5023c80d9a690e4305e2ded1b2a9cf6b30251 (patch)
tree3fb07d09a0ba874e6607b11b1ad9cc55515c1daa /Python
parentb678de8ba643d940009f26d50d3f6014305f152c (diff)
downloadcpython-99a5023c80d9a690e4305e2ded1b2a9cf6b30251.zip
cpython-99a5023c80d9a690e4305e2ded1b2a9cf6b30251.tar.gz
cpython-99a5023c80d9a690e4305e2ded1b2a9cf6b30251.tar.bz2
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 7f379a5..c8875e0 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;