Perform typecheck for (typechecking) builtin casts.
authorRobert Bradshaw <robertwb@gmail.com>
Sun, 16 Jun 2013 04:54:23 +0000 (21:54 -0700)
committerStefan Behnel <stb@skoobe.de>
Sun, 14 Jul 2013 09:28:42 +0000 (11:28 +0200)
Cython/Compiler/ExprNodes.py
tests/run/typetest_T417.pyx

index bc8cb0e..f47ce3b 100755 (executable)
@@ -8022,6 +8022,7 @@ class TypecastNode(ExprNode):
     #  operand      ExprNode
     #  base_type    CBaseTypeNode
     #  declarator   CDeclaratorNode
+    #  typecheck    boolean
     #
     #  If used from a transform, one can if wanted specify the attribute
     #  "type" directly and leave base_type and declarator to None
@@ -8082,7 +8083,7 @@ class TypecastNode(ExprNode):
             else:
                 warning(self.pos, "No conversion from %s to %s, python object pointer used." % (self.type, self.operand.type))
         elif from_py and to_py:
-            if self.typecheck and self.type.is_extension_type:
+            if self.typecheck and self.type.is_pyobject:
                 self.operand = PyTypeTestNode(self.operand, self.type, env, notnone=True)
             elif isinstance(self.operand, SliceIndexNode):
                 # This cast can influence the created type of string slices.
index bca35b1..7d7b249 100644 (file)
@@ -101,3 +101,14 @@ def test_getFooCast():
     cdef int old_count = count
     cdef Foo x = <Foo?>getFoo()
     return count - old_count
+
+def test_builtin_typecheck_cast(maybe_list):
+    """
+    >>> test_builtin_typecheck_cast([])
+    []
+    >>> test_builtin_typecheck_cast({})
+    Traceback (most recent call last):
+       ...
+    TypeError: Expected list, got dict
+    """
+    return <list?>maybe_list