diff options
-rw-r--r-- | Lib/test/test_syntax.py | 34 | ||||
-rw-r--r-- | Python/compile.c | 8 |
2 files changed, 40 insertions, 2 deletions
diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py new file mode 100644 index 0000000000..6605e27d72 --- /dev/null +++ b/Lib/test/test_syntax.py @@ -0,0 +1,34 @@ +import re +import unittest + +import test_support + +class SyntaxTestCase(unittest.TestCase): + + def _check_error(self, code, errtext, + filename="<testcase>", mode="exec"): + """Check that compiling code raises SyntaxError with errtext. + + errtest is a regular expression that must be present in the + test of the exception raised. + """ + try: + compile(code, filename, mode) + except SyntaxError, err: + mo = re.search(errtext, str(err)) + if mo is None: + self.fail("SyntaxError did not contain '%s'" % `errtext`) + else: + self.fail("compile() did not raise SyntaxError") + + def test_assign_call(self): + self._check_error("f() = 1", "assign") + + def test_assign_del(self): + self._check_error("del f()", "delete") + +def test_main(): + test_support.run_unittest(SyntaxTestCase) + +if __name__ == "__main__": + test_main() diff --git a/Python/compile.c b/Python/compile.c index cdb72acf84..4bbe44f7c9 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2417,8 +2417,12 @@ com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn) REQ(n, trailer); switch (TYPE(CHILD(n, 0))) { case LPAR: /* '(' [exprlist] ')' */ - com_error(c, PyExc_SyntaxError, - "can't assign to function call"); + if (assigning == OP_DELETE) + com_error(c, PyExc_SyntaxError, + "can't delete function call"); + else + com_error(c, PyExc_SyntaxError, + "can't assign to function call"); break; case DOT: /* '.' NAME */ if (assigning > OP_APPLY) |