Change string comparison so that it applies even when one (or both)
arguments are subclasses of str, as long as they don't override rich
comparison.
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 9e8565f..ed3cea4 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -1555,7 +1555,7 @@
             self._rev = self.__class__("".join(L))
             return self._rev
     s = madstring("abcdefghijklmnopqrstuvwxyz")
-    #XXX verify(s == "abcdefghijklmnopqrstuvwxyz")
+    verify(s == "abcdefghijklmnopqrstuvwxyz")
     verify(s.rev() == madstring("zyxwvutsrqponmlkjihgfedcba"))
     verify(s.rev().rev() == madstring("abcdefghijklmnopqrstuvwxyz"))
     for i in range(256):
@@ -1569,12 +1569,12 @@
 
     base = "\x00" * 5
     s = madstring(base)
-    #XXX verify(s == base)
+    verify(s == base)
     verify(str(s) == base)
     verify(str(s).__class__ is str)
     verify(hash(s) == hash(base))
-    #XXX verify({s: 1}[base] == 1)
-    #XXX verify({base: 1}[s] == 1)
+    verify({s: 1}[base] == 1)
+    verify({base: 1}[s] == 1)
     verify((s + "").__class__ is str)
     verify(s + "" == base)
     verify(("" + s).__class__ is str)
@@ -1613,14 +1613,14 @@
     verify(s.lower() == base)
 
     s = madstring("x y")
-    #XXX verify(s == "x y")
+    verify(s == "x y")
     verify(intern(s).__class__ is str)
     verify(intern(s) is intern("x y"))
     verify(intern(s) == "x y")
 
     i = intern("y x")
     s = madstring("y x")
-    #XXX verify(s == i)
+    verify(s == i)
     verify(intern(s).__class__ is str)
     verify(intern(s) is i)
 
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index 99a16ed..e29be5a 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -824,9 +824,10 @@
 	int min_len;
 	PyObject *result;
 
-	/* One of the objects is a string object. Make sure the
-	   other one is one, too.  */
-	if (a->ob_type != b->ob_type) {
+	/* May sure both arguments use string comparison.
+	   This implies PyString_Check(a) && PyString_Check(b). */
+	if (a->ob_type->tp_richcompare != (richcmpfunc)string_richcompare ||
+	    b->ob_type->tp_richcompare != (richcmpfunc)string_richcompare) {
 		result = Py_NotImplemented;
 		goto out;
 	}