summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2018-10-19 14:42:06 (GMT)
committerGitHub <noreply@github.com>2018-10-19 14:42:06 (GMT)
commit6543912c90ffa579dc4c01e811f9609cf92197d3 (patch)
tree44f433f463ad6624814d0f3c556501eeefb862b8
parent209144831b0a19715bda3bd72b14a3e6192d9cc1 (diff)
downloadcpython-6543912c90ffa579dc4c01e811f9609cf92197d3.zip
cpython-6543912c90ffa579dc4c01e811f9609cf92197d3.tar.gz
cpython-6543912c90ffa579dc4c01e811f9609cf92197d3.tar.bz2
bpo-32912: Replace a DeprecationWarning with a SyntaxWarning (GH-9652)
for invalid escape sequences in string and bytes literals.
-rw-r--r--Doc/reference/lexical_analysis.rst7
-rw-r--r--Doc/whatsnew/3.8.rst6
-rw-r--r--Lib/test/test_fstring.py2
-rw-r--r--Lib/test/test_string_literals.py12
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2018-10-01-10-41-53.bpo-32912.JeIOdM.rst2
-rw-r--r--Python/ast.c6
6 files changed, 23 insertions, 12 deletions
diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst
index 84e8c78..e1d88ef 100644
--- a/Doc/reference/lexical_analysis.rst
+++ b/Doc/reference/lexical_analysis.rst
@@ -559,8 +559,11 @@ escape sequences only recognized in string literals fall into the category of
unrecognized escapes for bytes literals.
.. versionchanged:: 3.6
- Unrecognized escape sequences produce a DeprecationWarning. In
- some future version of Python they will be a SyntaxError.
+ Unrecognized escape sequences produce a :exc:`DeprecationWarning`.
+
+ .. versionchanged:: 3.8
+ Unrecognized escape sequences produce a :exc:`SyntaxWarning`. In
+ some future version of Python they will be a :exc:`SyntaxError`.
Even in a raw literal, quotes can be escaped with a backslash, but the
backslash remains in the result; for example, ``r"\""`` is a valid string
diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst
index bd3283c..e522add 100644
--- a/Doc/whatsnew/3.8.rst
+++ b/Doc/whatsnew/3.8.rst
@@ -107,6 +107,12 @@ Other Language Changes
and :keyword:`return` statements.
(Contributed by David Cuthbert and Jordan Chapman in :issue:`32117`.)
+* A backslash-character pair that is not a valid escape sequence generates
+ a :exc:`DeprecationWarning` since Python 3.6. In Python 3.8 it generates
+ a :exc:`SyntaxWarning` instead.
+ (Contributed by Serhiy Storchaka in :issue:`32912`.)
+
+
New Modules
===========
diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py
index fec72e0..09b5ae1 100644
--- a/Lib/test/test_fstring.py
+++ b/Lib/test/test_fstring.py
@@ -626,7 +626,7 @@ non-important content
self.assertEqual(f'2\x203', '2 3')
self.assertEqual(f'\x203', ' 3')
- with self.assertWarns(DeprecationWarning): # invalid escape sequence
+ with self.assertWarns(SyntaxWarning): # invalid escape sequence
value = eval(r"f'\{6*7}'")
self.assertEqual(value, '\\42')
self.assertEqual(f'\\{6*7}', '\\42')
diff --git a/Lib/test/test_string_literals.py b/Lib/test/test_string_literals.py
index aba4fc4..55bcde4 100644
--- a/Lib/test/test_string_literals.py
+++ b/Lib/test/test_string_literals.py
@@ -109,18 +109,18 @@ class TestLiterals(unittest.TestCase):
for b in range(1, 128):
if b in b"""\n\r"'01234567NU\\abfnrtuvx""":
continue
- with self.assertWarns(DeprecationWarning):
+ with self.assertWarns(SyntaxWarning):
self.assertEqual(eval(r"'\%c'" % b), '\\' + chr(b))
with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter('always', category=DeprecationWarning)
+ warnings.simplefilter('always', category=SyntaxWarning)
eval("'''\n\\z'''")
self.assertEqual(len(w), 1)
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)
+ warnings.simplefilter('error', category=SyntaxWarning)
with self.assertRaises(SyntaxError) as cm:
eval("'''\n\\z'''")
exc = cm.exception
@@ -158,18 +158,18 @@ class TestLiterals(unittest.TestCase):
for b in range(1, 128):
if b in b"""\n\r"'01234567\\abfnrtvx""":
continue
- with self.assertWarns(DeprecationWarning):
+ with self.assertWarns(SyntaxWarning):
self.assertEqual(eval(r"b'\%c'" % b), b'\\' + bytes([b]))
with warnings.catch_warnings(record=True) as w:
- warnings.simplefilter('always', category=DeprecationWarning)
+ warnings.simplefilter('always', category=SyntaxWarning)
eval("b'''\n\\z'''")
self.assertEqual(len(w), 1)
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)
+ warnings.simplefilter('error', category=SyntaxWarning)
with self.assertRaises(SyntaxError) as cm:
eval("b'''\n\\z'''")
exc = cm.exception
diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-10-01-10-41-53.bpo-32912.JeIOdM.rst b/Misc/NEWS.d/next/Core and Builtins/2018-10-01-10-41-53.bpo-32912.JeIOdM.rst
new file mode 100644
index 0000000..9cb3599
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2018-10-01-10-41-53.bpo-32912.JeIOdM.rst
@@ -0,0 +1,2 @@
+A :exc:`SyntaxWarning` is now emitted instead of a :exc:`DeprecationWarning`
+for invalid escape sequences in string and bytes literals.
diff --git a/Python/ast.c b/Python/ast.c
index 587f838..184e33b 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -4128,14 +4128,14 @@ warn_invalid_escape_sequence(struct compiling *c, const node *n,
if (msg == NULL) {
return -1;
}
- if (PyErr_WarnExplicitObject(PyExc_DeprecationWarning, msg,
+ if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg,
c->c_filename, LINENO(n),
NULL, NULL) < 0)
{
- if (PyErr_ExceptionMatches(PyExc_DeprecationWarning)) {
+ if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
const char *s;
- /* Replace the DeprecationWarning exception with a SyntaxError
+ /* Replace the SyntaxWarning exception with a SyntaxError
to get a more accurate error report */
PyErr_Clear();