From cf52bd0b9b1c1b7ecdd91e1ebebd15ae5c213a2c Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 29 Jul 2019 07:18:47 -0700 Subject: [PATCH] Fix `SyntaxError` indicator printing too many spaces for multi-line strings (GH-14433) (cherry picked from commit 5b94f3578c662d5f1ee90c0e6b81481d9ec82d89) Co-authored-by: Anthony Sottile --- Lib/test/test_cmd_line_script.py | 14 ++++++++++++++ .../2019-06-27-15-01-14.bpo-37433.amNGqr.rst | 1 + Parser/tokenizer.c | 2 ++ 3 files changed, 17 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-06-27-15-01-14.bpo-37433.amNGqr.rst diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index d138ca027c6..4cc265e60b6 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -601,6 +601,20 @@ class CmdLineTest(unittest.TestCase): self.assertNotIn("\f", text) self.assertIn("\n 1 + 1 = 2\n ^", text) + def test_syntaxerror_multi_line_fstring(self): + script = 'foo = f"""{}\nfoo"""\n' + with support.temp_dir() as script_dir: + script_name = _make_test_script(script_dir, 'script', script) + exitcode, stdout, stderr = assert_python_failure(script_name) + self.assertEqual( + stderr.splitlines()[-3:], + [ + b' foo = f"""{}', + b' ^', + b'SyntaxError: f-string: empty expression not allowed', + ], + ) + def test_consistent_sys_path_for_direct_execution(self): # This test case ensures that the following all give the same # sys.path configuration: diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-27-15-01-14.bpo-37433.amNGqr.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-27-15-01-14.bpo-37433.amNGqr.rst new file mode 100644 index 00000000000..794ddbbfec7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-27-15-01-14.bpo-37433.amNGqr.rst @@ -0,0 +1 @@ +Fix ``SyntaxError`` indicator printing too many spaces for multi-line strings - by Anthony Sottile. diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index c2ec659fed8..31fe970c900 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -956,6 +956,7 @@ tok_nextc(struct tok_state *tok) while (!done) { Py_ssize_t curstart = tok->start == NULL ? -1 : tok->start - tok->buf; + Py_ssize_t cur_multi_line_start = tok->multi_line_start - tok->buf; Py_ssize_t curvalid = tok->inp - tok->buf; Py_ssize_t newsize = curvalid + BUFSIZ; char *newbuf = tok->buf; @@ -968,6 +969,7 @@ tok_nextc(struct tok_state *tok) } tok->buf = newbuf; tok->cur = tok->buf + cur; + tok->multi_line_start = tok->buf + cur_multi_line_start; tok->line_start = tok->cur; tok->inp = tok->buf + curvalid; tok->end = tok->buf + newsize;