Skip to content

Commit

Permalink
pythongh-119724: Revert "bpo-45759: Better error messages for non-mat…
Browse files Browse the repository at this point in the history
…ching 'elif'/'else' statements (python#29513)" (python#119974)

This reverts commit 1c8f912.
  • Loading branch information
encukou authored Jun 4, 2024
1 parent 105f22e commit 31a4fb3
Show file tree
Hide file tree
Showing 4 changed files with 455 additions and 612 deletions.
5 changes: 0 additions & 5 deletions Grammar/python.gram
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,6 @@ simple_stmt[stmt_ty] (memo):
| &'nonlocal' nonlocal_stmt

compound_stmt[stmt_ty]:
| invalid_compound_stmt
| &('def' | '@' | 'async') function_def
| &'if' if_stmt
| &('class' | '@') class_def
Expand Down Expand Up @@ -1323,10 +1322,6 @@ invalid_import_from_targets:
| token=NEWLINE {
RAISE_SYNTAX_ERROR_STARTING_FROM(token, "Expected one or more names after 'import'") }

invalid_compound_stmt:
| a='elif' named_expression ':' { RAISE_SYNTAX_ERROR_STARTING_FROM(a, "'elif' must match an if-statement here") }
| a='else' ':' { RAISE_SYNTAX_ERROR_STARTING_FROM(a, "'else' must match a valid statement here") }

invalid_with_stmt:
| ['async'] 'with' ','.(expression ['as' star_target])+ NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") }
| ['async'] 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") }
Expand Down
61 changes: 2 additions & 59 deletions Lib/test/test_syntax.py
Original file line number Diff line number Diff line change
Expand Up @@ -1853,28 +1853,6 @@
Traceback (most recent call last):
SyntaxError: positional patterns follow keyword patterns
Non-matching 'elif'/'else' statements:
>>> if a == b:
... ...
... elif a == c:
Traceback (most recent call last):
SyntaxError: 'elif' must match an if-statement here
>>> if x == y:
... ...
... else:
Traceback (most recent call last):
SyntaxError: 'else' must match a valid statement here
>>> elif m == n:
Traceback (most recent call last):
SyntaxError: 'elif' must match an if-statement here
>>> else:
Traceback (most recent call last):
SyntaxError: 'else' must match a valid statement here
Uses of the star operator which should fail:
A[:*b]
Expand Down Expand Up @@ -2167,8 +2145,8 @@ def _check_error(self, code, errtext,
lineno=None, offset=None, end_lineno=None, end_offset=None):
"""Check that compiling code raises SyntaxError with errtext.
errtext is a regular expression that must be present in the
test of the exception raised. If subclass is specified, it
errtest is a regular expression that must be present in the
test of the exception raised. If subclass is specified it
is the expected subclass of SyntaxError (e.g. IndentationError).
"""
try:
Expand All @@ -2192,22 +2170,6 @@ def _check_error(self, code, errtext,
else:
self.fail("compile() did not raise SyntaxError")

def _check_noerror(self, code,
errtext="compile() raised unexpected SyntaxError",
filename="<testcase>", mode="exec", subclass=None):
"""Check that compiling code does not raise a SyntaxError.
errtext is the message passed to self.fail if there is
a SyntaxError. If the subclass parameter is specified,
it is the subclass of SyntaxError (e.g. IndentationError)
that the raised error is checked against.
"""
try:
compile(code, filename, mode)
except SyntaxError as err:
if (not subclass) or isinstance(err, subclass):
self.fail(errtext)

def test_expression_with_assignment(self):
self._check_error(
"print(end1 + end2 = ' ')",
Expand Down Expand Up @@ -2609,25 +2571,6 @@ def test_syntax_error_on_deeply_nested_blocks(self):
"""
self._check_error(source, "too many statically nested blocks")

def test_syntax_error_non_matching_elif_else_statements(self):
# Check bpo-45759: 'elif' statements that doesn't match an
# if-statement or 'else' statements that doesn't match any
# valid else-able statement (e.g. 'while')
self._check_error(
"elif m == n:\n ...",
"'elif' must match an if-statement here")
self._check_error(
"else:\n ...",
"'else' must match a valid statement here")
self._check_noerror("if a == b:\n ...\nelif a == c:\n ...")
self._check_noerror("if x == y:\n ...\nelse:\n ...")
self._check_error(
"else = 123",
"invalid syntax")
self._check_error(
"elif 55 = 123",
"cannot assign to literal here")

@support.cpython_only
def test_error_on_parser_stack_overflow(self):
source = "-" * 100000 + "4"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Reverted improvements to error messages for ``elif``/``else`` statements not
matching any valid statements, which made in hard to locate the syntax
errors inside those ``elif``/``else`` blocks.
Loading

0 comments on commit 31a4fb3

Please sign in to comment.