summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Galindo Salgado <Pablogsal@gmail.com>2023-06-15 00:08:12 (GMT)
committerGitHub <noreply@github.com>2023-06-15 00:08:12 (GMT)
commit12b6d844d8819955508bd86db106f17516be3f77 (patch)
treef9654a22661ecea6416175910451f37ebc699080
parent698a0da7d440856a90b45964e9082b5a55387b80 (diff)
downloadcpython-12b6d844d8819955508bd86db106f17516be3f77.zip
cpython-12b6d844d8819955508bd86db106f17516be3f77.tar.gz
cpython-12b6d844d8819955508bd86db106f17516be3f77.tar.bz2
gh-105800: Issue SyntaxWarning in f-strings for invalid escape sequences (#105801)
-rw-r--r--Lib/test/test_fstring.py3
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2023-06-14-22-52-06.gh-issue-105800.hdpPzZ.rst2
-rw-r--r--Parser/action_helpers.c6
3 files changed, 8 insertions, 3 deletions
diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py
index 031b94d..cbb0308 100644
--- a/Lib/test/test_fstring.py
+++ b/Lib/test/test_fstring.py
@@ -907,6 +907,9 @@ x = (
with self.assertWarns(DeprecationWarning): # invalid escape sequence
value = eval(r"f'\{6*7}'")
self.assertEqual(value, '\\42')
+ with self.assertWarns(SyntaxWarning): # invalid escape sequence
+ value = eval(r"f'\g'")
+ self.assertEqual(value, '\\g')
self.assertEqual(f'\\{6*7}', '\\42')
self.assertEqual(fr'\{6*7}', '\\42')
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-06-14-22-52-06.gh-issue-105800.hdpPzZ.rst b/Misc/NEWS.d/next/Core and Builtins/2023-06-14-22-52-06.gh-issue-105800.hdpPzZ.rst
new file mode 100644
index 0000000..d6ef7b6
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2023-06-14-22-52-06.gh-issue-105800.hdpPzZ.rst
@@ -0,0 +1,2 @@
+Correctly issue :exc:`SyntaxWarning` in f-strings if invalid sequences are
+used. Patch by Pablo Galindo
diff --git a/Parser/action_helpers.c b/Parser/action_helpers.c
index 7786124..70c267b 100644
--- a/Parser/action_helpers.c
+++ b/Parser/action_helpers.c
@@ -1225,7 +1225,7 @@ _PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args, asdl_comprehension_seq
// Fstring stuff
static expr_ty
-_PyPegen_decode_fstring_part(Parser* p, int is_raw, expr_ty constant) {
+_PyPegen_decode_fstring_part(Parser* p, int is_raw, expr_ty constant, Token* token) {
assert(PyUnicode_CheckExact(constant->v.Constant.value));
const char* bstr = PyUnicode_AsUTF8(constant->v.Constant.value);
@@ -1241,7 +1241,7 @@ _PyPegen_decode_fstring_part(Parser* p, int is_raw, expr_ty constant) {
}
is_raw = is_raw || strchr(bstr, '\\') == NULL;
- PyObject *str = _PyPegen_decode_string(p, is_raw, bstr, len, NULL);
+ PyObject *str = _PyPegen_decode_string(p, is_raw, bstr, len, token);
if (str == NULL) {
_Pypegen_raise_decode_error(p);
return NULL;
@@ -1315,7 +1315,7 @@ _PyPegen_joined_str(Parser *p, Token* a, asdl_expr_seq* raw_expressions, Token*b
for (Py_ssize_t i = 0; i < n_items; i++) {
expr_ty item = asdl_seq_GET(expr, i);
if (item->kind == Constant_kind) {
- item = _PyPegen_decode_fstring_part(p, is_raw, item);
+ item = _PyPegen_decode_fstring_part(p, is_raw, item, b);
if (item == NULL) {
return NULL;
}