]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.11] GH-103971: Fix incorrect locations for code following case blocks
authorTian Gao <gaogaotiantian@hotmail.com>
Fri, 28 Apr 2023 20:08:25 +0000 (13:08 -0700)
committerGitHub <noreply@github.com>
Fri, 28 Apr 2023 20:08:25 +0000 (20:08 +0000)
Lib/test/test_patma.py
Misc/NEWS.d/next/Core and Builtins/2023-04-28-18-57-13.gh-issue-103971.Q3U9lv.rst [new file with mode: 0644]
Python/compile.c

index db198f7715783142aa37037d121a466cefa01550..4153f51714f678e5795680b2b73a4c586fe6973d 100644 (file)
@@ -3151,6 +3151,19 @@ class TestTracing(unittest.TestCase):
         self.assertListEqual(self._trace(f, "go x"), [1, 2, 3])
         self.assertListEqual(self._trace(f, "spam"), [1, 2, 3])
 
+    def test_unreachable_code(self):
+        def f(command):               # 0
+            match command:            # 1
+                case 1:               # 2
+                    if False:         # 3
+                        return 1      # 4
+                case _:               # 5
+                    if False:         # 6
+                        return 0      # 7
+
+        self.assertListEqual(self._trace(f, 1), [1, 2, 3])
+        self.assertListEqual(self._trace(f, 0), [1, 2, 5, 6])
+
     def test_parser_deeply_nested_patterns(self):
         # Deeply nested patterns can cause exponential backtracking when parsing.
         # See gh-93671 for more information.
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-04-28-18-57-13.gh-issue-103971.Q3U9lv.rst b/Misc/NEWS.d/next/Core and Builtins/2023-04-28-18-57-13.gh-issue-103971.Q3U9lv.rst
new file mode 100644 (file)
index 0000000..2d889e9
--- /dev/null
@@ -0,0 +1 @@
+Fix an issue where incorrect locations numbers could be assigned to code following ``case`` blocks.
index 2170e82d4db69ea82df455a759b23229a1123364..f87a423acd1f025dc92654e73cab64d3d654c3f8 100644 (file)
@@ -7057,6 +7057,7 @@ compiler_match_inner(struct compiler *c, stmt_ty s, pattern_context *pc)
             ADDOP(c, POP_TOP);
         }
         VISIT_SEQ(c, stmt, m->body);
+        UNSET_LOC(c);
         ADDOP_JUMP(c, JUMP, end);
         // If the pattern fails to match, we want the line number of the
         // cleanup to be associated with the failed pattern, not the last line
@@ -7081,6 +7082,7 @@ compiler_match_inner(struct compiler *c, stmt_ty s, pattern_context *pc)
             RETURN_IF_FALSE(compiler_jump_if(c, m->guard, end, 0));
         }
         VISIT_SEQ(c, stmt, m->body);
+        UNSET_LOC(c);
     }
     compiler_use_next_block(c, end);
     return 1;