@@ -5173,3 +5173,160 @@ def f2(g: G[A, Any]) -> A: ... # E: Overloaded function signatures 1 and 2 over
5173
5173
@overload
5174
5174
def f2(g: G[A, B], x: int = ...) -> B: ...
5175
5175
def f2(g: Any, x: int = ...) -> Any: ...
5176
+
5177
+ [case testOverloadIfBasic]
5178
+ # flags: --always-true True
5179
+ from typing import overload, Any
5180
+
5181
+ class A: ...
5182
+ class B: ...
5183
+
5184
+ @overload
5185
+ def f1(g: int) -> A: ...
5186
+ if True:
5187
+ @overload
5188
+ def f1(g: str) -> B: ...
5189
+ def f1(g: Any) -> Any: ...
5190
+ reveal_type(f1(42)) # N: Revealed type is "__main__.A"
5191
+ reveal_type(f1("Hello")) # N: Revealed type is "__main__.B"
5192
+
5193
+ @overload
5194
+ def f2(g: int) -> A: ...
5195
+ @overload
5196
+ def f2(g: bytes) -> A: ...
5197
+ if not True:
5198
+ @overload
5199
+ def f2(g: str) -> B: ...
5200
+ def f2(g: Any) -> Any: ...
5201
+ reveal_type(f2(42)) # N: Revealed type is "__main__.A"
5202
+ reveal_type(f2("Hello")) # E: No overload variant of "f2" matches argument type "str" \
5203
+ # N: Possible overload variants: \
5204
+ # N: def f2(g: int) -> A \
5205
+ # N: def f2(g: bytes) -> A \
5206
+ # N: Revealed type is "Any"
5207
+
5208
+ [case testOverloadIfSysVersion]
5209
+ # flags: --python-version 3.9
5210
+ from typing import overload, Any
5211
+ import sys
5212
+
5213
+ class A: ...
5214
+ class B: ...
5215
+
5216
+ @overload
5217
+ def f1(g: int) -> A: ...
5218
+ if sys.version_info >= (3, 9):
5219
+ @overload
5220
+ def f1(g: str) -> B: ...
5221
+ def f1(g: Any) -> Any: ...
5222
+ reveal_type(f1(42)) # N: Revealed type is "__main__.A"
5223
+ reveal_type(f1("Hello")) # N: Revealed type is "__main__.B"
5224
+
5225
+ @overload
5226
+ def f2(g: int) -> A: ...
5227
+ @overload
5228
+ def f2(g: bytes) -> A: ...
5229
+ if sys.version_info >= (3, 10):
5230
+ @overload
5231
+ def f2(g: str) -> B: ...
5232
+ def f2(g: Any) -> Any: ...
5233
+ reveal_type(f2(42)) # N: Revealed type is "__main__.A"
5234
+ reveal_type(f2("Hello")) # E: No overload variant of "f2" matches argument type "str" \
5235
+ # N: Possible overload variants: \
5236
+ # N: def f2(g: int) -> A \
5237
+ # N: def f2(g: bytes) -> A \
5238
+ # N: Revealed type is "Any"
5239
+ [builtins fixtures/tuple.pyi]
5240
+
5241
+ [case testOverloadIfMatching]
5242
+ from typing import overload, Any
5243
+
5244
+ class A: ...
5245
+ class B: ...
5246
+ class C: ...
5247
+
5248
+ @overload
5249
+ def f1(g: int) -> A: ...
5250
+ if True:
5251
+ # Some comment
5252
+ @overload
5253
+ def f1(g: str) -> B: ...
5254
+ def f1(g: Any) -> Any: ...
5255
+ reveal_type(f1(42)) # N: Revealed type is "__main__.A"
5256
+ reveal_type(f1("Hello")) # N: Revealed type is "__main__.B"
5257
+
5258
+ @overload
5259
+ def f2(g: int) -> A: ...
5260
+ if True:
5261
+ @overload
5262
+ def f2(g: bytes) -> B: ...
5263
+ @overload
5264
+ def f2(g: str) -> C: ...
5265
+ def f2(g: Any) -> Any: ...
5266
+ reveal_type(f2(42)) # N: Revealed type is "__main__.A"
5267
+ reveal_type(f2("Hello")) # N: Revealed type is "__main__.C"
5268
+
5269
+ @overload
5270
+ def f3(g: int) -> A: ...
5271
+ @overload
5272
+ def f3(g: str) -> B: ...
5273
+ if True:
5274
+ def f3(g: Any) -> Any: ...
5275
+ reveal_type(f3(42)) # N: Revealed type is "__main__.A"
5276
+ reveal_type(f3("Hello")) # N: Revealed type is "__main__.B"
5277
+
5278
+ if True:
5279
+ @overload
5280
+ def f4(g: int) -> A: ...
5281
+ @overload
5282
+ def f4(g: str) -> B: ...
5283
+ def f4(g: Any) -> Any: ...
5284
+ reveal_type(f4(42)) # N: Revealed type is "__main__.A"
5285
+ reveal_type(f4("Hello")) # N: Revealed type is "__main__.B"
5286
+
5287
+ if True:
5288
+ # Some comment
5289
+ @overload
5290
+ def f5(g: int) -> A: ...
5291
+ @overload
5292
+ def f5(g: str) -> B: ...
5293
+ def f5(g: Any) -> Any: ...
5294
+ reveal_type(f5(42)) # N: Revealed type is "__main__.A"
5295
+ reveal_type(f5("Hello")) # N: Revealed type is "__main__.B"
5296
+
5297
+ [case testOverloadIfNotMatching]
5298
+ from typing import overload, Any
5299
+
5300
+ class A: ...
5301
+ class B: ...
5302
+ class C: ...
5303
+
5304
+ @overload # E: An overloaded function outside a stub file must have an implementation
5305
+ def f1(g: int) -> A: ...
5306
+ @overload
5307
+ def f1(g: bytes) -> B: ...
5308
+ if True:
5309
+ @overload # E: Name "f1" already defined on line 7 \
5310
+ # E: Single overload definition, multiple required
5311
+ def f1(g: str) -> C: ...
5312
+ pass # Some other action
5313
+ def f1(g: Any) -> Any: ... # E: Name "f1" already defined on line 7
5314
+ reveal_type(f1(42)) # N: Revealed type is "__main__.A"
5315
+ reveal_type(f1("Hello")) # E: No overload variant of "f1" matches argument type "str" \
5316
+ # N: Possible overload variants: \
5317
+ # N: def f1(g: int) -> A \
5318
+ # N: def f1(g: bytes) -> B \
5319
+ # N: Revealed type is "Any"
5320
+
5321
+ if True:
5322
+ pass # Some other action
5323
+ @overload # E: Single overload definition, multiple required
5324
+ def f2(g: int) -> A: ...
5325
+ @overload # E: Name "f2" already defined on line 21
5326
+ def f2(g: bytes) -> B: ...
5327
+ @overload
5328
+ def f2(g: str) -> C: ...
5329
+ def f2(g: Any) -> Any: ...
5330
+ reveal_type(f2(42)) # N: Revealed type is "__main__.A"
5331
+ reveal_type(f2("Hello")) # N: Revealed type is "__main__.A" \
5332
+ # E: Argument 1 to "f2" has incompatible type "str"; expected "int"
0 commit comments