The endless 460020 bug.
Disable t[:], t*0, t*1 optimizations when t is of a tuple subclass type.
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 7095f0b..5c4db30 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -1417,9 +1417,18 @@
     a = madtuple((1,2,3,4,5))
     verify(tuple(a) == (1,2,3,4,5))
     verify(tuple(a).__class__ is tuple)
+    verify(a[:].__class__ is tuple)
+    verify((a * 1).__class__ is tuple)
+    verify((a * 0).__class__ is tuple)
+    verify((a + ()).__class__ is tuple)
     a = madtuple(())
     verify(tuple(a) == ())
     verify(tuple(a).__class__ is tuple)
+    verify((a + a).__class__ is tuple)
+    verify((a * 0).__class__ is tuple)
+    verify((a * 1).__class__ is tuple)
+    verify((a * 2).__class__ is tuple)
+    verify(a[:].__class__ is tuple)
 
     class madstring(str):
         _rev = None
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index b07eb74..f371e1e 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -298,8 +298,7 @@
 		ihigh = a->ob_size;
 	if (ihigh < ilow)
 		ihigh = ilow;
-	if (ilow == 0 && ihigh == a->ob_size) {
-		/* XXX can only do this if tuples are immutable! */
+	if (ilow == 0 && ihigh == a->ob_size && PyTuple_CheckExact(a)) {
 		Py_INCREF(a);
 		return (PyObject *)a;
 	}
@@ -366,10 +365,14 @@
 	if (n < 0)
 		n = 0;
 	if (a->ob_size == 0 || n == 1) {
-		/* Since tuples are immutable, we can return a shared
-		   copy in this case */
-		Py_INCREF(a);
-		return (PyObject *)a;
+		if (PyTuple_CheckExact(a)) {
+			/* Since tuples are immutable, we can return a shared
+			   copy in this case */
+			Py_INCREF(a);
+			return (PyObject *)a;
+		}
+		if (a->ob_size == 0)
+			return PyTuple_New(0);
 	}
 	size = a->ob_size * n;
 	if (size/a->ob_size != n)