PyObject_Compare can raise an exception now.
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 190600e..97af9ac 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -484,10 +484,8 @@
 			cmp = -1;
 		Py_XDECREF(ai);
 		Py_XDECREF(bi);
-		if (cmp != 0) {
-			PyErr_Clear(); /* XXX Can't report errors here */
+		if (cmp != 0)
 			return cmp;
-		}
 	}
 	return v->ob_size - w->ob_size;
 }
@@ -823,6 +821,7 @@
 	for (i = 0; i < self->ob_size; i++) {
 		if (PyObject_Compare(self->ob_item[i], args) == 0)
 			return PyInt_FromLong((long)i);
+		/* XXX PyErr_Occurred */
 	}
 	PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array");
 	return NULL;
@@ -845,6 +844,7 @@
 	for (i = 0; i < self->ob_size; i++) {
 		if (PyObject_Compare(self->ob_item[i], args) == 0)
 			count++;
+		/* XXX PyErr_Occurred */
 	}
 	return PyInt_FromLong((long)count);
 }
@@ -870,7 +870,7 @@
 			Py_INCREF(Py_None);
 			return Py_None;
 		}
-			
+		/* XXX PyErr_Occurred */
 	}
 	PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array");
 	return NULL;
diff --git a/Objects/classobject.c b/Objects/classobject.c
index 4ff34be..749a06a 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -349,7 +349,6 @@
 			PyObject *f, *t, *v, *tb;
  			PyErr_Fetch(&t, &v, &tb);
 			f = PySys_GetObject("stderr");
-			PyErr_Clear();
 			if (f != NULL) {
 				PyFile_WriteString("Exception ", f);
 				if (t) {
@@ -565,9 +564,13 @@
 	PyObject *result;
 	long outcome;
 	result = instance_compare1(inst, other);
-	if (result == NULL || !PyInt_Check(result)) {
-		PyErr_Clear();
-		return (inst < other) ? -1 : 1;
+	if (result == NULL)
+		return -1;
+	if (!PyInt_Check(result)) {
+		Py_DECREF(result);
+		PyErr_SetString(PyExc_TypeError,
+				"comparison did not return an int");
+		return -1;
 	}
 	outcome = PyInt_AsLong(result);
 	Py_DECREF(result);
@@ -899,6 +902,11 @@
 		return result;
 	if (halfbinop(w, v, ropname, &result, thisfunc, 1) <= 0)
 		return result;
+	/* Sigh -- special case for comnparisons */
+	if (strcmp(opname, "__cmp__") == 0) {
+		long c = (v < w) ? -1 : (v > w) ? 1 : 0;
+		return PyInt_FromLong(c);
+	}
 	sprintf(buf, "%s nor %s defined for these operands", opname, ropname);
 	PyErr_SetString(PyExc_TypeError, buf);
 	return NULL;
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 16d63b8..588053c 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -580,8 +580,12 @@
 	PyObject *args, *res;
 	int i;
 
-	if (compare == NULL)
-		return PyObject_Compare(x, y);
+	if (compare == NULL) {
+		i = PyObject_Compare(x, y);
+		if (i && PyErr_Occurred())
+			i = CMPERROR;
+		return i;
+	}
 
 	args = Py_BuildValue("(OO)", x, y);
 	if (args == NULL)
@@ -955,6 +959,8 @@
 	for (i = 0; i < self->ob_size; i++) {
 		if (PyObject_Compare(self->ob_item[i], args) == 0)
 			return PyInt_FromLong((long)i);
+		if (PyErr_Occurred())
+			return NULL;
 	}
 	PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
 	return NULL;
@@ -975,6 +981,8 @@
 	for (i = 0; i < self->ob_size; i++) {
 		if (PyObject_Compare(self->ob_item[i], args) == 0)
 			count++;
+		if (PyErr_Occurred())
+			return NULL;
 	}
 	return PyInt_FromLong((long)count);
 }
@@ -998,7 +1006,8 @@
 			Py_INCREF(Py_None);
 			return Py_None;
 		}
-			
+		if (PyErr_Occurred())
+			return NULL;
 	}
 	PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
 	return NULL;
diff --git a/Objects/object.c b/Objects/object.c
index 29269d0..023477f 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -255,13 +255,17 @@
 do_cmp(v, w)
 	PyObject *v, *w;
 {
+	long c;
 	/* __rcmp__ actually won't be called unless __cmp__ isn't defined,
 	   because the check in cmpobject() reverses the objects first.
 	   This is intentional -- it makes no sense to define cmp(x,y)
 	   different than -cmp(y,x). */
 	if (PyInstance_Check(v) || PyInstance_Check(w))
 		return PyInstance_DoBinOp(v, w, "__cmp__", "__rcmp__", do_cmp);
-	return PyInt_FromLong((long)PyObject_Compare(v, w));
+	c = PyObject_Compare(v, w);
+	if (c && PyErr_Occurred())
+		return NULL;
+	return PyInt_FromLong(c);
 }
 
 int
