Skip to content

Commit

Permalink
Detect redefinitions of type parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
JukkaL committed May 17, 2024
1 parent b82c9cd commit 441e043
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 1 deletion.
15 changes: 14 additions & 1 deletion mypy/semanal.py
Original file line number Diff line number Diff line change
Expand Up @@ -1664,10 +1664,23 @@ def push_type_args(
tvs.append((p.name, tv))

for name, tv in tvs:
self.add_symbol(name, tv, context, no_progress=True, type_param=True)
if self.is_defined_type_param(name):
self.fail(f'"{name}" already defined as a type parameter', context)
else:
self.add_symbol(name, tv, context, no_progress=True, type_param=True)

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:
node = names[name].node
if isinstance(node, TypeVarLikeExpr):
return True
return False

def analyze_type_param(self, type_param: TypeParam) -> TypeVarLikeExpr | None:
fullname = self.qualified_name(type_param.name)
if type_param.upper_bound:
Expand Down
12 changes: 12 additions & 0 deletions test-data/unit/check-python312.test
Original file line number Diff line number Diff line change
Expand Up @@ -1137,3 +1137,15 @@ class Outer:
# Likewise, 'Inner' would not be available in these type annotations.
def method1[T](self, a: Inner[T]) -> Inner[T]:
return a

[case testPEP695RedefineTypeParameterInScope]
# mypy: enable-incomplete-feature=NewGenericSyntax
class C[T]:
def m[T](self, x: T) -> T: # E: "T" already defined as a type parameter
return x
def m2(self) -> None:
def nested[T](x: T) -> T: # E: "T" already defined as a type parameter
return x

def f[S, S](x: S) -> S: # E: "S" already defined as a type parameter
return x

0 comments on commit 441e043

Please sign in to comment.