diff --git a/mypy/semanal.py b/mypy/semanal.py index eb8964b30218..a816108f59f4 100644 --- a/mypy/semanal.py +++ b/mypy/semanal.py @@ -1878,7 +1878,7 @@ def push_type_args( return None tvs.append((p.name, tv)) - if self.is_defined_type_param(p.name): + if self.get_defined_type_param(p.name): self.fail(f'"{p.name}" already defined as a type parameter', context) else: assert self.add_symbol( @@ -1887,15 +1887,13 @@ def push_type_args( return tvs - def is_defined_type_param(self, name: str) -> bool: - for names in self.locals: - if names is None: - continue - if name in names: + def get_defined_type_param(self, name: str) -> TypeVarLikeExpr | None: + for names in reversed(self.locals): + if names is not None and name in names: node = names[name].node if isinstance(node, TypeVarLikeExpr): - return True - return False + return node + return None def analyze_type_param( self, type_param: TypeParam, context: Context @@ -2343,15 +2341,15 @@ class Foo(Bar, Generic[T]): ... has_type_var_tuple = False if defn.type_args is not None: for p in defn.type_args: - node = self.lookup(p.name, context) + node = self.get_defined_type_param(p.name) assert node is not None - assert isinstance(node.node, TypeVarLikeExpr) - if isinstance(node.node, TypeVarTupleExpr): + assert isinstance(node, TypeVarLikeExpr) + if isinstance(node, TypeVarTupleExpr): if has_type_var_tuple: self.fail("Can only use one type var tuple in a class def", context) continue has_type_var_tuple = True - declared_tvars.append((p.name, node.node)) + declared_tvars.append((p.name, node)) for i, base_expr in enumerate(base_type_exprs): if isinstance(base_expr, StarExpr): diff --git a/test-data/unit/check-python312.test b/test-data/unit/check-python312.test index 8115bfb65e42..7252969ff2aa 100644 --- a/test-data/unit/check-python312.test +++ b/test-data/unit/check-python312.test @@ -2296,6 +2296,13 @@ class D[*Ts](Generic[Unpack[Us]]): # E: Generic[...] base class is redundant \ pass [builtins fixtures/tuple.pyi] +[case testPEP695TypeVarReusedName] +class C: + X = 5 + class Inner[X]: + pass +[builtins fixtures/tuple.pyi] + [case testPEP695VariadicAliasUnpack] class C[*Ts]: pass