diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py index 9953363a0d1..32dc15ed32c 100644 --- a/Lib/test/test_grammar.py +++ b/Lib/test/test_grammar.py @@ -125,6 +125,13 @@ the \'lazy\' dog.\n\ self.assertTrue(x is Ellipsis) self.assertRaises(SyntaxError, eval, ".. .") + def test_eof_error(self): + samples = ("def foo(", "\ndef foo(", "def foo(\n") + for s in samples: + with self.assertRaises(SyntaxError) as cm: + compile(s, "", "exec") + self.assertIn("unexpected EOF", str(cm.exception)) + class GrammarTests(unittest.TestCase): # single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE diff --git a/Misc/NEWS b/Misc/NEWS index fde085b527d..0b939456553 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ What's New in Python 3.3 Alpha 1? Core and Builtins ----------------- +- Issue #12216: Allow unexpected EOF errors to happen on any line of the file. + - Issue #12199: The TryExcept and TryFinally and AST nodes have been unified into a Try node. diff --git a/Parser/parsetok.c b/Parser/parsetok.c index eef650ac544..431a87cba7a 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -232,7 +232,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, PyParser_Delete(ps); if (n == NULL) { - if (tok->lineno <= 1 && tok->done == E_EOF) + if (tok->done == E_EOF) err_ret->error = E_EOF; err_ret->lineno = tok->lineno; if (tok->buf != NULL) {