diff options
author | Pablo Galindo <Pablogsal@gmail.com> | 2021-01-31 22:48:23 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-31 22:48:23 +0000 |
commit | 40901518167c66abc1ebc5b71c5b86d733cfa154 (patch) | |
tree | 138c2482c5b1e1c91bb705d4dac941260aeb35d4 | |
parent | bpo-43016: Fix test_curses on platform without cursesw (GH-24405) (diff) | |
download | cpython-40901518167c66abc1ebc5b71c5b86d733cfa154.tar.gz cpython-40901518167c66abc1ebc5b71c5b86d733cfa154.tar.bz2 cpython-40901518167c66abc1ebc5b71c5b86d733cfa154.zip |
bpo-42986: Fix parser crash when reporting syntax errors in f-string with newlines (GH-24279)
-rw-r--r-- | Lib/test/test_fstring.py | 3 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst | 2 | ||||
-rw-r--r-- | Parser/pegen.c | 2 |
3 files changed, 6 insertions, 1 deletions
diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 7ca1512ebbf..d7143d154a1 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -664,6 +664,9 @@ x = ( self.assertAllRaise(SyntaxError, 'unterminated string literal', ["f'{\n}'", ]) + def test_newlines_before_syntax_error(self): + self.assertAllRaise(SyntaxError, "invalid syntax", + ["f'{.}'", "\nf'{.}'", "\n\nf'{.}'"]) def test_backslashes_in_string_part(self): self.assertEqual(f'\t', '\t') diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst b/Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst new file mode 100644 index 00000000000..6e4ed60bf22 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst @@ -0,0 +1,2 @@ +Fix parser crash when reporting syntax errors in f-string with newlines. +Patch by Pablo Galindo. diff --git a/Parser/pegen.c b/Parser/pegen.c index 0e7f86bc99e..2554273877f 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -454,7 +454,7 @@ _PyPegen_raise_error_known_location(Parser *p, PyObject *errtype, does not physically exist */ assert(p->tok->fp == NULL || p->tok->fp == stdin || p->tok->done == E_EOF); - if (p->tok->lineno == lineno) { + if (p->tok->lineno <= lineno) { Py_ssize_t size = p->tok->inp - p->tok->buf; error_line = PyUnicode_DecodeUTF8(p->tok->buf, size, "replace"); } |