]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-120225: fix crash in compiler on empty block at end of exception handler...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 7 Jun 2024 22:01:20 +0000 (00:01 +0200)
committerGitHub <noreply@github.com>
Fri, 7 Jun 2024 22:01:20 +0000 (22:01 +0000)
gh-120225: fix crash in compiler on empty block at end of exception handler (GH-120235)
(cherry picked from commit 4fc82b6d3b99f873179937215833e7a573ca7876)

Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
Lib/test/test_compile.py
Misc/NEWS.d/next/Core and Builtins/2024-06-07-16-09-04.gh-issue-120225.kuYf9t.rst [new file with mode: 0644]
Python/flowgraph.c

index 1f4368b15f473c7479e79a07f4d289a8ef3ed957..410cdce692df374774c8d851cafcc869bb2d4613 100644 (file)
@@ -1409,6 +1409,16 @@ class TestSpecifics(unittest.TestCase):
         for kw in ("except", "except*"):
             exec(code % kw, g, l);
 
+    def test_regression_gh_120225(self):
+        async def name_4():
+            match b'':
+                case True:
+                    pass
+                case name_5 if f'e':
+                    {name_3: name_4 async for name_2 in name_5}
+                case []:
+                    pass
+            [[]]
 
 @requires_debug_ranges()
 class TestSourcePositions(unittest.TestCase):
diff --git a/Misc/NEWS.d/next/Core and Builtins/2024-06-07-16-09-04.gh-issue-120225.kuYf9t.rst b/Misc/NEWS.d/next/Core and Builtins/2024-06-07-16-09-04.gh-issue-120225.kuYf9t.rst
new file mode 100644 (file)
index 0000000..d00b9aa
--- /dev/null
@@ -0,0 +1 @@
+Fix crash in compiler on empty block at end of exception handler.
index 83768023a4d870e331ad1b98360f067e34c4c74e..b43cb6b81f3322134a24bc7bb9421c40e946b4a9 100644 (file)
@@ -2276,15 +2276,11 @@ push_cold_blocks_to_end(cfg_builder *g) {
             if (!IS_LABEL(b->b_next->b_label)) {
                 b->b_next->b_label.id = next_lbl++;
             }
-            cfg_instr *prev_instr = basicblock_last_instr(b);
-            // b cannot be empty because at the end of an exception handler
-            // there is always a POP_EXCEPT + RERAISE/RETURN
-            assert(prev_instr);
-
             basicblock_addop(explicit_jump, JUMP_NO_INTERRUPT, b->b_next->b_label.id,
-                             prev_instr->i_loc);
+                             NO_LOCATION);
             explicit_jump->b_cold = 1;
             explicit_jump->b_next = b->b_next;
+            explicit_jump->b_predecessors = 1;
             b->b_next = explicit_jump;
 
             /* set target */