From bc2975126b1d040a7bac54009e9209c35266d5ec Mon Sep 17 00:00:00 2001
From: Robert Bradshaw <robertwb@math.washington.edu>
Date: Sat, 18 Apr 2009 01:02:12 -0700
Subject: [PATCH] Fix T284, cdef list setitem

---
 Cython/Compiler/ExprNodes.py    | 15 +++++++--------
 tests/bugs.txt                  |  1 -
 tests/run/cdef_setitem_T284.pyx | 10 ++++++++++
 3 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py
index 3bca440a..2abce3f3 100644
--- a/Cython/Compiler/ExprNodes.py
+++ b/Cython/Compiler/ExprNodes.py
@@ -1856,14 +1856,13 @@ class IndexNode(ExprNode):
             index_code = self.index.py_result()
             if self.base.type is dict_type:
                 function = "PyDict_SetItem"
-            elif self.base.type is list_type:
-                function = "PyList_SetItem"
-            # don't use PyTuple_SetItem(), as we'd normally get a
-            # TypeError when changing a tuple, while PyTuple_SetItem()
-            # would allow updates
-            #
-            #elif self.base.type is tuple_type:
-            #    function = "PyTuple_SetItem"
+            # It would seem that we could specalized lists/tuples, but that
+            # shouldn't happen here. 
+            # Both PyList_SetItem PyTuple_SetItem and a Py_ssize_t as input, 
+            # not a PyObject*, and bad conversion here would give the wrong 
+            # exception. Also, tuples are supposed to be immutable, and raise 
+            # TypeErrors when trying to set their entries (PyTuple_SetItem 
+            # is for creating new tuples from). 
             else:
                 function = "PyObject_SetItem"
         code.putln(
diff --git a/tests/bugs.txt b/tests/bugs.txt
index 1d8ba7e1..ce41eb17 100644
--- a/tests/bugs.txt
+++ b/tests/bugs.txt
@@ -14,4 +14,3 @@ large_consts_T237
 bad_c_struct_T252
 missing_baseclass_in_predecl_T262
 ifelseexpr_T267
-cdef_setitem_T284
diff --git a/tests/run/cdef_setitem_T284.pyx b/tests/run/cdef_setitem_T284.pyx
index 3fd4c6d9..81edbba4 100644
--- a/tests/run/cdef_setitem_T284.pyx
+++ b/tests/run/cdef_setitem_T284.pyx
@@ -1,6 +1,12 @@
 __doc__ = u'''
 >>> no_cdef()
 >>> with_cdef()
+>>> test_list(range(11), -2, None)
+[0, 1, 2, 3, 4, 5, 6, 7, 8, None, 10]
+>>> test_list(range(11), "invalid index", None)
+Traceback (most recent call last):
+...
+TypeError: list indices must be integers
 '''
 def no_cdef():
     lst = range(11)
@@ -15,3 +21,7 @@ def with_cdef():
     lst[ob] = -10
     cdef dict dd = {}
     dd[ob] = -10
+
+def test_list(list L, object i, object a):
+    L[i] = a
+    return L
-- 
2.26.2