[Python-checkins] gh-93345: Fix a crash in substitution of nested TypeVar after TypeVarTuple (GH-93346)

serhiy-storchaka webhook-mailer at python.org
Tue May 31 01:46:20 EDT 2022


https://github.com/python/cpython/commit/f545fc955aeb701ae4e73b07ff2283f823d857b8
commit: f545fc955aeb701ae4e73b07ff2283f823d857b8
branch: main
author: Serhiy Storchaka <storchaka at gmail.com>
committer: serhiy-storchaka <storchaka at gmail.com>
date: 2022-05-31T08:46:16+03:00
summary:

gh-93345: Fix a crash in substitution of nested TypeVar after TypeVarTuple (GH-93346)

For example: tuple[*Ts, list[T]][int, str, bool]

files:
A Misc/NEWS.d/next/Core and Builtins/2022-05-30-10-22-46.gh-issue-93345.gi1A4L.rst
M Lib/test/test_typing.py
M Objects/genericaliasobject.c

diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index 2afac23539155..d6cd3d9bdd6a4 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -768,12 +768,18 @@ class C(Generic[*Ts]): pass
             ('generic[T, *Ts]',                        '[int]',                                          'generic[int]'),
             ('generic[T, *Ts]',                        '[int, str]',                                     'generic[int, str]'),
             ('generic[T, *Ts]',                        '[int, str, bool]',                               'generic[int, str, bool]'),
+            ('generic[list[T], *Ts]',                  '[int]',                                          'generic[list[int]]'),
+            ('generic[list[T], *Ts]',                  '[int, str]',                                     'generic[list[int], str]'),
+            ('generic[list[T], *Ts]',                  '[int, str, bool]',                               'generic[list[int], str, bool]'),
 
             ('generic[T, *Ts]',                        '[*tuple[int, ...]]',                             'TypeError'),  # Should be generic[int, *tuple[int, ...]]
 
             ('generic[*Ts, T]',                        '[int]',                                          'generic[int]'),
             ('generic[*Ts, T]',                        '[int, str]',                                     'generic[int, str]'),
-            ('generic[*Ts, T]',                          '[int, str, bool]',                             'generic[int, str, bool]'),
+            ('generic[*Ts, T]',                        '[int, str, bool]',                               'generic[int, str, bool]'),
+            ('generic[*Ts, list[T]]',                  '[int]',                                          'generic[list[int]]'),
+            ('generic[*Ts, list[T]]',                  '[int, str]',                                     'generic[int, list[str]]'),
+            ('generic[*Ts, list[T]]',                  '[int, str, bool]',                               'generic[int, str, list[bool]]'),
 
             ('generic[T, *tuple_type[int, ...]]',      '[str]',                                          'generic[str, *tuple_type[int, ...]]'),
             ('generic[T1, T2, *tuple_type[int, ...]]', '[str, bool]',                                    'generic[str, bool, *tuple_type[int, ...]]'),
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-30-10-22-46.gh-issue-93345.gi1A4L.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-30-10-22-46.gh-issue-93345.gi1A4L.rst
new file mode 100644
index 0000000000000..4cdb37cfe4698
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-30-10-22-46.gh-issue-93345.gi1A4L.rst	
@@ -0,0 +1,2 @@
+Fix a crash in substitution of a ``TypeVar`` in nested generic alias after
+``TypeVarTuple``.
diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c
index 39fd70999ecbe..59420816496f0 100644
--- a/Objects/genericaliasobject.c
+++ b/Objects/genericaliasobject.c
@@ -296,7 +296,7 @@ subs_tvars(PyObject *obj, PyObject *params,
             else {
                 if (iparam >= 0) {
                     if (iparam > varparam) {
-                        iparam += nargs - nsubargs;
+                        iparam += nargs - nparams;
                     }
                     arg = argitems[iparam];
                 }



More information about the Python-checkins mailing list