summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Galindo <Pablogsal@gmail.com>2021-03-22 17:28:11 (GMT)
committerGitHub <noreply@github.com>2021-03-22 17:28:11 (GMT)
commit96eeff516204b7cc751103fa33dcc665e387846e (patch)
tree7eb595bad5b876e53ccf91f041fe4d5512742fd0
parent123ff266cda9ad279106f20dca06ba114f6a9b8a (diff)
downloadcpython-96eeff516204b7cc751103fa33dcc665e387846e.zip
cpython-96eeff516204b7cc751103fa33dcc665e387846e.tar.gz
cpython-96eeff516204b7cc751103fa33dcc665e387846e.tar.bz2
bpo-43555: Report the column offset for invalid line continuation character (GH-24939)
-rw-r--r--Lib/test/test_syntax.py5
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2021-03-19-22-49-40.bpo-43555.ZmhYSA.rst2
-rw-r--r--Parser/pegen.c7
-rw-r--r--Parser/pegen.h5
4 files changed, 13 insertions, 6 deletions
diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py
index 24233b2..730c297 100644
--- a/Lib/test/test_syntax.py
+++ b/Lib/test/test_syntax.py
@@ -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
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 0000000..55a2fe2
--- /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.c b/Parser/pegen.c
index 953480d..d2b7ec4 100644
--- a/Parser/pegen.c
+++ b/Parser/pegen.c
@@ -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;
}
diff --git a/Parser/pegen.h b/Parser/pegen.h
index 3765b24..8720e60 100644
--- a/Parser/pegen.h
+++ b/Parser/pegen.h
@@ -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);