Skip to content

Commit 4eb6b50

Browse files
authored
Treat functions that return None as returning None (#20350)
Fixes #20346 I assume the behaviour here came from the bad old days before strict optional :-)
1 parent f0d6113 commit 4eb6b50

File tree

5 files changed

+33
-17
lines changed

5 files changed

+33
-17
lines changed

mypy/checkexpr.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -666,7 +666,6 @@ def visit_call_expr_inner(self, e: CallExpr, allow_none_return: bool = False) ->
666666
and self.always_returns_none(e.callee)
667667
):
668668
self.chk.msg.does_not_return_value(callee_type, e)
669-
return AnyType(TypeOfAny.from_error)
670669
return ret_type
671670

672671
def check_str_format_call(self, e: CallExpr) -> None:

test-data/unit/check-expressions.test

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,15 +1075,17 @@ class A:
10751075
a: A
10761076
o: object
10771077
if int():
1078-
a = f() # E: "f" does not return a value (it only ever returns None)
1078+
a = f() # E: "f" does not return a value (it only ever returns None) \
1079+
# E: Incompatible types in assignment (expression has type "None", variable has type "A")
10791080
if int():
10801081
o = a() # E: Function does not return a value (it only ever returns None)
10811082
if int():
10821083
o = A().g(a) # E: "g" of "A" does not return a value (it only ever returns None)
10831084
if int():
10841085
o = A.g(a, a) # E: "g" of "A" does not return a value (it only ever returns None)
10851086
A().g(f()) # E: "f" does not return a value (it only ever returns None)
1086-
x: A = f() # E: "f" does not return a value (it only ever returns None)
1087+
x: A = f() # E: "f" does not return a value (it only ever returns None) \
1088+
# E: Incompatible types in assignment (expression has type "None", variable has type "A")
10871089
f()
10881090
A().g(a)
10891091
[builtins fixtures/tuple.pyi]
@@ -1100,7 +1102,8 @@ while f(): # E: "f" does not return a value (it only ever returns None)
11001102
pass
11011103
def g() -> object:
11021104
return f() # E: "f" does not return a value (it only ever returns None)
1103-
raise f() # E: "f" does not return a value (it only ever returns None)
1105+
raise f() # E: Exception must be derived from BaseException \
1106+
# E: "f" does not return a value (it only ever returns None)
11041107
[builtins fixtures/exception.pyi]
11051108

11061109
[case testNoneReturnTypeWithExpressions]
@@ -1112,12 +1115,16 @@ class A:
11121115

11131116
a: A
11141117
[f()] # E: "f" does not return a value (it only ever returns None)
1115-
f() + a # E: "f" does not return a value (it only ever returns None)
1116-
a + f() # E: "f" does not return a value (it only ever returns None)
1118+
f() + a # E: "f" does not return a value (it only ever returns None) \
1119+
# E: Unsupported left operand type for + ("None")
1120+
a + f() # E: "f" does not return a value (it only ever returns None) \
1121+
# E: Unsupported operand types for + ("A" and "None")
11171122
f() == a # E: "f" does not return a value (it only ever returns None)
1118-
a != f() # E: "f" does not return a value (it only ever returns None)
1123+
a != f() # E: Unsupported left operand type for != ("A") \
1124+
# E: "f" does not return a value (it only ever returns None)
11191125
cast(A, f())
1120-
f().foo # E: "f" does not return a value (it only ever returns None)
1126+
f().foo # E: "f" does not return a value (it only ever returns None) \
1127+
# E: "None" has no attribute "foo"
11211128
[builtins fixtures/list.pyi]
11221129

11231130
[case testNoneReturnTypeWithExpressions2]
@@ -1130,11 +1137,16 @@ class A:
11301137

11311138
a: A
11321139
b: bool
1133-
f() in a # E: "f" does not return a value (it only ever returns None) # E: Unsupported right operand type for in ("A")
1134-
a < f() # E: "f" does not return a value (it only ever returns None)
1135-
f() <= a # E: "f" does not return a value (it only ever returns None)
1136-
a in f() # E: "f" does not return a value (it only ever returns None)
1137-
-f() # E: "f" does not return a value (it only ever returns None)
1140+
f() in a # E: "f" does not return a value (it only ever returns None) \
1141+
# E: Unsupported right operand type for in ("A")
1142+
a < f() # E: Unsupported left operand type for < ("A") \
1143+
# E: "f" does not return a value (it only ever returns None)
1144+
f() <= a # E: "f" does not return a value (it only ever returns None) \
1145+
# E: Unsupported left operand type for <= ("None")
1146+
a in f() # E: Unsupported right operand type for in ("None") \
1147+
# E: "f" does not return a value (it only ever returns None)
1148+
-f() # E: Unsupported operand type for unary - ("None") \
1149+
# E: "f" does not return a value (it only ever returns None)
11381150
not f() # E: "f" does not return a value (it only ever returns None)
11391151
f() and b # E: "f" does not return a value (it only ever returns None)
11401152
b or f() # E: "f" does not return a value (it only ever returns None)

test-data/unit/check-inference.test

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1180,7 +1180,8 @@ for e, f in [[]]: # E: Need type annotation for "e" \
11801180
[case testForStatementInferenceWithVoid]
11811181
def f() -> None: pass
11821182

1183-
for x in f(): # E: "f" does not return a value (it only ever returns None)
1183+
for x in f(): # E: "f" does not return a value (it only ever returns None) \
1184+
# E: "None" has no attribute "__iter__" (not iterable)
11841185
pass
11851186
[builtins fixtures/for.pyi]
11861187

@@ -2176,6 +2177,7 @@ arr.append(arr.append(1))
21762177
[builtins fixtures/list.pyi]
21772178
[out]
21782179
main:3: error: "append" of "list" does not return a value (it only ever returns None)
2180+
main:3: error: Argument 1 to "append" of "list" has incompatible type "None"; expected "int"
21792181

21802182
-- Multipass
21812183
-- ---------

test-data/unit/check-optional.test

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,8 @@ def g(x: Optional[int]) -> int:
365365
pass
366366

367367
x = f() # E: "f" does not return a value (it only ever returns None)
368-
f() + 1 # E: "f" does not return a value (it only ever returns None)
368+
f() + 1 # E: "f" does not return a value (it only ever returns None) \
369+
# E: Unsupported left operand type for + ("None")
369370
g(f()) # E: "f" does not return a value (it only ever returns None)
370371

371372
[case testEmptyReturn]

test-data/unit/check-varargs.test

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,10 @@ c: C
5252

5353
f(c) # E: Argument 1 to "f" has incompatible type "C"; expected "A"
5454
f(a, b, c) # E: Argument 3 to "f" has incompatible type "C"; expected "A"
55-
f(g()) # E: "g" does not return a value (it only ever returns None)
56-
f(a, g()) # E: "g" does not return a value (it only ever returns None)
55+
f(g()) # E: "g" does not return a value (it only ever returns None) \
56+
# E: Argument 1 to "f" has incompatible type "None"; expected "A"
57+
f(a, g()) # E: "g" does not return a value (it only ever returns None) \
58+
# E: Argument 2 to "f" has incompatible type "None"; expected "A"
5759
f()
5860
f(a)
5961
f(b)

0 commit comments

Comments
 (0)