Fix assignment of a list to a slice of itself.
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 2e2b9a2..5811f40 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -357,8 +357,17 @@
 #define b ((listobject *)v)
 	if (v == NULL)
 		n = 0;
-	else if (is_listobject(v))
+	else if (is_listobject(v)) {
 		n = b->ob_size;
+		if (a == b) {
+			/* Special case "a[i:j] = a" -- copy b first */
+			int ret;
+			v = list_slice(b, 0, n);
+			ret = list_ass_slice(a, ilow, ihigh, v);
+			DECREF(v);
+			return ret;
+		}
+	}
 	else {
 		err_badarg();
 		return -1;