Skip to content

Commit 66f8932

Browse files
committed
Check for missing reachability of the (theoretical) else body instead of just asking whether the if body's first statement is a return statement.
1 parent b8d726e commit 66f8932

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

mypy/checker.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5022,13 +5022,12 @@ def visit_if_stmt(self, s: IfStmt) -> None:
50225022

50235023
if_map, else_map = self.find_isinstance_check(e)
50245024

5025-
self._visit_if_stmt_redundant_expr_helper(
5026-
stmt=s, expr=e, body=b, if_map=if_map, else_map=else_map
5027-
)
5028-
50295025
with self.binder.frame_context(can_skip=True, fall_through=2):
50305026
self.push_type_map(if_map, from_assignment=False)
50315027
self.accept(b)
5028+
self._visit_if_stmt_redundant_expr_helper(
5029+
s, e, b, if_map, else_map, self.binder.frames[-1].unreachable
5030+
)
50325031

50335032
self.push_type_map(else_map, from_assignment=False)
50345033

@@ -5037,7 +5036,13 @@ def visit_if_stmt(self, s: IfStmt) -> None:
50375036
self.accept(s.else_body)
50385037

50395038
def _visit_if_stmt_redundant_expr_helper(
5040-
self, stmt: IfStmt, expr: Expression, body: Block, if_map: TypeMap, else_map: TypeMap
5039+
self,
5040+
stmt: IfStmt,
5041+
expr: Expression,
5042+
body: Block,
5043+
if_map: TypeMap,
5044+
else_map: TypeMap,
5045+
else_reachable: bool,
50415046
) -> None:
50425047
"""Emits `redundant-expr` errors for if statements that are always true or always false.
50435048
@@ -5066,7 +5071,7 @@ def _filter(body: Block | None) -> bool:
50665071
if stmt.while_stmt:
50675072
if not is_true_literal(expr):
50685073
self.msg.redundant_condition_in_while(True, expr)
5069-
elif not (_filter(stmt.else_body) or isinstance(body.body[0], ReturnStmt)):
5074+
elif not (else_reachable or _filter(stmt.else_body)):
50705075
self.msg.redundant_condition_in_if(True, expr)
50715076

50725077
def visit_while_stmt(self, s: WhileStmt) -> None:

test-data/unit/check-isinstance.test

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3130,12 +3130,14 @@ def f4(x: Literal[1, 2]) -> int:
31303130
if x == 2:
31313131
return 2
31323132

3133-
def f5(x: Literal[1, 2]) -> str:
3133+
def f5(x: Literal[1, 2]) -> int:
31343134
if x == 1:
3135-
y = "a"
3136-
elif x == 2: # E: If condition is always true
3137-
y = "b"
3138-
return y
3135+
return 1
3136+
if x == 2:
3137+
if bool():
3138+
return 2
3139+
else:
3140+
return 3
31393141

31403142
def f6(x: Literal[1]) -> None:
31413143
if x != 1:

0 commit comments

Comments
 (0)