From: Martin v. Löwis Date: Thu, 4 May 2006 05:51:03 +0000 (+0000) Subject: Patch #1475845: Raise IndentationError for unexpected indent. X-Git-Tag: v2.5b1~707 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=777367103c9ab487fb74ce3f3ac8ea2701de328e;p=python Patch #1475845: Raise IndentationError for unexpected indent. --- diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index b61debfcb0..ce2e327a3d 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -243,15 +243,18 @@ from test import test_support class SyntaxTestCase(unittest.TestCase): def _check_error(self, code, errtext, - filename="", mode="exec"): + filename="", mode="exec", subclass=None): """Check that compiling code raises SyntaxError with errtext. errtest is a regular expression that must be present in the - test of the exception raised. + test of the exception raised. If subclass is specified it + is the expected subclass of SyntaxError (e.g. IndentationError). """ try: compile(code, filename, mode) except SyntaxError, err: + if subclass and not isinstance(err, subclass): + self.fail("SyntaxError is not a %s" % subclass.__name__) mo = re.search(errtext, str(err)) if mo is None: self.fail("SyntaxError did not contain '%r'" % (errtext,)) @@ -290,6 +293,19 @@ class SyntaxTestCase(unittest.TestCase): :""") self._check_error(source, "nested scope") + def test_unexpected_indent(self): + self._check_error("foo()\n bar()\n", "unexpected indent", + subclass=IndentationError) + + def test_no_indent(self): + self._check_error("if 1:\nfoo()", "expected an indented block", + subclass=IndentationError) + + def test_bad_outdent(self): + self._check_error("if 1:\n foo()\n bar()", + "unindent does not match .* level", + subclass=IndentationError) + def test_main(): test_support.run_unittest(SyntaxTestCase) from test import test_syntax diff --git a/Misc/NEWS b/Misc/NEWS index cedefef31d..8c758b00ff 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,8 @@ What's New in Python 2.5 alpha 2? Core and builtins ----------------- +- Patch #1475845: Raise IndentationError for unexpected indent. + - Patch #1479181: split open() and file() from being aliases for each other. - Bug #1465834: 'bdist_wininst preinstall script support' was fixed diff --git a/Parser/parsetok.c b/Parser/parsetok.c index 77a2cac9fb..5fcaf1b36a 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -194,8 +194,10 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, if ((err_ret->error = PyParser_AddToken(ps, (int)type, str, tok->lineno, col_offset, &(err_ret->expected))) != E_OK) { - if (err_ret->error != E_DONE) + if (err_ret->error != E_DONE) { PyObject_FREE(str); + err_ret->token = type; + } break; } }