str_subtype_new, unicode_subtype_new:
+ These were leaving the hash fields at 0, which all string and unicode
  routines believe is a legitimate hash code.  As a result, hash() applied
  to str and unicode subclass instances always returned 0, which in turn
  confused dict operations, etc.
+ Changed local names "new"; no point to antagonizing C++ compilers.
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index b791037..8d9e81e 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -1366,6 +1366,7 @@
     a = hexint(12345)
     verify(int(a) == 12345)
     verify(int(a).__class__ is int)
+    verify(hash(a) == hash(12345))
     verify((+a).__class__ is int)
     verify((a >> 0).__class__ is int)
     verify((a << 0).__class__ is int)
@@ -1388,6 +1389,7 @@
     verify(str(5 + octlong(3000)) == "05675")
     a = octlong(12345)
     verify(long(a) == 12345L)
+    verify(hash(a) == hash(12345L))
     verify(long(a).__class__ is long)
     verify((+a).__class__ is long)
     verify((-a).__class__ is long)
@@ -1425,6 +1427,7 @@
     a = precfloat(12345)
     verify(float(a) == 12345.0)
     verify(float(a).__class__ is float)
+    verify(hash(a) == hash(12345.0))
     verify((+a).__class__ is float)
 
     class madtuple(tuple):
@@ -1447,6 +1450,7 @@
     a = madtuple((1,2,3,4,5))
     verify(tuple(a) == (1,2,3,4,5))
     verify(tuple(a).__class__ is tuple)
+    verify(hash(a) == hash((1,2,3,4,5)))
     verify(a[:].__class__ is tuple)
     verify((a * 1).__class__ is tuple)
     verify((a * 0).__class__ is tuple)
@@ -1485,6 +1489,9 @@
     s = madstring(base)
     verify(str(s) == base)
     verify(str(s).__class__ is str)
+    verify(hash(s) == hash(base))
+    verify({s: 1}[base] == 1)
+    verify({base: 1}[s] == 1)
     verify((s + "").__class__ is str)
     verify(s + "" == base)
     verify(("" + s).__class__ is str)
@@ -1538,6 +1545,9 @@
     u = madunicode(base)
     verify(unicode(u) == base)
     verify(unicode(u).__class__ is unicode)
+    verify(hash(u) == hash(base))
+    verify({u: 1}[base] == 1)
+    verify({base: 1}[u] == 1)
     verify(u.strip().__class__ is unicode)
     verify(u.strip() == base)
     verify(u.lstrip().__class__ is unicode)