Skip to content

Commit

Permalink
[3.12] gh-109219: propagate free vars through type param scopes (GH-1…
Browse files Browse the repository at this point in the history
…09377) (#109410)

gh-109219: propagate free vars through type param scopes (GH-109377)
(cherry picked from commit 909adb5)

Co-authored-by: Carl Meyer <carl@oddbird.net>
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
  • Loading branch information
3 people committed Sep 14, 2023
1 parent 52a9c57 commit 35c633d
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 3 deletions.
13 changes: 13 additions & 0 deletions Lib/test/test_type_params.py
Expand Up @@ -694,6 +694,19 @@ class Cls:
cls = ns["outer"]()
self.assertEqual(cls.Alias.__value__, "class")

def test_nested_free(self):
ns = run_code("""
def f():
T = str
class C:
T = int
class D[U](T):
x = T
return C
""")
C = ns["f"]()
self.assertIn(int, C.D.__bases__)
self.assertIs(C.D.x, str)

class TypeParamsManglingTest(unittest.TestCase):
def test_mangling(self):
Expand Down
@@ -0,0 +1,2 @@
Fix compiling type param scopes that use a name which is also free in an
inner scope.
5 changes: 2 additions & 3 deletions Python/symtable.c
Expand Up @@ -801,8 +801,7 @@ update_symbols(PyObject *symbols, PyObject *scopes,
the class that has the same name as a local
or global in the class scope.
*/
if (classflag &&
PyLong_AS_LONG(v) & (DEF_BOUND | DEF_GLOBAL)) {
if (classflag) {
long flags = PyLong_AS_LONG(v) | DEF_FREE_CLASS;
v_new = PyLong_FromLong(flags);
if (!v_new) {
Expand Down Expand Up @@ -1037,7 +1036,7 @@ analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
goto error;
/* Records the results of the analysis in the symbol table entry */
if (!update_symbols(ste->ste_symbols, scopes, bound, newfree, inlined_cells,
ste->ste_type == ClassBlock))
(ste->ste_type == ClassBlock) || ste->ste_can_see_class_scope))
goto error;

temp = PyNumber_InPlaceOr(free, newfree);
Expand Down

0 comments on commit 35c633d

Please sign in to comment.