@@ -269,25 +273,25 @@
 	PyObject *v, *w;
 {
 	PyTypeObject *tp;
+	if (v == NULL || w == NULL) {
+		PyErr_BadInternalCall();
+		return -1;
+	}
 	if (v == w)
 		return 0;
-	if (v == NULL)
-		return -1;
-	if (w == NULL)
-		return 1;
 	if (PyInstance_Check(v) || PyInstance_Check(w)) {
 		PyObject *res;
 		int c;
 		if (!PyInstance_Check(v))
 			return -PyObject_Compare(w, v);
 		res = do_cmp(v, w);
-		if (res == NULL) {
-			PyErr_Clear();
-			return (v < w) ? -1 : 1;
-		}
+		if (res == NULL)
+			return -1;
 		if (!PyInt_Check(res)) {
 			Py_DECREF(res);
-			return (v < w) ? -1 : 1;
+			PyErr_SetString(PyExc_TypeError,
+					"comparison did not return an int");
+			return -1;
 		}
 		c = PyInt_AsLong(res);
 		Py_DECREF(res);
@@ -296,11 +300,8 @@
 	if ((tp = v->ob_type) != w->ob_type) {
 		if (tp->tp_as_number != NULL &&
 				w->ob_type->tp_as_number != NULL) {
-			if (PyNumber_Coerce(&v, &w) != 0) {
-				PyErr_Clear();
-				/* XXX Should report the error,
-				   XXX but the interface isn't there... */
-			}
+			if (PyNumber_Coerce(&v, &w) != 0)
+				return -1;
 			else {
 				int cmp = (*v->ob_type->tp_compare)(v, w);
 				Py_DECREF(v);
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 4029e1b..245d31e 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -245,10 +245,14 @@
 	PyObject *args;
 {
 	PyObject *a, *b;
+	long c;
 
 	if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
 		return NULL;
-	return PyInt_FromLong((long)PyObject_Compare(a, b));
+	c = PyObject_Compare(a, b);
+	if (c && PyErr_Occurred())
+		return NULL;
+	return PyInt_FromLong(c);
 }
 
 static PyObject *
@@ -1073,7 +1077,13 @@
 		if (w == NULL)
 			w = x;
 		else {
-			if (PyObject_Compare(x, w) * sign > 0) {
+			int c = PyObject_Compare(x, w);
+			if (c && PyErr_Occurred()) {
+				Py_DECREF(x);
+				Py_XDECREF(w);
+				return NULL;
+			}
+			if (c * sign > 0) {
 				Py_DECREF(w);
 				w = x;
 			}
@@ -1360,8 +1370,8 @@
 			PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
 			return NULL;
 		}
-		Py_FlushLine();
-		if (PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
+		if (Py_FlushLine() != 0 ||
+		    PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
 			return NULL;
 	}
 	f = PySys_GetObject("stdin");
diff --git a/Python/ceval.c b/Python/ceval.c
index 7897006..bd312b2 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -456,6 +456,9 @@
 				if (PyObject_Compare(keyword, nm) == 0)
 					break;
 			}
+			/* Check errors from Compare */
+			if (PyErr_Occurred())
+				goto fail;
 			if (j >= co->co_argcount) {
 				if (kwdict == NULL) {
 					PyErr_Format(PyExc_TypeError,
@@ -2475,6 +2478,8 @@
 		Py_XDECREF(x);
 		if (cmp == 0)
 			return 1;
+		if (PyErr_Occurred())
+			return -1;
 	}
 	return 0;
 }
@@ -2507,6 +2512,8 @@
 		break;
 	default:
 		cmp = PyObject_Compare(v, w);
+		if (cmp && PyErr_Occurred())
+			return NULL;
 		switch (op) {
 		case LT: res = cmp <  0; break;
 		case LE: res = cmp <= 0; break;
diff --git a/Python/compile.c b/Python/compile.c
index 155142a..36304e3 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -666,7 +666,8 @@
 		if (v->ob_type == w->ob_type && PyObject_Compare(v, w) == 0)
 			return i;
 	}
-	if (PyList_Append(list, v) != 0)
+	/* Check for error from PyObject_Compare */
+	if (PyErr_Occurred() || PyList_Append(list, v) != 0)
 		c->c_errors++;
 	return n;
 }