bpo-39481: Make weakref and WeakSet generic (GH-19497)

diff --git a/Lib/_weakrefset.py b/Lib/_weakrefset.py
index 7a84823..b267780 100644
--- a/Lib/_weakrefset.py
+++ b/Lib/_weakrefset.py
@@ -3,6 +3,7 @@
 # by abc.py to load everything else at startup.
 
 from _weakref import ref
+from types import GenericAlias
 
 __all__ = ['WeakSet']
 
@@ -197,3 +198,5 @@
 
     def __repr__(self):
         return repr(self.data)
+
+    __class_getitem__ = classmethod(GenericAlias)
diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py
index 770aeef..686df17 100644
--- a/Lib/test/test_genericalias.py
+++ b/Lib/test/test_genericalias.py
@@ -33,6 +33,7 @@
 from urllib.parse import SplitResult, ParseResult
 from unittest.case import _AssertRaisesContext
 from queue import Queue, SimpleQueue
+from weakref import WeakSet, ReferenceType, ref
 import typing
 
 from typing import TypeVar
@@ -73,6 +74,7 @@
                   Array, LibraryLoader,
                   SplitResult, ParseResult,
                   ValueProxy, ApplyResult,
+                  WeakSet, ReferenceType, ref,
                   ShareableList, SimpleQueue,
                   Future, _WorkItem,
                   Morsel,