Reference type inference
authorRobert Bradshaw <robertwb@math.washington.edu>
Sun, 21 Feb 2010 10:11:21 +0000 (02:11 -0800)
committerRobert Bradshaw <robertwb@math.washington.edu>
Sun, 21 Feb 2010 10:11:21 +0000 (02:11 -0800)
Cython/Compiler/TypeInference.py
tests/wrappers/cpp_references.pyx

index 8c10bcd3dc906ff40ca7942645a315924bfacac3..6d33a7f8f9a3b38082ba96ac7708e342e68a7660 100644 (file)
@@ -276,10 +276,14 @@ def find_spanning_type(type1, type2):
 
 def aggressive_spanning_type(types, might_overflow):
     result_type = reduce(find_spanning_type, types)
+    if result_type.is_reference:
+        result_type = result_type.ref_base_type
     return result_type
 
 def safe_spanning_type(types, might_overflow):
     result_type = reduce(find_spanning_type, types)
+    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
index bf53a2e25d34ee8acee205a9af9ed49d24aea517..a4c2edd290b84afb36b56b8bf28e1c26b0b8b0e2 100644 (file)
@@ -1,9 +1,13 @@
+cimport cython
+
+
 cdef extern from "cpp_references_helper.h":
     cdef int& ref_func(int&)
     
     cdef int ref_var_value
     cdef int& ref_var
 
+
 def test_ref_func(int x):
     """
     >>> test_ref_func(2)
@@ -42,3 +46,15 @@ def test_ref_assign(int x):
     """
     cdef double d = ref_func(x)
     return d
+
+@cython.infer_types(True)
+def test_ref_inference(int x):
+    """
+    >>> test_ref_inference(23)
+    23
+    >>> test_ref_inference(29)
+    29
+    """
+    z = ref_func(x)
+    assert cython.typeof(z) == "int", cython.typeof(z)
+    return z