@@ -54,3 +54,136 @@ def f(x: Union[SupportsFloat, T]) -> Union[SupportsFloat, T]: pass
5454f(0) # should not crash
5555[builtins fixtures/primitives.pyi]
5656[out]
57+
58+ [case testIntersectionUsingPromotion1]
59+ # flags: --warn-unreachable
60+ from typing import Union
61+
62+ x: complex = 1
63+ reveal_type(x) # N: Revealed type is "builtins.complex"
64+ if isinstance(x, int):
65+ reveal_type(x) # N: Revealed type is "builtins.int"
66+ else:
67+ reveal_type(x) # N: Revealed type is "builtins.complex"
68+ reveal_type(x) # N: Revealed type is "builtins.complex"
69+
70+ y: Union[int, float]
71+ if isinstance(y, float):
72+ reveal_type(y) # N: Revealed type is "builtins.float"
73+ else:
74+ reveal_type(y) # N: Revealed type is "builtins.int"
75+
76+ reveal_type(y) # N: Revealed type is "Union[builtins.int, builtins.float]"
77+
78+ if isinstance(y, int):
79+ reveal_type(y) # N: Revealed type is "builtins.int"
80+ else:
81+ reveal_type(y) # N: Revealed type is "builtins.float"
82+ [builtins fixtures/primitives.pyi]
83+
84+ [case testIntersectionUsingPromotion2]
85+ # flags: --warn-unreachable
86+ x: complex = 1
87+ reveal_type(x) # N: Revealed type is "builtins.complex"
88+ if isinstance(x, (int, float)):
89+ reveal_type(x) # N: Revealed type is "Union[builtins.int, builtins.float]"
90+ else:
91+ reveal_type(x) # N: Revealed type is "builtins.complex"
92+
93+ # Note we make type precise, since type promotions are involved
94+ reveal_type(x) # N: Revealed type is "Union[builtins.complex, builtins.int, builtins.float]"
95+ [builtins fixtures/primitives.pyi]
96+
97+ [case testIntersectionUsingPromotion3]
98+ # flags: --warn-unreachable
99+ x: object
100+ if isinstance(x, int) and isinstance(x, complex):
101+ reveal_type(x) # N: Revealed type is "builtins.int"
102+ if isinstance(x, complex) and isinstance(x, int):
103+ reveal_type(x) # N: Revealed type is "builtins.int"
104+ [builtins fixtures/primitives.pyi]
105+
106+ [case testIntersectionUsingPromotion4]
107+ # flags: --warn-unreachable
108+ x: object
109+ if isinstance(x, int):
110+ if isinstance(x, complex):
111+ reveal_type(x) # N: Revealed type is "builtins.int"
112+ else:
113+ reveal_type(x) # N: Revealed type is "builtins.int"
114+ if isinstance(x, complex):
115+ if isinstance(x, int):
116+ reveal_type(x) # N: Revealed type is "builtins.int"
117+ else:
118+ reveal_type(x) # N: Revealed type is "builtins.complex"
119+ [builtins fixtures/primitives.pyi]
120+
121+ [case testIntersectionUsingPromotion5]
122+ # flags: --warn-unreachable
123+ from typing import Union
124+
125+ x: Union[float, complex]
126+ if isinstance(x, int):
127+ reveal_type(x) # N: Revealed type is "builtins.int"
128+ else:
129+ reveal_type(x) # N: Revealed type is "Union[builtins.float, builtins.complex]"
130+ reveal_type(x) # N: Revealed type is "Union[builtins.int, builtins.float, builtins.complex]"
131+ [builtins fixtures/primitives.pyi]
132+
133+ [case testIntersectionUsingPromotion6]
134+ # flags: --warn-unreachable
135+ from typing import Union
136+
137+ x: Union[str, complex]
138+ if isinstance(x, int):
139+ reveal_type(x) # N: Revealed type is "builtins.int"
140+ else:
141+ reveal_type(x) # N: Revealed type is "Union[builtins.str, builtins.complex]"
142+ reveal_type(x) # N: Revealed type is "Union[builtins.str, builtins.int, builtins.complex]"
143+ [builtins fixtures/primitives.pyi]
144+
145+ [case testIntersectionUsingPromotion7]
146+ # flags: --warn-unreachable
147+ from typing import Union
148+
149+ x: Union[int, float, complex]
150+ if isinstance(x, int):
151+ reveal_type(x) # N: Revealed type is "builtins.int"
152+ else:
153+ reveal_type(x) # N: Revealed type is "Union[builtins.float, builtins.complex]"
154+
155+ reveal_type(x) # N: Revealed type is "Union[builtins.int, builtins.float, builtins.complex]"
156+
157+ if isinstance(x, float):
158+ reveal_type(x) # N: Revealed type is "builtins.float"
159+ else:
160+ reveal_type(x) # N: Revealed type is "Union[builtins.int, builtins.complex]"
161+
162+ reveal_type(x) # N: Revealed type is "Union[builtins.int, builtins.float, builtins.complex]"
163+
164+ if isinstance(x, complex):
165+ reveal_type(x) # N: Revealed type is "builtins.complex"
166+ else:
167+ reveal_type(x) # N: Revealed type is "Union[builtins.int, builtins.float]"
168+
169+ reveal_type(x) # N: Revealed type is "Union[builtins.int, builtins.float, builtins.complex]"
170+ [builtins fixtures/primitives.pyi]
171+
172+ [case testIntersectionUsingPromotion8]
173+ # flags: --warn-unreachable
174+ from typing import Union
175+
176+ x: Union[int, float, complex]
177+ if isinstance(x, (int, float)):
178+ reveal_type(x) # N: Revealed type is "Union[builtins.int, builtins.float]"
179+ else:
180+ reveal_type(x) # N: Revealed type is "builtins.complex"
181+ if isinstance(x, (int, complex)):
182+ reveal_type(x) # N: Revealed type is "Union[builtins.int, builtins.complex]"
183+ else:
184+ reveal_type(x) # N: Revealed type is "builtins.float"
185+ if isinstance(x, (float, complex)):
186+ reveal_type(x) # N: Revealed type is "Union[builtins.float, builtins.complex]"
187+ else:
188+ reveal_type(x) # N: Revealed type is "builtins.int"
189+ [builtins fixtures/primitives.pyi]
0 commit comments