diff --git a/mypy/partially_defined.py b/mypy/partially_defined.py index 9b3e105f64ef..fd322bbf0ad6 100644 --- a/mypy/partially_defined.py +++ b/mypy/partially_defined.py @@ -322,7 +322,10 @@ def process_definition(self, name: str) -> None: # Was this name previously used? If yes, it's a used-before-definition error. refs = self.tracker.pop_undefined_ref(name) for ref in refs: - self.var_used_before_def(name, ref) + if self.loops: + self.variable_may_be_undefined(name, ref) + else: + self.var_used_before_def(name, ref) self.tracker.record_definition(name) def visit_global_decl(self, o: GlobalDecl) -> None: diff --git a/test-data/unit/check-possibly-undefined.test b/test-data/unit/check-possibly-undefined.test index ee7020252de8..c632225c540b 100644 --- a/test-data/unit/check-possibly-undefined.test +++ b/test-data/unit/check-possibly-undefined.test @@ -382,7 +382,7 @@ def f2() -> None: x = 2 w = x # No error. -[case testDefinedDifferentBranchPossiblyUndefined] +[case testPossiblyUndefinedLoop] # flags: --enable-error-code possibly-undefined --enable-error-code used-before-def def f0() -> None: @@ -423,6 +423,11 @@ def f3() -> None: else: y = x # E: Name "x" may be undefined +def f4() -> None: + while int(): + y = x # E: Name "x" may be undefined + x: int = 1 + [case testAssert] # flags: --enable-error-code possibly-undefined def f1() -> int: