[Python-checkins] [3.11] gh-101400: Fix incorrect lineno in exception message on contin… (gh-101447)

corona10 webhook-mailer at python.org
Tue Jan 31 09:53:29 EST 2023


https://github.com/python/cpython/commit/0c37ea9abad2eae146ce117eca0503aaedc96c0f
commit: 0c37ea9abad2eae146ce117eca0503aaedc96c0f
branch: 3.11
author: Dong-hee Na <donghee.na at python.org>
committer: corona10 <donghee.na92 at gmail.com>
date: 2023-01-31T23:53:14+09:00
summary:

[3.11] gh-101400: Fix incorrect lineno in exception message on contin… (gh-101447)

files:
A Misc/NEWS.d/next/Core and Builtins/2023-01-30-08-59-47.gh-issue-101400.Di_ZFm.rst
M Lib/test/test_syntax.py
M Python/compile.c

diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py
index 42d36e0b9d81..50168d9200a2 100644
--- a/Lib/test/test_syntax.py
+++ b/Lib/test/test_syntax.py
@@ -1907,9 +1907,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")
@@ -1938,20 +1935,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",
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 000000000000..f3dd783c01e7
--- /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 f4555b35ab95..17d1df2c51e8 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -3259,12 +3259,20 @@ static int
 compiler_break(struct compiler *c)
 {
     struct fblockinfo *loop = NULL;
+    int u_lineno = c->u->u_lineno;
+    int u_col_offset = c->u->u_col_offset;
+    int u_end_lineno = c->u->u_end_lineno;
+    int u_end_col_offset = c->u->u_end_col_offset;
     /* 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 = u_lineno;
+        c->u->u_col_offset = u_col_offset;
+        c->u->u_end_lineno = u_end_lineno;
+        c->u->u_end_col_offset = u_end_col_offset;
         return compiler_error(c, "'break' outside loop");
     }
     if (!compiler_unwind_fblock(c, loop, 0)) {
@@ -3278,12 +3286,20 @@ static int
 compiler_continue(struct compiler *c)
 {
     struct fblockinfo *loop = NULL;
+    int u_lineno = c->u->u_lineno;
+    int u_col_offset = c->u->u_col_offset;
+    int u_end_lineno = c->u->u_end_lineno;
+    int u_end_col_offset = c->u->u_end_col_offset;
     /* 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 = u_lineno;
+        c->u->u_col_offset = u_col_offset;
+        c->u->u_end_lineno = u_end_lineno;
+        c->u->u_end_col_offset = u_end_col_offset;
         return compiler_error(c, "'continue' not properly in loop");
     }
     ADDOP_JUMP(c, JUMP, loop->fb_block);



More information about the Python-checkins mailing list