https://github.com/python/cpython/commit/3003fbbf00422bce6e327646063e97470afa9091
commit: 3003fbbf00422bce6e327646063e97470afa9091
branch: main
author: Pablo Galindo Salgado <[email protected]>
committer: pablogsal <[email protected]>
date: 2024-01-05T12:16:46Z
summary:

gh-113703: Correctly identify incomplete f-strings in the codeop module 
(#113709)

files:
A Misc/NEWS.d/next/Core and 
Builtins/2024-01-04-17-15-30.gh-issue-113703.Zsk0pY.rst
M Lib/test/test_codeop.py
M Parser/lexer/lexer.c

diff --git a/Lib/test/test_codeop.py b/Lib/test/test_codeop.py
index 2abb6c6d935b7e..787bd1b6a79e20 100644
--- a/Lib/test/test_codeop.py
+++ b/Lib/test/test_codeop.py
@@ -223,6 +223,9 @@ def test_incomplete(self):
         ai("(x for x in")
         ai("(x for x in (")
 
+        ai('a = f"""')
+        ai('a = \\')
+
     def test_invalid(self):
         ai = self.assertInvalid
         ai("a b")
diff --git a/Misc/NEWS.d/next/Core and 
Builtins/2024-01-04-17-15-30.gh-issue-113703.Zsk0pY.rst b/Misc/NEWS.d/next/Core 
and Builtins/2024-01-04-17-15-30.gh-issue-113703.Zsk0pY.rst
new file mode 100644
index 00000000000000..5db93e344724fb
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and 
Builtins/2024-01-04-17-15-30.gh-issue-113703.Zsk0pY.rst 
@@ -0,0 +1,2 @@
+Fix a regression in the :mod:`codeop` module that was causing it to incorrectly
+identify incomplete f-strings. Patch by Pablo Galindo
diff --git a/Parser/lexer/lexer.c b/Parser/lexer/lexer.c
index ea4bdf7ce4a24c..ebf7686773ff45 100644
--- a/Parser/lexer/lexer.c
+++ b/Parser/lexer/lexer.c
@@ -1355,9 +1355,13 @@ tok_get_fstring_mode(struct tok_state *tok, 
tokenizer_mode* current_tok, struct
             tok->lineno = the_current_tok->f_string_line_start;
 
             if (current_tok->f_string_quote_size == 3) {
-                return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok,
+                _PyTokenizer_syntaxerror(tok,
                                     "unterminated triple-quoted f-string 
literal"
-                                    " (detected at line %d)", start));
+                                    " (detected at line %d)", start);
+                if (c != '\n') {
+                    tok->done = E_EOFS;
+                }
+                return MAKE_TOKEN(ERRORTOKEN);
             }
             else {
                 return MAKE_TOKEN(_PyTokenizer_syntaxerror(tok,

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to