https://github.com/python/cpython/commit/f474391b26aa9208b44ca879f8635409d322f738
commit: f474391b26aa9208b44ca879f8635409d322f738
branch: main
author: Irit Katriel <[email protected]>
committer: iritkatriel <[email protected]>
date: 2024-10-04T17:37:38+01:00
summary:
gh-124871: fix 'visited' tracking in compiler's reachability analysis (#124952)
files:
A Misc/NEWS.d/next/Core and
Builtins/2024-10-03-22-26-39.gh-issue-124871.tAMF47.rst
M Lib/test/test_compile.py
M Python/flowgraph.c
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index e9ee72cf234fdc..e6dc7a53189e12 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -479,6 +479,19 @@ def test_dead_code_with_except_handler_compiles(self):
x = 2
"""), '<eval>', 'exec')
+ def test_try_except_in_while_with_chained_condition_compiles(self):
+ # see gh-124871
+ compile(textwrap.dedent("""
+ name_1, name_2, name_3 = 1, 2, 3
+ while name_3 <= name_2 > name_1:
+ try:
+ raise
+ except:
+ pass
+ finally:
+ pass
+ """), '<eval>', 'exec')
+
def test_compile_invalid_namedexpr(self):
# gh-109351
m = ast.Module(
diff --git a/Misc/NEWS.d/next/Core and
Builtins/2024-10-03-22-26-39.gh-issue-124871.tAMF47.rst b/Misc/NEWS.d/next/Core
and Builtins/2024-10-03-22-26-39.gh-issue-124871.tAMF47.rst
new file mode 100644
index 00000000000000..185cb3048fadf5
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and
Builtins/2024-10-03-22-26-39.gh-issue-124871.tAMF47.rst
@@ -0,0 +1,2 @@
+Fix compiler bug (in some versions of 3.13) where an assertion fails during
reachability
+analysis.
diff --git a/Python/flowgraph.c b/Python/flowgraph.c
index 69d7e0a872aa48..388862912d6826 100644
--- a/Python/flowgraph.c
+++ b/Python/flowgraph.c
@@ -1001,13 +1001,14 @@ remove_unreachable(basicblock *entryblock) {
basicblock **sp = stack;
entryblock->b_predecessors = 1;
*sp++ = entryblock;
+ entryblock->b_visited = 1;
while (sp > stack) {
basicblock *b = *(--sp);
- b->b_visited = 1;
if (b->b_next && BB_HAS_FALLTHROUGH(b)) {
if (!b->b_next->b_visited) {
assert(b->b_next->b_predecessors == 0);
*sp++ = b->b_next;
+ b->b_next->b_visited = 1;
}
b->b_next->b_predecessors++;
}
@@ -1017,8 +1018,8 @@ remove_unreachable(basicblock *entryblock) {
if (is_jump(instr) || is_block_push(instr)) {
target = instr->i_target;
if (!target->b_visited) {
- assert(target->b_predecessors == 0 || target == b->b_next);
*sp++ = target;
+ target->b_visited = 1;
}
target->b_predecessors++;
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]