[Python-checkins] r66619 - in python/branches/release25-maint: Lib/test/test_with.py Misc/NEWS Parser/parsetok.c

benjamin.peterson python-checkins at python.org
Thu Sep 25 22:46:06 CEST 2008


Author: benjamin.peterson
Date: Thu Sep 25 22:46:05 2008
New Revision: 66619

Log:
make sure to give a 'as' and 'with' parser warning even after import statements #3936

Modified:
   python/branches/release25-maint/Lib/test/test_with.py
   python/branches/release25-maint/Misc/NEWS
   python/branches/release25-maint/Parser/parsetok.c

Modified: python/branches/release25-maint/Lib/test/test_with.py
==============================================================================
--- python/branches/release25-maint/Lib/test/test_with.py	(original)
+++ python/branches/release25-maint/Lib/test/test_with.py	Thu Sep 25 22:46:05 2008
@@ -9,6 +9,7 @@
 
 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 @@
             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, "<string>", "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__':

Modified: python/branches/release25-maint/Misc/NEWS
==============================================================================
--- python/branches/release25-maint/Misc/NEWS	(original)
+++ python/branches/release25-maint/Misc/NEWS	Thu Sep 25 22:46:05 2008
@@ -12,6 +12,9 @@
 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.
 

Modified: python/branches/release25-maint/Parser/parsetok.c
==============================================================================
--- python/branches/release25-maint/Parser/parsetok.c	(original)
+++ python/branches/release25-maint/Parser/parsetok.c	Thu Sep 25 22:46:05 2008
@@ -137,19 +137,22 @@
 			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;


More information about the Python-checkins mailing list