Do the same thing to complex that I did to str: the rich comparison
function returns NotImplemented when comparing objects whose
tp_richcompare slot is not itself.
diff --git a/Objects/complexobject.c b/Objects/complexobject.c
index 191dcba..32f2b24 100644
--- a/Objects/complexobject.c
+++ b/Objects/complexobject.c
@@ -553,12 +553,6 @@
 	Py_complex i, j;
 	PyObject *res;
 
-	if (op != Py_EQ && op != Py_NE) {
-		PyErr_SetString(PyExc_TypeError,
-			"cannot compare complex numbers using <, <=, >, >=");
-		return NULL;
-	}
-
 	c = PyNumber_CoerceEx(&v, &w);
 	if (c < 0)
 		return NULL;
@@ -566,7 +560,10 @@
 		Py_INCREF(Py_NotImplemented);
 		return Py_NotImplemented;
 	}
-	if (!PyComplex_Check(v) || !PyComplex_Check(w)) {
+	/* May sure both arguments use complex comparison.
+	   This implies PyComplex_Check(a) && PyComplex_Check(b). */
+	if (v->ob_type->tp_richcompare != complex_richcompare ||
+	    w->ob_type->tp_richcompare != complex_richcompare) {
 		Py_DECREF(v);
 		Py_DECREF(w);
 		Py_INCREF(Py_NotImplemented);
@@ -578,6 +575,12 @@
 	Py_DECREF(v);
 	Py_DECREF(w);
 
+	if (op != Py_EQ && op != Py_NE) {
+		PyErr_SetString(PyExc_TypeError,
+			"cannot compare complex numbers using <, <=, >, >=");
+		return NULL;
+	}
+
 	if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
 		res = Py_True;
 	else