https://github.com/python/cpython/commit/b87aea6b0d299afcc03fc73c55e7b1dda78b9f35
commit: b87aea6b0d299afcc03fc73c55e7b1dda78b9f35
branch: 3.13
author: Miss Islington (bot) <[email protected]>
committer: Yhg1s <[email protected]>
date: 2024-10-04T15:34:20-07:00
summary:

[3.13] gh-124871: fix 'visited' tracking in compiler's reachability analysis 
(GH-124952) (#124977)

gh-124871: fix 'visited' tracking in compiler's reachability analysis 
(GH-124952)
(cherry picked from commit f474391b26aa9208b44ca879f8635409d322f738)

Co-authored-by: Irit Katriel <[email protected]>

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 cdd942b56cb7e5..ed4e6265eac438 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -476,6 +476,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 d12b602e710094..ff70e47370241a 100644
--- a/Python/flowgraph.c
+++ b/Python/flowgraph.c
@@ -960,13 +960,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++;
         }
@@ -976,8 +977,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]

Reply via email to