mirror of
https://github.com/python/cpython
synced 2024-10-17 03:18:24 +00:00
gh-101400: Fix incorrect lineno in exception message on continue/break which are not in a loop (#101413)
This commit is contained in:
parent
28db978d7f
commit
e867c1b753
|
@ -1957,9 +1957,6 @@ def error2():
|
||||||
"""
|
"""
|
||||||
self._check_error(source, "parameter and nonlocal", lineno=3)
|
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):
|
def test_yield_outside_function(self):
|
||||||
self._check_error("if 0: yield", "outside function")
|
self._check_error("if 0: yield", "outside function")
|
||||||
self._check_error("if 0: yield\nelse: x=1", "outside function")
|
self._check_error("if 0: yield\nelse: x=1", "outside function")
|
||||||
|
@ -1988,20 +1985,27 @@ def test_return_outside_function(self):
|
||||||
"outside function")
|
"outside function")
|
||||||
|
|
||||||
def test_break_outside_loop(self):
|
def test_break_outside_loop(self):
|
||||||
self._check_error("if 0: break", "outside loop")
|
msg = "outside loop"
|
||||||
self._check_error("if 0: break\nelse: x=1", "outside loop")
|
self._check_error("break", msg, lineno=1)
|
||||||
self._check_error("if 1: pass\nelse: break", "outside loop")
|
self._check_error("if 0: break", msg, lineno=1)
|
||||||
self._check_error("class C:\n if 0: break", "outside loop")
|
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",
|
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):
|
def test_continue_outside_loop(self):
|
||||||
self._check_error("if 0: continue", "not properly in loop")
|
msg = "not properly in loop"
|
||||||
self._check_error("if 0: continue\nelse: x=1", "not properly in loop")
|
self._check_error("if 0: continue", msg, lineno=1)
|
||||||
self._check_error("if 1: pass\nelse: continue", "not properly in loop")
|
self._check_error("if 0: continue\nelse: x=1", msg, lineno=1)
|
||||||
self._check_error("class C:\n if 0: continue", "not properly in loop")
|
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",
|
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):
|
def test_unexpected_indent(self):
|
||||||
self._check_error("foo()\n bar()\n", "unexpected indent",
|
self._check_error("foo()\n bar()\n", "unexpected indent",
|
||||||
|
|
|
@ -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.
|
|
@ -3246,11 +3246,12 @@ static int
|
||||||
compiler_break(struct compiler *c, location loc)
|
compiler_break(struct compiler *c, location loc)
|
||||||
{
|
{
|
||||||
struct fblockinfo *loop = NULL;
|
struct fblockinfo *loop = NULL;
|
||||||
|
location origin_loc = loc;
|
||||||
/* Emit instruction with line number */
|
/* Emit instruction with line number */
|
||||||
ADDOP(c, loc, NOP);
|
ADDOP(c, loc, NOP);
|
||||||
RETURN_IF_ERROR(compiler_unwind_fblock_stack(c, &loc, 0, &loop));
|
RETURN_IF_ERROR(compiler_unwind_fblock_stack(c, &loc, 0, &loop));
|
||||||
if (loop == NULL) {
|
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));
|
RETURN_IF_ERROR(compiler_unwind_fblock(c, &loc, loop, 0));
|
||||||
ADDOP_JUMP(c, loc, JUMP, loop->fb_exit);
|
ADDOP_JUMP(c, loc, JUMP, loop->fb_exit);
|
||||||
|
@ -3261,11 +3262,12 @@ static int
|
||||||
compiler_continue(struct compiler *c, location loc)
|
compiler_continue(struct compiler *c, location loc)
|
||||||
{
|
{
|
||||||
struct fblockinfo *loop = NULL;
|
struct fblockinfo *loop = NULL;
|
||||||
|
location origin_loc = loc;
|
||||||
/* Emit instruction with line number */
|
/* Emit instruction with line number */
|
||||||
ADDOP(c, loc, NOP);
|
ADDOP(c, loc, NOP);
|
||||||
RETURN_IF_ERROR(compiler_unwind_fblock_stack(c, &loc, 0, &loop));
|
RETURN_IF_ERROR(compiler_unwind_fblock_stack(c, &loc, 0, &loop));
|
||||||
if (loop == NULL) {
|
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);
|
ADDOP_JUMP(c, loc, JUMP, loop->fb_block);
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
|
|
Loading…
Reference in a new issue