From d1c7d07d6758657be7f252c9a03f4b0da9d7720f Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Thu, 25 Sep 2008 20:46:05 +0000 Subject: [PATCH] make sure to give a 'as' and 'with' parser warning even after import statements #3936 --- Lib/test/test_with.py | 35 ++++++++++++++++++++++++++++++++++- Misc/NEWS | 3 +++ Parser/parsetok.c | 27 +++++++++++++++------------ 3 files changed, 52 insertions(+), 13 deletions(-) diff --git a/Lib/test/test_with.py b/Lib/test/test_with.py index 8242c912c52..3ba897798bf 100644 --- a/Lib/test/test_with.py +++ b/Lib/test/test_with.py @@ -9,6 +9,7 @@ __email__ = "mbland at acm dot org" import sys import unittest +import StringIO from collections import deque from contextlib import GeneratorContextManager, contextmanager from test.test_support import run_unittest @@ -625,12 +626,44 @@ class ExitSwallowsExceptionTestCase(unittest.TestCase): self.fail("ZeroDivisionError should have been raised") +class NewKeywordsWarningTestCase(unittest.TestCase): + + def check(self, code, word=None): + save = sys.stderr + sys.stderr = stream = StringIO.StringIO() + try: + compile(code, "", "exec", 0, True) + finally: + sys.stderr = save + if word: + self.assert_("Warning: %r will become a reserved keyword in Python 2.6" % word + in stream.getvalue()) + else: + self.assertEqual(stream.getvalue(), "") + + def test_basic(self): + self.check("as = 4", "as") + self.check("with = 4", "with") + self.check("class as: pass", "as") + self.check("class with: pass", "with") + self.check("obj.as = 4", "as") + self.check("with.obj = 4", "with") + self.check("def with(): pass", "with") + self.check("do(); with = 23", "with") + + def test_after_import(self): + # issue 3936 + self.check("import sys\nas = 4", "as") + self.check("import sys\nwith = 4", "with") + + def test_main(): run_unittest(FailureTestCase, NonexceptionalTestCase, NestedNonexceptionalTestCase, ExceptionalTestCase, NonLocalFlowControlTestCase, AssignmentTargetTestCase, - ExitSwallowsExceptionTestCase) + ExitSwallowsExceptionTestCase, + NewKeywordsWarningTestCase) if __name__ == '__main__': diff --git a/Misc/NEWS b/Misc/NEWS index 1a58dba1e11..5fcf45649c7 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.5.3? Core and builtins ----------------- +- Issue #3936: The parser warnings for using "as" and "with" as variable names + didn't fire after import statements. + - Issue #3751: str.rpartition would perform a left-partition when called with a unicode argument. diff --git a/Parser/parsetok.c b/Parser/parsetok.c index 6494a9381cf..f05254200cf 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -137,19 +137,22 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, err_ret->error = tok->done; break; } - if (type == ENDMARKER && started) { - type = NEWLINE; /* Add an extra newline */ - handling_with = handling_import = 0; - started = 0; - /* Add the right number of dedent tokens, - except if a certain flag is given -- - codeop.py uses this. */ - if (tok->indent && - !(flags & PyPARSE_DONT_IMPLY_DEDENT)) - { - tok->pendin = -tok->indent; - tok->indent = 0; + if (started) { + if (type == ENDMARKER) { + type = NEWLINE; /* Add an extra newline */ + started = 0; + /* Add the right number of dedent tokens, + except if a certain flag is given -- + codeop.py uses this. */ + if (tok->indent && + !(flags & PyPARSE_DONT_IMPLY_DEDENT)) + { + tok->pendin = -tok->indent; + tok->indent = 0; + } } + if (type == NEWLINE) + handling_with = handling_import = 0; } else started = 1;