diff --git a/mypy/checker.py b/mypy/checker.py index b8d5bbd4fa2d..ac4b24709783 100644 --- a/mypy/checker.py +++ b/mypy/checker.py @@ -1108,6 +1108,7 @@ def check_func_item( """ self.dynamic_funcs.append(defn.is_dynamic() and not type_override) + enclosing_node_deferred = self.current_node_deferred with self.enter_partial_types(is_function=True): typ = self.function_type(defn) if type_override: @@ -1119,7 +1120,7 @@ def check_func_item( raise RuntimeError("Not supported") self.dynamic_funcs.pop() - self.current_node_deferred = False + self.current_node_deferred = enclosing_node_deferred if name == "__exit__": self.check__exit__return_type(defn) @@ -5341,6 +5342,7 @@ def check_for_untyped_decorator( self.options.disallow_untyped_decorators and is_typed_callable(func.type) and is_untyped_decorator(dec_type) + and not self.current_node_deferred ): self.msg.typed_function_untyped_decorator(func.name, dec_expr) diff --git a/test-data/unit/check-inference.test b/test-data/unit/check-inference.test index ff351686dfc2..42b5a05ab39a 100644 --- a/test-data/unit/check-inference.test +++ b/test-data/unit/check-inference.test @@ -3945,3 +3945,21 @@ def deco(fn: Callable[[], T]) -> Callable[[], T]: ... @deco def defer() -> int: ... + +[case testVariableDeferredWithNestedFunction] +from typing import Callable, TypeVar + +T = TypeVar("T") +def deco(fn: Callable[[], T]) -> Callable[[], T]: ... + +@deco +def f() -> None: + x = 1 + f() # defer current node + x = x + + def nested() -> None: + ... + + # The type below should not be Any. + reveal_type(x) # N: Revealed type is "builtins.int"