]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-93345: Fix a crash in substitution of nested TypeVar after TypeVarTuple (GH-93346)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 1 Jun 2022 06:43:38 +0000 (23:43 -0700)
committerGitHub <noreply@github.com>
Wed, 1 Jun 2022 06:43:38 +0000 (23:43 -0700)
For example: tuple[*Ts, list[T]][int, str, bool]
(cherry picked from commit f545fc955aeb701ae4e73b07ff2283f823d857b8)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Lib/test/test_typing.py
Misc/NEWS.d/next/Core and Builtins/2022-05-30-10-22-46.gh-issue-93345.gi1A4L.rst [new file with mode: 0644]
Objects/genericaliasobject.c

index 2afac2353915527405e8faca898da5e505ce7b1f..d6cd3d9bdd6a484ecce1ce2fc8a874a72a4504ad 100644 (file)
@@ -768,12 +768,18 @@ class GenericAliasSubstitutionTests(BaseTestCase):
             ('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 (file)
index 0000000..4cdb37c
--- /dev/null
@@ -0,0 +1,2 @@
+Fix a crash in substitution of a ``TypeVar`` in nested generic alias after
+``TypeVarTuple``.
index 39fd70999ecbe50ee4fee5f1accc74f23cbed140..59420816496f097578734c445b988f47a13d689a 100644 (file)
@@ -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];
                 }