bpo-40612: Fix SyntaxError edge cases in traceback formatting (GH-20072)

This fixes both the traceback.py module and the C code for formatting syntax errors (in Python/pythonrun.c). They now both consistently do the following:

- Suppress caret if it points left of text
- Allow caret pointing just past end of line
- If caret points past end of line, clip to *just* past end of line

The syntax error formatting code in traceback.py was mostly rewritten; small, subtle changes were applied to the C code in pythonrun.c.

There's still a difference when the text contains embedded newlines. Neither handles these very well, and I don't think the case occurs in practice.

Automerge-Triggered-By: @gvanrossum
This commit is contained in:
Guido van Rossum 2020-05-14 19:22:48 -07:00 committed by GitHub
parent 1aa8767baf
commit 15bc9ab301
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 96 additions and 41 deletions

View file

@ -633,7 +633,7 @@ class CmdLineTest(unittest.TestCase):
stderr.splitlines()[-3:],
[
b' foo"""',
b' ^',
b' ^',
b'SyntaxError: f-string: empty expression not allowed',
],
)