From 083ffca02cfaf1ccffe29abaef864f56857ee623 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Wed, 8 Oct 2025 00:13:59 +0300 Subject: [PATCH 1/3] Fix `[name-defined]` false-negative in `class A[X, Y=X]:` case --- mypy/semanal.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mypy/semanal.py b/mypy/semanal.py index 17dc9bfadc1f..08f9eb03c9d7 100644 --- a/mypy/semanal.py +++ b/mypy/semanal.py @@ -1791,11 +1791,10 @@ def push_type_args( return None tvs.append((p.name, tv)) - for name, tv in tvs: - if self.is_defined_type_param(name): - self.fail(f'"{name}" already defined as a type parameter', context) + if self.is_defined_type_param(p.name): + self.fail(f'"{p.name}" already defined as a type parameter', context) else: - self.add_symbol(name, tv, context, no_progress=True, type_param=True) + self.add_symbol(p.name, tv, context, no_progress=True, type_param=True) return tvs From 07b17f3661f340914e385d14951c60190832ad71 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Wed, 8 Oct 2025 00:41:43 +0300 Subject: [PATCH 2/3] Add test --- test-data/unit/check-python313.test | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test-data/unit/check-python313.test b/test-data/unit/check-python313.test index b46ae0fecfc4..96a35fcbe61a 100644 --- a/test-data/unit/check-python313.test +++ b/test-data/unit/check-python313.test @@ -290,3 +290,26 @@ reveal_type(A1().x) # N: Revealed type is "builtins.int" reveal_type(A2().x) # N: Revealed type is "builtins.int" reveal_type(A3().x) # N: Revealed type is "builtins.int" [builtins fixtures/tuple.pyi] + +[case testTypeVarDefaultToAnotherTypeVar] +class A[X, Y = X, Z = Y]: + x: X + y: Y + z: Z + +a1: A[int] +reveal_type(a1.x) # N: Revealed type is "builtins.int" +reveal_type(a1.y) # N: Revealed type is "builtins.int" +# TODO: this must reveal `int` as well: +reveal_type(a1.z) # N: Revealed type is "X`1" + +a2: A[int, str] +reveal_type(a2.x) # N: Revealed type is "builtins.int" +reveal_type(a2.y) # N: Revealed type is "builtins.str" +reveal_type(a2.z) # N: Revealed type is "builtins.str" + +a3: A[int, str, bool] +reveal_type(a3.x) # N: Revealed type is "builtins.int" +reveal_type(a3.y) # N: Revealed type is "builtins.str" +reveal_type(a3.z) # N: Revealed type is "builtins.bool" +[builtins fixtures/tuple.pyi] From c2bbf2748fd48b00f6b967254d8d049d04a6de58 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Wed, 8 Oct 2025 10:16:26 +0300 Subject: [PATCH 3/3] Add a test with wrong names --- test-data/unit/check-python313.test | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test-data/unit/check-python313.test b/test-data/unit/check-python313.test index 96a35fcbe61a..117d20ceaf0b 100644 --- a/test-data/unit/check-python313.test +++ b/test-data/unit/check-python313.test @@ -313,3 +313,9 @@ reveal_type(a3.x) # N: Revealed type is "builtins.int" reveal_type(a3.y) # N: Revealed type is "builtins.str" reveal_type(a3.z) # N: Revealed type is "builtins.bool" [builtins fixtures/tuple.pyi] + +[case testTypeVarDefaultToAnotherTypeVarWrong] +class A[Y = X, X = int]: ... # E: Name "X" is not defined + +class B[Y = X]: ... # E: Name "X" is not defined +[builtins fixtures/tuple.pyi]