aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_typing.py16
-rw-r--r--Misc/NEWS.d/next/Library/2023-04-08-12-43-52.gh-issue-101162.yOCd_J.rst2
-rw-r--r--Objects/abstract.c2
-rw-r--r--Objects/genericaliasobject.c1
4 files changed, 20 insertions, 1 deletions
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index 0450a87577e..fa39c796197 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -4091,6 +4091,22 @@ class GenericTests(BaseTestCase):
with self.assertRaises(TypeError):
C[()]
+ def test_generic_subclass_checks(self):
+ for typ in [list[int], List[int],
+ tuple[int, str], Tuple[int, str],
+ typing.Callable[..., None],
+ collections.abc.Callable[..., None]]:
+ with self.subTest(typ=typ):
+ self.assertRaises(TypeError, issubclass, typ, object)
+ self.assertRaises(TypeError, issubclass, typ, type)
+ self.assertRaises(TypeError, issubclass, typ, typ)
+ self.assertRaises(TypeError, issubclass, object, typ)
+
+ # isinstance is fine:
+ self.assertTrue(isinstance(typ, object))
+ # but, not when the right arg is also a generic:
+ self.assertRaises(TypeError, isinstance, typ, typ)
+
def test_init(self):
T = TypeVar('T')
S = TypeVar('S')
diff --git a/Misc/NEWS.d/next/Library/2023-04-08-12-43-52.gh-issue-101162.yOCd_J.rst b/Misc/NEWS.d/next/Library/2023-04-08-12-43-52.gh-issue-101162.yOCd_J.rst
new file mode 100644
index 00000000000..e9fadc8f436
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-04-08-12-43-52.gh-issue-101162.yOCd_J.rst
@@ -0,0 +1,2 @@
+Forbid using :func:`builtins.issubclass` with :class:`types.GenericAlias` as
+the first argument.
diff --git a/Objects/abstract.c b/Objects/abstract.c
index b4edcec6007..c113364a88a 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -2812,7 +2812,7 @@ object_issubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls)
return -1;
}
- /* Probably never reached anymore. */
+ /* Can be reached when infinite recursion happens. */
return recursive_issubclass(derived, cls);
}
diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c
index df8873454ae..faf517b66b9 100644
--- a/Objects/genericaliasobject.c
+++ b/Objects/genericaliasobject.c
@@ -626,6 +626,7 @@ ga_vectorcall(PyObject *self, PyObject *const *args,
static const char* const attr_exceptions[] = {
"__class__",
+ "__bases__",
"__origin__",
"__args__",
"__unpacked__",