diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2016-11-15 08:12:10 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2016-11-15 08:12:10 (GMT) |
commit | f9cca365c72eaa932f1bee6407fbbbc3b4ed96f0 (patch) | |
tree | 12858858baf93a9b88cc36aa9c938595df28d025 | |
parent | de40e1218c8dff29ee9de634034e3ed7b3979c86 (diff) | |
download | cpython-f9cca365c72eaa932f1bee6407fbbbc3b4ed96f0.zip cpython-f9cca365c72eaa932f1bee6407fbbbc3b4ed96f0.tar.gz cpython-f9cca365c72eaa932f1bee6407fbbbc3b4ed96f0.tar.bz2 |
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.
-rw-r--r-- | Lib/test/test_string_literals.py | 20 | ||||
-rw-r--r-- | 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 index 54f2be3..aba4fc4 100644 --- a/Lib/test/test_string_literals.py +++ b/Lib/test/test_string_literals.py @@ -111,6 +111,7 @@ class TestLiterals(unittest.TestCase): 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 @@ class TestLiterals(unittest.TestCase): 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 @@ class TestLiterals(unittest.TestCase): 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 @@ class TestLiterals(unittest.TestCase): 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 index bfae6ed..14bcdb1 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -4129,7 +4129,13 @@ warn_invalid_escape_sequence(struct compiling *c, const node *n, 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); } |