diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 952eb32a41d703cac2b51772570dfe4053b35a56..3ad886b6950d80ce9efba719683bbaa71fdac798 100755 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -8034,6 +8034,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 @@ -8094,7 +8095,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. diff --git a/tests/run/typetest_T417.pyx b/tests/run/typetest_T417.pyx index bca35b1d4728fa56abe1552188da7f6c07e31c40..7d7b2490288aaece461563b5a3ed23cc9185b519 100644 --- a/tests/run/typetest_T417.pyx +++ b/tests/run/typetest_T417.pyx @@ -101,3 +101,14 @@ def test_getFooCast(): cdef int old_count = count cdef Foo x = 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 maybe_list