make sure to give a 'as' and 'with' parser warning even after import statements #3936
diff --git a/Lib/test/test_with.py b/Lib/test/test_with.py
index 8242c91..3ba8977 100644
--- a/Lib/test/test_with.py
+++ b/Lib/test/test_with.py
@@ -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__':
diff --git a/Misc/NEWS b/Misc/NEWS
index 1a58dba..5fcf456 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.
diff --git a/Parser/parsetok.c b/Parser/parsetok.c
index 6494a93..f052542 100644
--- a/Parser/parsetok.c
+++ b/Parser/parsetok.c
@@ -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;