diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 2afac235391552..d6cd3d9bdd6a48 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 00000000000000..8a11f473252183 --- /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 39fd70999ecbe5..59420816496f09 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]; }