Skip to content

Commit b1388e0

Browse files
authored
[used-before-def] fix false positive inside loop (#14307)
A similar case was addressed in #14176 but I missed the part where it doesn't need to be defined in a different branch. This makes the fix more complete.
1 parent 96ac8b3 commit b1388e0

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

mypy/partially_defined.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,10 @@ def process_definition(self, name: str) -> None:
322322
# Was this name previously used? If yes, it's a used-before-definition error.
323323
refs = self.tracker.pop_undefined_ref(name)
324324
for ref in refs:
325-
self.var_used_before_def(name, ref)
325+
if self.loops:
326+
self.variable_may_be_undefined(name, ref)
327+
else:
328+
self.var_used_before_def(name, ref)
326329
self.tracker.record_definition(name)
327330

328331
def visit_global_decl(self, o: GlobalDecl) -> None:

test-data/unit/check-possibly-undefined.test

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ def f2() -> None:
382382
x = 2
383383
w = x # No error.
384384

385-
[case testDefinedDifferentBranchPossiblyUndefined]
385+
[case testPossiblyUndefinedLoop]
386386
# flags: --enable-error-code possibly-undefined --enable-error-code used-before-def
387387

388388
def f0() -> None:
@@ -423,6 +423,11 @@ def f3() -> None:
423423
else:
424424
y = x # E: Name "x" may be undefined
425425

426+
def f4() -> None:
427+
while int():
428+
y = x # E: Name "x" may be undefined
429+
x: int = 1
430+
426431
[case testAssert]
427432
# flags: --enable-error-code possibly-undefined
428433
def f1() -> int:

0 commit comments

Comments
 (0)