diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2021-03-22 12:07:05 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-22 19:07:05 +0000 |
commit | 994a519915bff4901abaa7476e2b91682dea619a (patch) | |
tree | 90b9d0f7fae99d08035a97a398dd25ebf0ff1eee | |
parent | c145c03281af850130dd7f75abc19c6ea49626e6 (diff) | |
download | cpython-git-994a519915bff4901abaa7476e2b91682dea619a.tar.gz |
bpo-43555: Report the column offset for invalid line continuation character (GH-24939) (#24975)
(cherry picked from commit 96eeff516204b7cc751103fa33dcc665e387846e)
Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
-rw-r--r-- | Lib/test/test_syntax.py | 5 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2021-03-19-22-49-40.bpo-43555.ZmhYSA.rst | 2 | ||||
-rw-r--r-- | Parser/pegen/pegen.c | 7 | ||||
-rw-r--r-- | Parser/pegen/pegen.h | 5 |
4 files changed, 13 insertions, 6 deletions
diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index f0c9c988e2..650a03173a 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -973,6 +973,11 @@ def func2(): """ self._check_error(code, "invalid syntax") + def test_invalid_line_continuation_error_position(self): + self._check_error(r"a = 3 \ 4", + "unexpected character after line continuation character", + lineno=1, offset=9) + def test_invalid_line_continuation_left_recursive(self): # Check bpo-42218: SyntaxErrors following left-recursive rules # (t_primary_raw in this case) need to be tested explicitly diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-03-19-22-49-40.bpo-43555.ZmhYSA.rst b/Misc/NEWS.d/next/Core and Builtins/2021-03-19-22-49-40.bpo-43555.ZmhYSA.rst new file mode 100644 index 0000000000..55a2fe22aa --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-03-19-22-49-40.bpo-43555.ZmhYSA.rst @@ -0,0 +1,2 @@ +Report the column offset for :exc:`SyntaxError` for invalid line +continuation characters. Patch by Pablo Galindo. diff --git a/Parser/pegen/pegen.c b/Parser/pegen/pegen.c index 4e742a5ec7..0a26275b23 100644 --- a/Parser/pegen/pegen.c +++ b/Parser/pegen/pegen.c @@ -313,6 +313,7 @@ tokenizer_error(Parser *p) const char *msg = NULL; PyObject* errtype = PyExc_SyntaxError; + Py_ssize_t col_offset = -1; switch (p->tok->done) { case E_TOKEN: msg = "invalid token"; @@ -346,16 +347,14 @@ tokenizer_error(Parser *p) msg = "too many levels of indentation"; break; case E_LINECONT: + col_offset = strlen(strtok(p->tok->buf, "\n")) - 1; msg = "unexpected character after line continuation character"; break; default: msg = "unknown parsing error"; } - PyErr_Format(errtype, msg); - // There is no reliable column information for this error - PyErr_SyntaxLocationObject(p->tok->filename, p->tok->lineno, 0); - + RAISE_ERROR_KNOWN_LOCATION(p, errtype, p->tok->lineno, col_offset, msg); return -1; } diff --git a/Parser/pegen/pegen.h b/Parser/pegen/pegen.h index a2f524a597..224c5cbea6 100644 --- a/Parser/pegen/pegen.h +++ b/Parser/pegen/pegen.h @@ -138,8 +138,9 @@ void *_PyPegen_raise_error_known_location(Parser *p, PyObject *errtype, void *_PyPegen_dummy_name(Parser *p, ...); Py_LOCAL_INLINE(void *) -RAISE_ERROR_KNOWN_LOCATION(Parser *p, PyObject *errtype, int lineno, - int col_offset, const char *errmsg, ...) +RAISE_ERROR_KNOWN_LOCATION(Parser *p, PyObject *errtype, + Py_ssize_t lineno, Py_ssize_t col_offset, + const char *errmsg, ...) { va_list va; va_start(va, errmsg); |