summaryrefslogtreecommitdiffstats
path: root/Parser
diff options
context:
space:
mode:
authorLysandros Nikolaou <lisandrosnik@gmail.com>2023-06-20 12:38:46 (GMT)
committerGitHub <noreply@github.com>2023-06-20 12:38:46 (GMT)
commit6586cee27f32f0354fe4e77c7b8c6e399329b5e2 (patch)
treedae5d2b29d0add36ba8807f563245fab45222b20 /Parser
parent155577de1b6a7f4404b2bf90bcc1a588201550da (diff)
downloadcpython-6586cee27f32f0354fe4e77c7b8c6e399329b5e2.zip
cpython-6586cee27f32f0354fe4e77c7b8c6e399329b5e2.tar.gz
cpython-6586cee27f32f0354fe4e77c7b8c6e399329b5e2.tar.bz2
gh-105938: Emit a SyntaxWarning for escaped braces in an f-string (#105939)
Diffstat (limited to 'Parser')
-rw-r--r--Parser/string_parser.c7
-rw-r--r--Parser/tokenizer.c6
2 files changed, 9 insertions, 4 deletions
diff --git a/Parser/string_parser.c b/Parser/string_parser.c
index d4ce338..20459e8 100644
--- a/Parser/string_parser.c
+++ b/Parser/string_parser.c
@@ -12,6 +12,11 @@ static int
warn_invalid_escape_sequence(Parser *p, const char *first_invalid_escape, Token *t)
{
unsigned char c = *first_invalid_escape;
+ if ((t->type == FSTRING_MIDDLE || t->type == FSTRING_END) && (c == '{' || c == '}')) { // in this case the tokenizer has already emitted a warning,
+ // see tokenizer.c:warn_invalid_escape_sequence
+ return 0;
+ }
+
int octal = ('4' <= c && c <= '7');
PyObject *msg =
octal
@@ -31,7 +36,7 @@ warn_invalid_escape_sequence(Parser *p, const char *first_invalid_escape, Token
if (PyErr_WarnExplicitObject(category, msg, p->tok->filename,
t->lineno, NULL, NULL) < 0) {
if (PyErr_ExceptionMatches(category)) {
- /* Replace the DeprecationWarning exception with a SyntaxError
+ /* Replace the Syntax/DeprecationWarning exception with a SyntaxError
to get a more accurate error report */
PyErr_Clear();
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c
index 4f7b1f8..6bdf371 100644
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -1559,12 +1559,12 @@ warn_invalid_escape_sequence(struct tok_state *tok, int first_invalid_escape_cha
return -1;
}
- if (PyErr_WarnExplicitObject(PyExc_DeprecationWarning, msg, tok->filename,
+ if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, tok->filename,
tok->lineno, NULL, NULL) < 0) {
Py_DECREF(msg);
- if (PyErr_ExceptionMatches(PyExc_DeprecationWarning)) {
- /* Replace the DeprecationWarning exception with a SyntaxError
+ if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
+ /* Replace the SyntaxWarning exception with a SyntaxError
to get a more accurate error report */
PyErr_Clear();
return syntaxerror(tok, "invalid escape sequence '\\%c'", (char) first_invalid_escape_char);