diff options
author | Lysandros Nikolaou <lisandrosnik@gmail.com> | 2020-04-28 00:23:35 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-28 00:23:35 (GMT) |
commit | d55133f49fe678fbf047a647aa8bb8b520410e8d (patch) | |
tree | db31a77eb0f6afec122315b46c74597f1f4f9441 | |
parent | 5d1f32d33ba24d0aa87235ae40207bb57778388b (diff) | |
download | cpython-d55133f49fe678fbf047a647aa8bb8b520410e8d.zip cpython-d55133f49fe678fbf047a647aa8bb8b520410e8d.tar.gz cpython-d55133f49fe678fbf047a647aa8bb8b520410e8d.tar.bz2 |
bpo-40334: Catch E_EOF error, when the tokenizer returns ERRORTOKEN (GH-19743)
An E_EOF error was only being caught after the parser exited before this commit. There are some cases though, where the tokenizer returns ERRORTOKEN *and* has set an E_EOF error (like when EOF directly follows a line continuation character) which weren't correctly handled before.
-rw-r--r-- | Lib/test/test_eof.py | 2 | ||||
-rw-r--r-- | Parser/pegen/pegen.c | 9 |
2 files changed, 6 insertions, 5 deletions
diff --git a/Lib/test/test_eof.py b/Lib/test/test_eof.py index f806578..9ef8eb1 100644 --- a/Lib/test/test_eof.py +++ b/Lib/test/test_eof.py @@ -26,7 +26,6 @@ class EOFTestCase(unittest.TestCase): else: raise support.TestFailed - @support.skip_if_new_parser("TODO for PEG -- fails with new parser") def test_line_continuation_EOF(self): """A continuation at the end of input must be an error; bpo2180.""" expect = 'unexpected EOF while parsing (<string>, line 1)' @@ -37,7 +36,6 @@ class EOFTestCase(unittest.TestCase): exec('\\') self.assertEqual(str(excinfo.exception), expect) - @unittest.skip("TODO for PEG -- fails even with old parser now") @unittest.skipIf(not sys.executable, "sys.executable required") def test_line_continuation_EOF_from_file_bpo2180(self): """Ensure tok_nextc() does not add too many ending newlines.""" diff --git a/Parser/pegen/pegen.c b/Parser/pegen/pegen.c index d75267b..6f78d8c 100644 --- a/Parser/pegen/pegen.c +++ b/Parser/pegen/pegen.c @@ -344,13 +344,16 @@ tokenizer_error(Parser *p) break; case E_BADPREFIX: return tokenizer_error_with_col_offset(p, - PyExc_SyntaxError, "invalid string prefix"); + errtype, "invalid string prefix"); case E_EOFS: return tokenizer_error_with_col_offset(p, - PyExc_SyntaxError, "EOF while scanning triple-quoted string literal"); + errtype, "EOF while scanning triple-quoted string literal"); case E_EOLS: return tokenizer_error_with_col_offset(p, - PyExc_SyntaxError, "EOL while scanning string literal"); + errtype, "EOL while scanning string literal"); + case E_EOF: + return tokenizer_error_with_col_offset(p, + errtype, "unexpected EOF while parsing"); case E_DEDENT: return tokenizer_error_with_col_offset(p, PyExc_IndentationError, "unindent does not match any outer indentation level"); |