summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_compile.py10
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2024-06-07-16-09-04.gh-issue-120225.kuYf9t.rst1
-rw-r--r--Python/flowgraph.c8
3 files changed, 13 insertions, 6 deletions
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index ba0bcc9..ae23aea 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -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
index 0000000..d00b9aa
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2024-06-07-16-09-04.gh-issue-120225.kuYf9t.rst
@@ -0,0 +1 @@
+Fix crash in compiler on empty block at end of exception handler.
diff --git a/Python/flowgraph.c b/Python/flowgraph.c
index 17617e1..aed694a 100644
--- a/Python/flowgraph.c
+++ b/Python/flowgraph.c
@@ -2304,15 +2304,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 */