From 59ed20e3a63e2e7a5a5b521618d1eca75d6d366d Mon Sep 17 00:00:00 2001 From: Jukka Lehtosalo Date: Wed, 23 Mar 2022 15:40:22 +0000 Subject: [PATCH] Let overload item have a wider return type than implementation A wider return type can be useful if a decorator used for the overload implementation gets a more precise return type as part of a typeshed update. Closes #12434. --- mypy/checker.py | 3 ++- test-data/unit/check-overloading.test | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/mypy/checker.py b/mypy/checker.py index e6c22a99c502..a02a877a808f 100644 --- a/mypy/checker.py +++ b/mypy/checker.py @@ -600,7 +600,8 @@ def check_overlapping_overloads(self, defn: OverloadedFuncDef) -> None: self.msg.overloaded_signatures_arg_specific(i + 1, defn.impl) # Is the overload alternative's return type a subtype of the implementation's? - if not is_subtype_no_promote(sig1.ret_type, impl.ret_type): + if not (is_subtype_no_promote(sig1.ret_type, impl.ret_type) or + is_subtype_no_promote(impl.ret_type, sig1.ret_type)): self.msg.overloaded_signatures_ret_specific(i + 1, defn.impl) # Here's the scoop about generators and coroutines. diff --git a/test-data/unit/check-overloading.test b/test-data/unit/check-overloading.test index 0d04074406e6..0f5d992a9b7c 100644 --- a/test-data/unit/check-overloading.test +++ b/test-data/unit/check-overloading.test @@ -6328,3 +6328,15 @@ if True: def f2(x): ... if True: def f2(x): ... # E: Name "f2" already defined on line 17 + +[case testOverloadItemHasMoreGeneralReturnType] +from typing import overload + +@overload +def f() -> object: ... + +@overload +def f(x: int) -> object: ... + +def f(x: int = 0) -> int: + return x