summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Galindo Salgado <Pablogsal@gmail.com>2024-07-19 17:08:08 (GMT)
committerGitHub <noreply@github.com>2024-07-19 17:08:08 (GMT)
commit2009e25e26040dca32696e70f91f13665350e7fd (patch)
treefd8886785c6a8645c0f49b23963b77ad3118c565
parent186b4d8ea2fdc91bf18e8be695244ead1722af18 (diff)
downloadcpython-2009e25e26040dca32696e70f91f13665350e7fd.zip
cpython-2009e25e26040dca32696e70f91f13665350e7fd.tar.gz
cpython-2009e25e26040dca32696e70f91f13665350e7fd.tar.bz2
gh-122026: Fix identification of mismatched parentheses inside f-strings (#122028)
-rw-r--r--Lib/test/test_fstring.py1
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2024-07-19-15-28-05.gh-issue-122026.sta2Ca.rst2
-rw-r--r--Parser/lexer/lexer.c3
3 files changed, 6 insertions, 0 deletions
diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py
index 50fcb47..5da3c38 100644
--- a/Lib/test/test_fstring.py
+++ b/Lib/test/test_fstring.py
@@ -896,6 +896,7 @@ x = (
"f'{:2}'",
"f'''{\t\f\r\n:a}'''",
"f'{:'",
+ "F'{[F'{:'}[F'{:'}]]]",
])
self.assertAllRaise(SyntaxError,
diff --git a/Misc/NEWS.d/next/Core and Builtins/2024-07-19-15-28-05.gh-issue-122026.sta2Ca.rst b/Misc/NEWS.d/next/Core and Builtins/2024-07-19-15-28-05.gh-issue-122026.sta2Ca.rst
new file mode 100644
index 0000000..2721a40
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2024-07-19-15-28-05.gh-issue-122026.sta2Ca.rst
@@ -0,0 +1,2 @@
+Fix a bug that caused the tokenizer to not correctly identify mismatched
+parentheses inside f-strings in some situations. Patch by Pablo Galindo
diff --git a/Parser/lexer/lexer.c b/Parser/lexer/lexer.c
index 9ca3bd6..8c86859 100644
--- a/Parser/lexer/lexer.c
+++ b/Parser/lexer/lexer.c
@@ -1238,6 +1238,9 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t
if (INSIDE_FSTRING(tok)) {
current_tok->curly_bracket_depth--;
+ if (current_tok->curly_bracket_depth < 0) {
+ return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok, "f-string: unmatched '%c'", c));
+ }
if (c == '}' && current_tok->curly_bracket_depth == current_tok->curly_bracket_expr_start_depth) {
current_tok->curly_bracket_expr_start_depth--;
current_tok->kind = TOK_FSTRING_MODE;