Skip to content

Commit

Permalink
pythongh-101400: Fix incorrect lineno in exception message on continu…
Browse files Browse the repository at this point in the history
…e/break which are not in a loop (python#101413)
  • Loading branch information
corona10 authored and mdboom committed Jan 31, 2023
1 parent 315aed1 commit bf770d4
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 15 deletions.
30 changes: 17 additions & 13 deletions Lib/test/test_syntax.py
Original file line number Diff line number Diff line change
Expand Up @@ -1957,9 +1957,6 @@ def error2():
"""
self._check_error(source, "parameter and nonlocal", lineno=3)

def test_break_outside_loop(self):
self._check_error("break", "outside loop")

def test_yield_outside_function(self):
self._check_error("if 0: yield", "outside function")
self._check_error("if 0: yield\nelse: x=1", "outside function")
Expand Down Expand Up @@ -1988,20 +1985,27 @@ def test_return_outside_function(self):
"outside function")

def test_break_outside_loop(self):
self._check_error("if 0: break", "outside loop")
self._check_error("if 0: break\nelse: x=1", "outside loop")
self._check_error("if 1: pass\nelse: break", "outside loop")
self._check_error("class C:\n if 0: break", "outside loop")
msg = "outside loop"
self._check_error("break", msg, lineno=1)
self._check_error("if 0: break", msg, lineno=1)
self._check_error("if 0: break\nelse: x=1", msg, lineno=1)
self._check_error("if 1: pass\nelse: break", msg, lineno=2)
self._check_error("class C:\n if 0: break", msg, lineno=2)
self._check_error("class C:\n if 1: pass\n else: break",
"outside loop")
msg, lineno=3)
self._check_error("with object() as obj:\n break",
msg, lineno=2)

def test_continue_outside_loop(self):
self._check_error("if 0: continue", "not properly in loop")
self._check_error("if 0: continue\nelse: x=1", "not properly in loop")
self._check_error("if 1: pass\nelse: continue", "not properly in loop")
self._check_error("class C:\n if 0: continue", "not properly in loop")
msg = "not properly in loop"
self._check_error("if 0: continue", msg, lineno=1)
self._check_error("if 0: continue\nelse: x=1", msg, lineno=1)
self._check_error("if 1: pass\nelse: continue", msg, lineno=2)
self._check_error("class C:\n if 0: continue", msg, lineno=2)
self._check_error("class C:\n if 1: pass\n else: continue",
"not properly in loop")
msg, lineno=3)
self._check_error("with object() as obj:\n continue",
msg, lineno=2)

def test_unexpected_indent(self):
self._check_error("foo()\n bar()\n", "unexpected indent",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix wrong lineno in exception message on :keyword:`continue` or
:keyword:`break` which are not in a loop. Patch by Dong-hee Na.
6 changes: 4 additions & 2 deletions Python/compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -3246,11 +3246,12 @@ static int
compiler_break(struct compiler *c, location loc)
{
struct fblockinfo *loop = NULL;
location origin_loc = loc;
/* Emit instruction with line number */
ADDOP(c, loc, NOP);
RETURN_IF_ERROR(compiler_unwind_fblock_stack(c, &loc, 0, &loop));
if (loop == NULL) {
return compiler_error(c, loc, "'break' outside loop");
return compiler_error(c, origin_loc, "'break' outside loop");
}
RETURN_IF_ERROR(compiler_unwind_fblock(c, &loc, loop, 0));
ADDOP_JUMP(c, loc, JUMP, loop->fb_exit);
Expand All @@ -3261,11 +3262,12 @@ static int
compiler_continue(struct compiler *c, location loc)
{
struct fblockinfo *loop = NULL;
location origin_loc = loc;
/* Emit instruction with line number */
ADDOP(c, loc, NOP);
RETURN_IF_ERROR(compiler_unwind_fblock_stack(c, &loc, 0, &loop));
if (loop == NULL) {
return compiler_error(c, loc, "'continue' not properly in loop");
return compiler_error(c, origin_loc, "'continue' not properly in loop");
}
ADDOP_JUMP(c, loc, JUMP, loop->fb_block);
return SUCCESS;
Expand Down

0 comments on commit bf770d4

Please sign in to comment.