summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDong-hee Na <donghee.na@python.org>2023-01-31 14:42:22 (GMT)
committerGitHub <noreply@github.com>2023-01-31 14:42:22 (GMT)
commit740050af0493030b1f6ebf0b9ac39a356e2e74b6 (patch)
tree322b8915045b9d9fe03a69982efc5558306714ad
parent71db9c9ea50ccba47a3c1e31334747049a68487b (diff)
downloadcpython-740050af0493030b1f6ebf0b9ac39a356e2e74b6.zip
cpython-740050af0493030b1f6ebf0b9ac39a356e2e74b6.tar.gz
cpython-740050af0493030b1f6ebf0b9ac39a356e2e74b6.tar.bz2
[3.10] gh-101400: Fix incorrect lineno in exception message on contin… (gh-101448)
-rw-r--r--Lib/test/test_syntax.py30
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2023-01-30-08-59-47.gh-issue-101400.Di_ZFm.rst2
-rw-r--r--Python/compile.c4
3 files changed, 23 insertions, 13 deletions
diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py
index cd09d1e..5ab3ec6c 100644
--- a/Lib/test/test_syntax.py
+++ b/Lib/test/test_syntax.py
@@ -1410,9 +1410,6 @@ class SyntaxTestCase(unittest.TestCase):
"""
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")
@@ -1441,20 +1438,27 @@ class SyntaxTestCase(unittest.TestCase):
"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",
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-01-30-08-59-47.gh-issue-101400.Di_ZFm.rst b/Misc/NEWS.d/next/Core and Builtins/2023-01-30-08-59-47.gh-issue-101400.Di_ZFm.rst
new file mode 100644
index 0000000..f3dd783
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2023-01-30-08-59-47.gh-issue-101400.Di_ZFm.rst
@@ -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.
diff --git a/Python/compile.c b/Python/compile.c
index e5438f7..80caa8f 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -3030,12 +3030,14 @@ static int
compiler_break(struct compiler *c)
{
struct fblockinfo *loop = NULL;
+ int origin_loc = c->u->u_lineno;
/* Emit instruction with line number */
ADDOP(c, NOP);
if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
return 0;
}
if (loop == NULL) {
+ c->u->u_lineno = origin_loc;
return compiler_error(c, "'break' outside loop");
}
if (!compiler_unwind_fblock(c, loop, 0)) {
@@ -3050,12 +3052,14 @@ static int
compiler_continue(struct compiler *c)
{
struct fblockinfo *loop = NULL;
+ int origin_loc = c->u->u_lineno;
/* Emit instruction with line number */
ADDOP(c, NOP);
if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
return 0;
}
if (loop == NULL) {
+ c->u->u_lineno = origin_loc;
return compiler_error(c, "'continue' not properly in loop");
}
ADDOP_JUMP(c, JUMP_ABSOLUTE, loop->fb_block);