mirror of https://github.com/python/cpython
bpo-40847: Consider a line with only a LINECONT a blank line (GH-20769)
A line with only a line continuation character should be considered a blank line at tokenizer level so that only a single NEWLINE token gets emitted. The old parser was working around the issue, but the new parser threw a `SyntaxError` for valid input. For example, an empty line following a line continuation character was interpreted as a `SyntaxError`. Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
This commit is contained in:
parent
7f888c7ef9
commit
896f4cf63f
|
@ -153,6 +153,13 @@ TEST_CASES = [
|
||||||
('dict_comp', '{x:1 for x in a}'),
|
('dict_comp', '{x:1 for x in a}'),
|
||||||
('dict_comp_if', '{x:1+2 for x in a if b}'),
|
('dict_comp_if', '{x:1+2 for x in a if b}'),
|
||||||
('dict_empty', '{}'),
|
('dict_empty', '{}'),
|
||||||
|
('empty_line_after_linecont',
|
||||||
|
r'''
|
||||||
|
pass
|
||||||
|
\
|
||||||
|
|
||||||
|
pass
|
||||||
|
'''),
|
||||||
('for',
|
('for',
|
||||||
'''
|
'''
|
||||||
for i in a:
|
for i in a:
|
||||||
|
|
|
@ -858,6 +858,20 @@ class SyntaxTestCase(unittest.TestCase):
|
||||||
"iterable argument unpacking follows "
|
"iterable argument unpacking follows "
|
||||||
"keyword argument unpacking")
|
"keyword argument unpacking")
|
||||||
|
|
||||||
|
def test_empty_line_after_linecont(self):
|
||||||
|
# See issue-40847
|
||||||
|
s = r"""\
|
||||||
|
pass
|
||||||
|
\
|
||||||
|
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
compile(s, '<string>', 'exec')
|
||||||
|
except SyntaxError:
|
||||||
|
self.fail("Empty line after a line continuation character is valid.")
|
||||||
|
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
support.run_unittest(SyntaxTestCase)
|
support.run_unittest(SyntaxTestCase)
|
||||||
from test import test_syntax
|
from test import test_syntax
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
Fix a bug where a line with only a line continuation character is not considered a blank line at tokenizer level.
|
||||||
|
In such cases, more than a single `NEWLINE` token was emitted. The old parser was working around the issue,
|
||||||
|
but the new parser threw a :exc:`SyntaxError` for valid input due to this. For example, an empty line following
|
||||||
|
a line continuation character was interpreted as a :exc:`SyntaxError`.
|
|
@ -1203,8 +1203,9 @@ tok_get(struct tok_state *tok, const char **p_start, const char **p_end)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tok_backup(tok, c);
|
tok_backup(tok, c);
|
||||||
if (c == '#' || c == '\n') {
|
if (c == '#' || c == '\n' || c == '\\') {
|
||||||
/* Lines with only whitespace and/or comments
|
/* Lines with only whitespace and/or comments
|
||||||
|
and/or a line continuation character
|
||||||
shouldn't affect the indentation and are
|
shouldn't affect the indentation and are
|
||||||
not passed to the parser as NEWLINE tokens,
|
not passed to the parser as NEWLINE tokens,
|
||||||
except *totally* empty lines in interactive
|
except *totally* empty lines in interactive
|
||||||
|
|
Loading…
Reference in New Issue