aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPablo Galindo <Pablogsal@gmail.com>2021-01-31 22:48:23 +0000
committerGitHub <noreply@github.com>2021-01-31 22:48:23 +0000
commit40901518167c66abc1ebc5b71c5b86d733cfa154 (patch)
tree138c2482c5b1e1c91bb705d4dac941260aeb35d4
parentbpo-43016: Fix test_curses on platform without cursesw (GH-24405) (diff)
downloadcpython-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.py3
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2021-01-20-23-44-15.bpo-42986.sWoaGf.rst2
-rw-r--r--Parser/pegen.c2
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");
}