bpo-43555: Report the column offset for invalid line continuation character (GH-24939)

This commit is contained in:
Pablo Galindo 2021-03-22 17:28:11 +00:00 committed by GitHub
parent 123ff266cd
commit 96eeff5162
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 13 additions and 6 deletions

View file

@ -1162,6 +1162,11 @@ def func2():
"""
self._check_error(code, "expected ':'")
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

View file

@ -0,0 +1,2 @@
Report the column offset for :exc:`SyntaxError` for invalid line
continuation characters. Patch by Pablo Galindo.

View file

@ -328,6 +328,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";
@ -359,16 +360,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;
}

View file

@ -136,8 +136,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);