diff --git a/mypy/checkexpr.py b/mypy/checkexpr.py index 54d5f19d164e..47e6f0cc1a94 100644 --- a/mypy/checkexpr.py +++ b/mypy/checkexpr.py @@ -150,7 +150,9 @@ def analyze_ref_expr(self, e: RefExpr, lvalue: bool = False) -> Type: elif isinstance(node, FuncDef): # Reference to a global function. result = function_type(node, self.named_type('builtins.function')) - elif isinstance(node, OverloadedFuncDef): + elif isinstance(node, OverloadedFuncDef) and node.type is not None: + # node.type is None when there are multiple definitions of a function + # and it's decorated by somthing that is not typing.overload result = node.type elif isinstance(node, TypeInfo): # Reference to a type object. diff --git a/test-data/unit/check-overloading.test b/test-data/unit/check-overloading.test index e7811fc8e350..def88186a74f 100644 --- a/test-data/unit/check-overloading.test +++ b/test-data/unit/check-overloading.test @@ -1,4 +1,26 @@ -- Test cases for function overloading +[case testOverloadNotImportedNoCrash] +@overload +def f(a): pass +@overload +def f(a): pass +def f(a): pass +f(0) + +@overload # E: Name 'overload' is not defined +def g(a:int): pass +def g(a): pass # E: Name 'g' already defined +g(0) + +@something # E: Name 'something' is not defined +def r(a:int): pass +def r(a): pass # E: Name 'r' already defined +r(0) +[out] +main:1: error: Name 'overload' is not defined +main:3: error: Name 'f' already defined +main:3: error: Name 'overload' is not defined +main:5: error: Name 'f' already defined [case testTypeCheckOverloadWithImplementation] from typing import overload, Any