diff --git a/crates/ruff_linter/resources/test/fixtures/control-flow-graph/for.py b/crates/ruff_linter/resources/test/fixtures/control-flow-graph/for.py index 2de8d6be96e8fb..cb078c059e62d2 100644 --- a/crates/ruff_linter/resources/test/fixtures/control-flow-graph/for.py +++ b/crates/ruff_linter/resources/test/fixtures/control-flow-graph/for.py @@ -60,3 +60,12 @@ def func(): pass else: pass + +def func(): + for i in range(3): + if i == 2: + assert i is not None + break + else: + raise Exception() + x = 0 diff --git a/crates/ruff_linter/src/rules/ruff/rules/snapshots/ruff_linter__rules__ruff__rules__unreachable__tests__for.py.md.snap b/crates/ruff_linter/src/rules/ruff/rules/snapshots/ruff_linter__rules__ruff__rules__unreachable__tests__for.py.md.snap index 28275f5088c38c..797086ce82ffd0 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/snapshots/ruff_linter__rules__ruff__rules__unreachable__tests__for.py.md.snap +++ b/crates/ruff_linter/src/rules/ruff/rules/snapshots/ruff_linter__rules__ruff__rules__unreachable__tests__for.py.md.snap @@ -355,3 +355,51 @@ flowchart TD block1 --> block0 block0 --> return ``` + +## Function 11 +### Source +```python +def func(): + for i in range(3): + if i == 2: + assert i is not None + break + else: + raise Exception() + x = 0 +``` + +### Control Flow Graph +```mermaid +flowchart TD + start(("Start")) + return(("End")) + block0["x = 0\n"] + block1["raise Exception()\n"] + block2[["Loop continue"]] + block3["break\n"] + block4[["Exception raised"]] + block5["assert i is not None\n"] + block6["if i == 2: + assert i is not None + break\n"] + block7["for i in range(3): + if i == 2: + assert i is not None + break + else: + raise Exception()\n"] + + start --> block7 + block7 -- "range(3)" --> block6 + block7 -- "else" --> block1 + block6 -- "i == 2" --> block5 + block6 -- "else" --> block2 + block5 -- "i is not None" --> block3 + block5 -- "else" --> block4 + block4 --> return + block3 --> block0 + block2 --> block7 + block1 --> return + block0 --> return +``` diff --git a/crates/ruff_linter/src/rules/ruff/rules/unreachable.rs b/crates/ruff_linter/src/rules/ruff/rules/unreachable.rs index 120231ce55aae7..32a14bf797c5a2 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unreachable.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unreachable.rs @@ -894,13 +894,17 @@ impl<'stmt> BasicBlocksBuilder<'stmt> { match block.stmts.last() { Some(Stmt::For(_) | Stmt::While(_)) => { self.post_process(next, Some(idx), exit, exit); + idx = orelse; + } + Some(Stmt::Assert(_)) => { + self.post_process(orelse, loop_start, loop_exit, exit); + idx = next; } _ => { self.post_process(next, loop_start, loop_exit, exit); + idx = orelse; } }; - - idx = orelse; } NextBlock::Terminate => return, }