Make str unsafe for type inference. See trac #553.
authorCraig Citro <craigcitro@gmail.com>
Wed, 7 Jul 2010 05:34:43 +0000 (22:34 -0700)
committerCraig Citro <craigcitro@gmail.com>
Wed, 7 Jul 2010 05:34:43 +0000 (22:34 -0700)
Cython/Compiler/TypeInference.py
tests/run/type_inference.pyx

index 2b865b507a1cb607d9a3a9709d53c106144e0901..a21042f2806b84b602c36620e5efac5656625559 100644 (file)
@@ -314,8 +314,14 @@ def safe_spanning_type(types, might_overflow):
     if result_type.is_reference:
         result_type = result_type.ref_base_type
     if result_type.is_pyobject:
-        # any specific Python type is always safe to infer
-        return result_type
+        # In theory, any specific Python type is always safe to
+        # infer. However, inferring str can cause some existing code
+        # to break, since we are also now much more strict about
+        # coercion from str to char *. See trac #553.
+        if result_type.name == 'str':
+            return py_object_type
+        else:
+            return result_type
     elif result_type is PyrexTypes.c_double_type:
         # Python's float type is just a C double, so it's safe to use
         # the C type instead
index a05848f5fb909b13c32acfae10a751621794a41f..f7fe85510c6b81b76106089521d080677d40d80a 100644 (file)
@@ -362,6 +362,11 @@ def safe_only():
     res = ~d
     assert typeof(d) == "long", typeof(d)
 
+    # we special-case inference to type str, see
+    # trac # 
+    s = "abc"
+    assert typeof(s) == "Python object", typeof(s)
+
     # potentially overflowing arithmetic
     e = 1
     e += 1