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