merge from trunk
diff --git a/Objects/setobject.c b/Objects/setobject.c
index 1054166..d24e1af 100644
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -746,7 +746,8 @@
 	return key;
 }
 
-PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.");
+PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.\n\
+Raises KeyError if the set is empty.");
 
 static int
 set_traverse(PySetObject *so, visitproc visit, void *arg)
@@ -1861,7 +1862,7 @@
 static PyObject *
 set_remove(PySetObject *so, PyObject *key)
 {
-	PyObject *tmpkey, *result;
+	PyObject *tmpkey;
 	int rv;
 
 	rv = set_discard_key(so, key);
@@ -1873,11 +1874,14 @@
 		if (tmpkey == NULL)
 			return NULL;
 		set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
-		result = set_remove(so, tmpkey);
+		rv = set_discard_key(so, tmpkey);
 		set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
 		Py_DECREF(tmpkey);
-		return result;
-	} else if (rv == DISCARD_NOTFOUND) {
+		if (rv == -1)
+			return NULL;
+	} 
+
+	if (rv == DISCARD_NOTFOUND) {
 		set_key_error(key);
 		return NULL;
 	}