diff --git a/Lib/test/test_patma.py b/Lib/test/test_patma.py index db198f77157831..4153f51714f678 100644 --- a/Lib/test/test_patma.py +++ b/Lib/test/test_patma.py @@ -3151,6 +3151,19 @@ def f(command): # 0 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 index 00000000000000..2d889e9906346b --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-04-28-18-57-13.gh-issue-103971.Q3U9lv.rst @@ -0,0 +1 @@ +Fix an issue where incorrect locations numbers could be assigned to code following ``case`` blocks. diff --git a/Python/compile.c b/Python/compile.c index 2170e82d4db69e..f87a423acd1f02 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -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;