[Python-checkins] cpython (3.6): Fix warn_invalid_escape_sequence()
victor.stinner
python-checkins at python.org
Tue Nov 15 03:13:02 EST 2016
https://hg.python.org/cpython/rev/aa52ea2a7731
changeset: 105120:aa52ea2a7731
branch: 3.6
parent: 105118:d997e64130bd
user: Victor Stinner <victor.stinner at gmail.com>
date: Tue Nov 15 09:12:10 2016 +0100
summary:
Fix warn_invalid_escape_sequence()
Issue #28691: Fix warn_invalid_escape_sequence(): handle correctly
DeprecationWarning raised as an exception. First clear the current exception to
replace the DeprecationWarning exception with a SyntaxError exception.
Unit test written by Serhiy Storchaka.
files:
Lib/test/test_string_literals.py | 20 ++++++++++++++++++++
Python/ast.c | 8 +++++++-
2 files changed, 27 insertions(+), 1 deletions(-)
diff --git a/Lib/test/test_string_literals.py b/Lib/test/test_string_literals.py
--- a/Lib/test/test_string_literals.py
+++ b/Lib/test/test_string_literals.py
@@ -111,6 +111,7 @@
continue
with self.assertWarns(DeprecationWarning):
self.assertEqual(eval(r"'\%c'" % b), '\\' + chr(b))
+
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter('always', category=DeprecationWarning)
eval("'''\n\\z'''")
@@ -118,6 +119,15 @@
self.assertEqual(w[0].filename, '<string>')
self.assertEqual(w[0].lineno, 2)
+ with warnings.catch_warnings(record=True) as w:
+ warnings.simplefilter('error', category=DeprecationWarning)
+ with self.assertRaises(SyntaxError) as cm:
+ eval("'''\n\\z'''")
+ exc = cm.exception
+ self.assertEqual(w, [])
+ self.assertEqual(exc.filename, '<string>')
+ self.assertEqual(exc.lineno, 2)
+
def test_eval_str_raw(self):
self.assertEqual(eval(""" r'x' """), 'x')
self.assertEqual(eval(r""" r'\x01' """), '\\' + 'x01')
@@ -150,6 +160,7 @@
continue
with self.assertWarns(DeprecationWarning):
self.assertEqual(eval(r"b'\%c'" % b), b'\\' + bytes([b]))
+
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter('always', category=DeprecationWarning)
eval("b'''\n\\z'''")
@@ -157,6 +168,15 @@
self.assertEqual(w[0].filename, '<string>')
self.assertEqual(w[0].lineno, 2)
+ with warnings.catch_warnings(record=True) as w:
+ warnings.simplefilter('error', category=DeprecationWarning)
+ with self.assertRaises(SyntaxError) as cm:
+ eval("b'''\n\\z'''")
+ exc = cm.exception
+ self.assertEqual(w, [])
+ self.assertEqual(exc.filename, '<string>')
+ self.assertEqual(exc.lineno, 2)
+
def test_eval_bytes_raw(self):
self.assertEqual(eval(""" br'x' """), b'x')
self.assertEqual(eval(""" rb'x' """), b'x')
diff --git a/Python/ast.c b/Python/ast.c
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -4129,7 +4129,13 @@
NULL, NULL) < 0 &&
PyErr_ExceptionMatches(PyExc_DeprecationWarning))
{
- const char *s = PyUnicode_AsUTF8(msg);
+ const char *s;
+
+ /* Replace the DeprecationWarning exception with a SyntaxError
+ to get a more accurate error report */
+ PyErr_Clear();
+
+ s = PyUnicode_AsUTF8(msg);
if (s != NULL) {
ast_error(c, n, s);
}
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list