Add tests for including __dict__ and/or __weakref__ in __slots__.
Add some more rigor to slotmultipleinheritance().
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index bccc912..bedb9d2 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -1175,6 +1175,51 @@
     new_objects = len(gc.get_objects())
     vereq(orig_objects, new_objects)
 
+def slotspecials():
+    if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
+
+    class D(object):
+        __slots__ = ["__dict__"]
+    a = D()
+    verify(hasattr(a, "__dict__"))
+    verify(not hasattr(a, "__weakref__"))
+    a.foo = 42
+    vereq(a.__dict__, {"foo": 42})
+
+    class W(object):
+        __slots__ = ["__weakref__"]
+    a = W()
+    verify(hasattr(a, "__weakref__"))
+    verify(not hasattr(a, "__dict__"))
+    try:
+        a.foo = 42
+    except AttributeError:
+        pass
+    else:
+        raise TestFailed, "shouldn't be allowed to set a.foo"
+
+    class C1(W, D):
+        __slots__ = []
+    a = C1()
+    verify(hasattr(a, "__dict__"))
+    verify(hasattr(a, "__weakref__"))
+    a.foo = 42
+    vereq(a.__dict__, {"foo": 42})
+
+    class C2(D, W):
+        __slots__ = []
+    a = C2()
+    verify(hasattr(a, "__dict__"))
+    verify(hasattr(a, "__weakref__"))
+    a.foo = 42
+    vereq(a.__dict__, {"foo": 42})
+
+    class C3(C1, C2):
+        __slots__ = []
+
+    class C4(C2, C1):
+        __slots__ = []
+
 def dynamics():
     if verbose: print "Testing class attribute propagation..."
     class D(object):
@@ -3245,7 +3290,10 @@
         pass
     class C(A,B) :
         __slots__=()
-    C().x=2
+    vereq(C.__basicsize__, B.__basicsize__)
+    verify(hasattr(C, '__dict__'))
+    verify(hasattr(C, '__weakref__'))
+    C().x = 2
 
 def testrmul():
     # SF patch 592646
@@ -3304,6 +3352,7 @@
     diamond()
     objects()
     slots()
+    slotspecials()
     dynamics()
     errors()
     classmethods()