@@ -115,16 +115,6 @@ class ClassA[X]:
115115 self .assertEqual (X .__name__ , "X" )
116116 self .assertIs (cls .__annotations__ ["X" ], int )
117117
118- def test_name_non_collision_11 (self ):
119- code = """
120- def outer():
121- X = 1
122- def inner[X]():
123- nonlocal X
124- return X
125- """
126- check_syntax_error (self , code )
127-
128118 def test_name_non_collision_13 (self ):
129119 ns = run_code ("""
130120 X = 1
@@ -154,6 +144,49 @@ def test_disallowed_expressions(self):
154144 check_syntax_error (self , "def f[T](y: (x := Sequence[T])): pass" )
155145
156146
147+ class NonlocalTest (unittest .TestCase ):
148+
149+ def test_nonlocal_disallowed_01 (self ):
150+ code = """
151+ def outer():
152+ X = 1
153+ def inner[X]():
154+ nonlocal X
155+ return X
156+ """
157+ check_syntax_error (self , code )
158+
159+ def test_nonlocal_disallowed_02 (self ):
160+ code = """
161+ def outer2[T]():
162+ def inner1():
163+ nonlocal T
164+ """
165+ check_syntax_error (self , textwrap .dedent (code ))
166+
167+ def test_nonlocal_disallowed_03 (self ):
168+ code = """
169+ class Cls[T]:
170+ nonlocal T
171+ """
172+ check_syntax_error (self , textwrap .dedent (code ))
173+
174+ def test_nonlocal_allowed (self ):
175+ code = """
176+ def func[T]():
177+ T = "func"
178+ def inner():
179+ nonlocal T
180+ T = "inner"
181+ inner()
182+ assert T == "inner"
183+ """
184+ ns = run_code (code )
185+ func = ns ["func" ]
186+ T , = func .__type_params__
187+ self .assertEqual (T .__name__ , "T" )
188+
189+
157190class TypeParamsAccessTest (unittest .TestCase ):
158191 def test_class_access_01 (self ):
159192 ns = run_code ("""
@@ -305,14 +338,6 @@ class C[T]:
305338 cls = ns ["C" ]
306339 self .assertEqual (cls .Alias .__value__ , "class" )
307340
308- def test_nonlocal (self ):
309- code = """
310- def outer2[T]():
311- def inner1():
312- nonlocal T
313- """
314- check_syntax_error (self , textwrap .dedent (code ))
315-
316341 def test_shadowing_nonlocal (self ):
317342 ns = run_code ("""
318343 def outer[T]():
0 commit comments