diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -2729,6 +2729,10 @@ class UnicodeTest(string_tests.CommonTest, support.check_free_after_iterating(self, iter, str) support.check_free_after_iterating(self, reversed, str) + def test_invalid_sequences(self): + for letter in "cdeghijklmopqswyzABCDEFGHIJKLMOPQRSTVWXYZ": + with self.assertWarns(DeprecationWarning): + eval(r"'\%s'" % letter) class StringModuleTest(unittest.TestCase): def test_formatter_parser(self): diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -5848,6 +5848,7 @@ PyUnicode_DecodeUnicodeEscape(const char *s, _PyUnicodeWriter writer; const char *end; char* message; + int ret; Py_UCS4 chr = 0xffffffff; /* in case 'getcode' messes up */ PyObject *errorHandler = NULL; PyObject *exc = NULL; @@ -6022,6 +6023,11 @@ PyUnicode_DecodeUnicodeEscape(const char *s, goto error; } else { + /* Deprecate invalid escape sequences */ + ret = PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "invalid escape sequence '%c'", c); + if (ret < 0) + goto onError; WRITECHAR('\\'); WRITECHAR((unsigned char)s[-1]); }