Skip to content

Commit 77b4cfb

Browse files
authored
Fix [name-defined] false-positive in class A[X, Y=X]: case (#20021)
This a WIP to see the test result before adding my own tests :) Closes #20020
1 parent 712afc5 commit 77b4cfb

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

mypy/semanal.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1791,11 +1791,10 @@ def push_type_args(
17911791
return None
17921792
tvs.append((p.name, tv))
17931793

1794-
for name, tv in tvs:
1795-
if self.is_defined_type_param(name):
1796-
self.fail(f'"{name}" already defined as a type parameter', context)
1794+
if self.is_defined_type_param(p.name):
1795+
self.fail(f'"{p.name}" already defined as a type parameter', context)
17971796
else:
1798-
self.add_symbol(name, tv, context, no_progress=True, type_param=True)
1797+
self.add_symbol(p.name, tv, context, no_progress=True, type_param=True)
17991798

18001799
return tvs
18011800

test-data/unit/check-python313.test

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,3 +290,32 @@ reveal_type(A1().x) # N: Revealed type is "builtins.int"
290290
reveal_type(A2().x) # N: Revealed type is "builtins.int"
291291
reveal_type(A3().x) # N: Revealed type is "builtins.int"
292292
[builtins fixtures/tuple.pyi]
293+
294+
[case testTypeVarDefaultToAnotherTypeVar]
295+
class A[X, Y = X, Z = Y]:
296+
x: X
297+
y: Y
298+
z: Z
299+
300+
a1: A[int]
301+
reveal_type(a1.x) # N: Revealed type is "builtins.int"
302+
reveal_type(a1.y) # N: Revealed type is "builtins.int"
303+
# TODO: this must reveal `int` as well:
304+
reveal_type(a1.z) # N: Revealed type is "X`1"
305+
306+
a2: A[int, str]
307+
reveal_type(a2.x) # N: Revealed type is "builtins.int"
308+
reveal_type(a2.y) # N: Revealed type is "builtins.str"
309+
reveal_type(a2.z) # N: Revealed type is "builtins.str"
310+
311+
a3: A[int, str, bool]
312+
reveal_type(a3.x) # N: Revealed type is "builtins.int"
313+
reveal_type(a3.y) # N: Revealed type is "builtins.str"
314+
reveal_type(a3.z) # N: Revealed type is "builtins.bool"
315+
[builtins fixtures/tuple.pyi]
316+
317+
[case testTypeVarDefaultToAnotherTypeVarWrong]
318+
class A[Y = X, X = int]: ... # E: Name "X" is not defined
319+
320+
class B[Y = X]: ... # E: Name "X" is not defined
321+
[builtins fixtures/tuple.pyi]

0 commit comments

Comments
 (0)