Skip to content

Commit f989414

Browse files
authored
[PEP 695] Don't crash when redefining something as a type alias (#17335)
Generate an error instead. Work on #15238.
1 parent 6682563 commit f989414

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

mypy/semanal.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -5323,6 +5323,14 @@ def visit_type_alias_stmt(self, s: TypeAliasStmt) -> None:
53235323
all_type_params_names = [p.name for p in s.type_args]
53245324

53255325
try:
5326+
existing = self.current_symbol_table().get(s.name.name)
5327+
if existing and not (
5328+
isinstance(existing.node, TypeAlias)
5329+
or (isinstance(existing.node, PlaceholderNode) and existing.node.line == s.line)
5330+
):
5331+
self.already_defined(s.name.name, s, existing, "Name")
5332+
return
5333+
53265334
tag = self.track_incomplete_refs()
53275335
res, alias_tvars, depends_on, qualified_tvars, empty_tuple_index = self.analyze_alias(
53285336
s.name.name,
@@ -5378,7 +5386,6 @@ def visit_type_alias_stmt(self, s: TypeAliasStmt) -> None:
53785386
python_3_12_type_alias=True,
53795387
)
53805388

5381-
existing = self.current_symbol_table().get(s.name.name)
53825389
if (
53835390
existing
53845391
and isinstance(existing.node, (PlaceholderNode, TypeAlias))

test-data/unit/check-python312.test

+36
Original file line numberDiff line numberDiff line change
@@ -1453,3 +1453,39 @@ class E[T]:
14531453
reveal_type(E[str]().a) # N: Revealed type is "builtins.list[Any]"
14541454
[builtins fixtures/tuple.pyi]
14551455
[typing fixtures/typing-full.pyi]
1456+
1457+
[case testPEP695RedefineAsTypeAlias1]
1458+
# flags: --enable-incomplete-feature=NewGenericSyntax
1459+
class C: pass
1460+
type C = int # E: Name "C" already defined on line 2
1461+
1462+
A = 0
1463+
type A = str # E: Name "A" already defined on line 5
1464+
reveal_type(A) # N: Revealed type is "builtins.int"
1465+
1466+
[case testPEP695RedefineAsTypeAlias2]
1467+
# flags: --enable-incomplete-feature=NewGenericSyntax
1468+
from m import D
1469+
type D = int # E: Name "D" already defined (possibly by an import)
1470+
a: D
1471+
reveal_type(a) # N: Revealed type is "m.D"
1472+
[file m.py]
1473+
class D: pass
1474+
1475+
[case testPEP695RedefineAsTypeAlias3]
1476+
# flags: --enable-incomplete-feature=NewGenericSyntax
1477+
D = list["Forward"]
1478+
type D = int # E: Name "D" already defined on line 2
1479+
Forward = str
1480+
x: D
1481+
reveal_type(x) # N: Revealed type is "builtins.list[builtins.str]"
1482+
1483+
[case testPEP695MultiDefinitionsForTypeAlias]
1484+
# flags: --enable-incomplete-feature=NewGenericSyntax
1485+
if int():
1486+
type A[T] = list[T]
1487+
else:
1488+
type A[T] = str # E: Name "A" already defined on line 3
1489+
x: T # E: Name "T" is not defined
1490+
a: A[int]
1491+
reveal_type(a) # N: Revealed type is "builtins.list[builtins.int]"

0 commit comments

Comments
 (0)