[3.12] gh-105800: Issue SyntaxWarning in f-strings for invalid escape sequences (GH-105801) (#105806)

Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>
This commit is contained in:
Miss Islington (bot) 2023-06-14 17:36:40 -07:00 committed by GitHub
parent 52a2bbdc9d
commit 638c2bacde
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 8 additions and 3 deletions

View file

@ -907,6 +907,9 @@ x = (
with self.assertWarns(DeprecationWarning): # invalid escape sequence with self.assertWarns(DeprecationWarning): # invalid escape sequence
value = eval(r"f'\{6*7}'") value = eval(r"f'\{6*7}'")
self.assertEqual(value, '\\42') 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(f'\\{6*7}', '\\42')
self.assertEqual(fr'\{6*7}', '\\42') self.assertEqual(fr'\{6*7}', '\\42')

View file

@ -0,0 +1,2 @@
Correctly issue :exc:`SyntaxWarning` in f-strings if invalid sequences are
used. Patch by Pablo Galindo

View file

@ -1231,7 +1231,7 @@ _PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args, asdl_comprehension_seq
// Fstring stuff // Fstring stuff
static expr_ty 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)); assert(PyUnicode_CheckExact(constant->v.Constant.value));
const char* bstr = PyUnicode_AsUTF8(constant->v.Constant.value); const char* bstr = PyUnicode_AsUTF8(constant->v.Constant.value);
@ -1247,7 +1247,7 @@ _PyPegen_decode_fstring_part(Parser* p, int is_raw, expr_ty constant) {
} }
is_raw = is_raw || strchr(bstr, '\\') == NULL; 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) { if (str == NULL) {
_Pypegen_raise_decode_error(p); _Pypegen_raise_decode_error(p);
return NULL; return NULL;
@ -1321,7 +1321,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++) { for (Py_ssize_t i = 0; i < n_items; i++) {
expr_ty item = asdl_seq_GET(expr, i); expr_ty item = asdl_seq_GET(expr, i);
if (item->kind == Constant_kind) { 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) { if (item == NULL) {
return NULL; return NULL;
} }