From 52e6c71b1d763d4b53a35f91edda77850fc43a51 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Sat, 10 Oct 2009 21:45:42 +0200 Subject: [PATCH] disable coercion from str->bytes, fix coercion from str->object --- Cython/Compiler/ExprNodes.py | 11 +++--- tests/errors/string_assignments.pyx | 52 +++++++++++++++++------------ 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index bd5912dc..b4149a34 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -909,12 +909,13 @@ class StringNode(PyConstNode): def coerce_to(self, dst_type, env): if dst_type is Builtin.str_type: return self - if dst_type is Builtin.bytes_type: - # special case: bytes = 'str literal' - return BytesNode(self.pos, value=self.value) - elif not dst_type.is_pyobject: +# if dst_type is Builtin.bytes_type: +# # special case: bytes = 'str literal' +# return BytesNode(self.pos, value=self.value) + if not dst_type.is_pyobject: return BytesNode(self.pos, value=self.value).coerce_to(dst_type, env) - self.check_for_coercion_error(dst_type) + if dst_type is not py_object_type: + self.check_for_coercion_error(dst_type, fail=True) return self def generate_evaluation_code(self, code): diff --git a/tests/errors/string_assignments.pyx b/tests/errors/string_assignments.pyx index 5a906396..aaccef0e 100644 --- a/tests/errors/string_assignments.pyx +++ b/tests/errors/string_assignments.pyx @@ -2,15 +2,14 @@ # ok: cdef char* c1 = "abc" -cdef bytes b1 = "abc" cdef str s1 = "abc" cdef unicode u1 = u"abc" -cdef bytes b2 = b"abc" +cdef bytes b1 = b"abc" cdef char* c2 = b"abc" -cdef bytes b3 = c1 +cdef bytes b2 = c1 cdef char* c3 = b1 cdef object o1 = "abc" @@ -42,24 +41,35 @@ cdef unicode u_f3 = b"abc" cdef unicode u_f4 = b1 cdef unicode u_f5 = c1 +cdef tuple t_f1 = "abc" +cdef tuple t_f2 = u"abc" +cdef tuple t_f3 = b"abc" + +cdef list l_f1 = s1 +cdef list l_f2 = b1 +cdef list l_f3 = u1 _ERRORS = u""" -26:20: Unicode objects do not support coercion to C types. -27:22: Unicode objects do not support coercion to C types. -28:22: 'str' objects do not support coercion to C types. - -30:20: Cannot convert Unicode string to 'bytes' implicitly, encoding required. -31:22: Cannot convert Unicode string to 'bytes' implicitly, encoding required. -32:22: Cannot convert 'str' to 'bytes' implicitly. This is not portable. - -34:17: Cannot assign type 'char *' to 'str object' -35:19: Cannot convert 'bytes' object to str implicitly. This is not portable to Py3. -36:17: Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding. -37:19: Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding. - -39:20: str objects do not support coercion to unicode, use a unicode string literal instead (u'') -40:22: str objects do not support coercion to unicode, use a unicode string literal instead (u'') -41:20: Cannot assign type 'char *' to 'unicode object' -42:22: Cannot convert 'bytes' object to unicode implicitly, decoding required -43:22: Cannot convert 'char*' to unicode implicitly, decoding required +25:20: Unicode objects do not support coercion to C types. +26:22: Unicode objects do not support coercion to C types. +27:22: 'str' objects do not support coercion to C types. + +29:20: Cannot convert Unicode string to 'bytes' implicitly, encoding required. +30:22: Cannot convert Unicode string to 'bytes' implicitly, encoding required. +31:22: Cannot convert 'str' to 'bytes' implicitly. This is not portable. + +33:17: Cannot assign type 'char *' to 'str object' +34:19: Cannot convert 'bytes' object to str implicitly. This is not portable to Py3. +35:17: Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding. +36:19: Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding. + +38:20: str objects do not support coercion to unicode, use a unicode string literal instead (u'') +39:22: str objects do not support coercion to unicode, use a unicode string literal instead (u'') +40:20: Cannot assign type 'char *' to 'unicode object' +41:22: Cannot convert 'bytes' object to unicode implicitly, decoding required +42:22: Cannot convert 'char*' to unicode implicitly, decoding required + +44:19: Cannot assign type 'str object' to 'tuple object' +45:18: Cannot assign type 'unicode object' to 'tuple object' +46:18: Cannot assign type 'char *' to 'tuple object' """ -- 2.26.2