Blame tests/run/type_inference.pyx

Packit 562c7a
# cython: infer_types = True
Packit 562c7a
Packit 562c7a
Packit 562c7a
cimport cython
Packit 562c7a
from cython cimport typeof, infer_types
Packit 562c7a
Packit 562c7a
from cpython cimport bool
Packit 562c7a
Packit 562c7a
##################################################
Packit 562c7a
# type inference tests in 'full' mode
Packit 562c7a
Packit 562c7a
cdef class MyType:
Packit 562c7a
    pass
Packit 562c7a
Packit 562c7a
def simple():
Packit 562c7a
    """
Packit 562c7a
    >>> simple()
Packit 562c7a
    """
Packit 562c7a
    i = 3
Packit 562c7a
    assert typeof(i) == "long", typeof(i)
Packit 562c7a
    x = 1.41
Packit 562c7a
    assert typeof(x) == "double", typeof(x)
Packit 562c7a
    xptr = &x
Packit 562c7a
    assert typeof(xptr) == "double *", typeof(xptr)
Packit 562c7a
    xptrptr = &xptr
Packit 562c7a
    assert typeof(xptrptr) == "double **", typeof(xptrptr)
Packit 562c7a
    b = b"abc"
Packit 562c7a
    assert typeof(b) == "bytes object", typeof(b)
Packit 562c7a
    s = "abc"
Packit 562c7a
    assert typeof(s) == "str object", typeof(s)
Packit 562c7a
    u = u"xyz"
Packit 562c7a
    assert typeof(u) == "unicode object", typeof(u)
Packit 562c7a
    L = [1,2,3]
Packit 562c7a
    assert typeof(L) == "list object", typeof(L)
Packit 562c7a
    t = (4,5,6,())
Packit 562c7a
    assert typeof(t) == "tuple object", typeof(t)
Packit 562c7a
    t2 = (4, 5.0, 6)
Packit 562c7a
    assert typeof(t2) == "(long, double, long)", typeof(t)
Packit 562c7a
Packit 562c7a
def builtin_types():
Packit 562c7a
    """
Packit 562c7a
    >>> builtin_types()
Packit 562c7a
    """
Packit 562c7a
    b = bytes()
Packit 562c7a
    assert typeof(b) == "bytes object", typeof(b)
Packit 562c7a
    u = unicode()
Packit 562c7a
    assert typeof(u) == "unicode object", typeof(u)
Packit 562c7a
    L = list()
Packit 562c7a
    assert typeof(L) == "list object", typeof(L)
Packit 562c7a
    t = tuple()
Packit 562c7a
    assert typeof(t) == "tuple object", typeof(t)
Packit 562c7a
    d = dict()
Packit 562c7a
    assert typeof(d) == "dict object", typeof(d)
Packit 562c7a
    B = bool()
Packit 562c7a
    assert typeof(B) == "bool", typeof(B)
Packit 562c7a
Packit 562c7a
def slicing():
Packit 562c7a
    """
Packit 562c7a
    >>> slicing()
Packit 562c7a
    """
Packit 562c7a
    b = b"abc"
Packit 562c7a
    assert typeof(b) == "bytes object", typeof(b)
Packit 562c7a
    b1 = b[1:2]
Packit 562c7a
    assert typeof(b1) == "bytes object", typeof(b1)
Packit 562c7a
    b2 = b[1:2:2]
Packit 562c7a
    assert typeof(b2) == "bytes object", typeof(b2)
Packit 562c7a
    u = u"xyz"
Packit 562c7a
    assert typeof(u) == "unicode object", typeof(u)
Packit 562c7a
    u1 = u[1:2]
Packit 562c7a
    assert typeof(u1) == "unicode object", typeof(u1)
Packit 562c7a
    u2 = u[1:2:2]
Packit 562c7a
    assert typeof(u2) == "unicode object", typeof(u2)
Packit 562c7a
    s = "xyz"
Packit 562c7a
    assert typeof(s) == "str object", typeof(s)
Packit 562c7a
    s1 = s[1:2]
Packit 562c7a
    assert typeof(s1) == "str object", typeof(s1)
Packit 562c7a
    s2 = s[1:2:2]
Packit 562c7a
    assert typeof(s2) == "str object", typeof(s2)
Packit 562c7a
    L = [1,2,3]
Packit 562c7a
    assert typeof(L) == "list object", typeof(L)
Packit 562c7a
    L1 = L[1:2]
Packit 562c7a
    assert typeof(L1) == "list object", typeof(L1)
Packit 562c7a
    L2 = L[1:2:2]
Packit 562c7a
    assert typeof(L2) == "list object", typeof(L2)
Packit 562c7a
    t = (4,5,6,())
Packit 562c7a
    assert typeof(t) == "tuple object", typeof(t)
Packit 562c7a
    t1 = t[1:2]
Packit 562c7a
    assert typeof(t1) == "tuple object", typeof(t1)
Packit 562c7a
    t2 = t[1:2:2]
Packit 562c7a
    assert typeof(t2) == "tuple object", typeof(t2)
Packit 562c7a
Packit 562c7a
def indexing():
Packit 562c7a
    """
Packit 562c7a
    >>> indexing()
Packit 562c7a
    """
Packit 562c7a
    b = b"abc"
Packit 562c7a
    assert typeof(b) == "bytes object", typeof(b)
Packit 562c7a
    b1 = b[1]
Packit 562c7a
    assert typeof(b1) == "Python object", typeof(b1) # Py2: bytes, Py3: int
Packit 562c7a
    u = u"xyz"
Packit 562c7a
    assert typeof(u) == "unicode object", typeof(u)
Packit 562c7a
    u1 = u[1]
Packit 562c7a
    assert typeof(u1) == "Py_UCS4", typeof(u1)
Packit 562c7a
    s = "xyz"
Packit 562c7a
    assert typeof(s) == "str object", typeof(s)
Packit 562c7a
    s1 = s[1]
Packit 562c7a
    assert typeof(s1) == "str object", typeof(s1)
Packit 562c7a
    L = [1,2,3]
Packit 562c7a
    assert typeof(L) == "list object", typeof(L)
Packit 562c7a
    L1 = L[1]
Packit 562c7a
    assert typeof(L1) == "Python object", typeof(L1)
Packit 562c7a
    t = (4,5,())
Packit 562c7a
    assert typeof(t) == "tuple object", typeof(t)
Packit 562c7a
    t1 = t[1]
Packit 562c7a
    assert typeof(t1) == "long", typeof(t1)
Packit 562c7a
    t2 = ('abc', 'def', 'ghi')
Packit 562c7a
    assert typeof(t2) == "tuple object", typeof(t2)
Packit 562c7a
    t2_1 = t2[1]
Packit 562c7a
    assert typeof(t2_1) == "str object", typeof(t2_1)
Packit 562c7a
    t2_2 = t2[t[0]-3]
Packit 562c7a
    assert typeof(t2_2) == "str object", typeof(t2_2)
Packit 562c7a
    t5 = (b'abc', 'def', u'ghi')
Packit 562c7a
    t5_0 = t5[0]
Packit 562c7a
    assert typeof(t5_0) == "bytes object", typeof(t5_0)
Packit 562c7a
    t5_1 = t5[1]
Packit 562c7a
    assert typeof(t5_1) == "str object", typeof(t5_1)
Packit 562c7a
    t5_2 = t5[2]
Packit 562c7a
    assert typeof(t5_2) == "unicode object", typeof(t5_2)
Packit 562c7a
    t5_3 = t5[t[0]-3]
Packit 562c7a
    assert typeof(t5_3) == "Python object", typeof(t5_3)
Packit 562c7a
Packit 562c7a
Packit 562c7a
def multiple_assignments():
Packit 562c7a
    """
Packit 562c7a
    >>> multiple_assignments()
Packit 562c7a
    """
Packit 562c7a
    a = 3
Packit 562c7a
    a = 4
Packit 562c7a
    a = 5
Packit 562c7a
    assert typeof(a) == "long", typeof(a)
Packit 562c7a
    b = a
Packit 562c7a
    b = 3.1
Packit 562c7a
    b = 3.14159
Packit 562c7a
    assert typeof(b) == "double", typeof(b)
Packit 562c7a
    c = a
Packit 562c7a
    c = b
Packit 562c7a
    c = [1,2,3]
Packit 562c7a
    assert typeof(c) == "Python object", typeof(c)
Packit 562c7a
    d = b'abc'
Packit 562c7a
    d = bytes()
Packit 562c7a
    d = bytes(b'xyz')
Packit 562c7a
    d = None
Packit 562c7a
    assert typeof(d) == "bytes object", typeof(d)
Packit 562c7a
Packit 562c7a
Packit 562c7a
def arithmetic():
Packit 562c7a
    """
Packit 562c7a
    >>> arithmetic()
Packit 562c7a
    """
Packit 562c7a
    a = 1 + 2
Packit 562c7a
    assert typeof(a) == "long", typeof(a)
Packit 562c7a
    b = 1 + 1.5
Packit 562c7a
    assert typeof(b) == "double", typeof(b)
Packit 562c7a
    c = 1 + <object>2
Packit 562c7a
    assert typeof(c) == "Python object", typeof(c)
Packit 562c7a
    d = 1 * 1.5 ** 2
Packit 562c7a
    assert typeof(d) == "double", typeof(d)
Packit 562c7a
Packit 562c7a
cdef class some_class:
Packit 562c7a
    pass
Packit 562c7a
Packit 562c7a
def unary_operators():
Packit 562c7a
    """
Packit 562c7a
    >>> unary_operators()
Packit 562c7a
    """
Packit 562c7a
    cdef int x = 1
Packit 562c7a
    assert typeof(~x) == "int", typeof(~x)
Packit 562c7a
    cdef some_class obj
Packit 562c7a
    assert typeof(~obj) == "Python object", typeof(~obj)
Packit 562c7a
    a = int(1)
Packit 562c7a
    assert typeof(a) == "Python object", typeof(a)
Packit 562c7a
    b = not int(3)
Packit 562c7a
    assert typeof(b) == "bint", typeof(b)
Packit 562c7a
    c = +int(3)
Packit 562c7a
    assert typeof(c) == "Python object", typeof(c)
Packit 562c7a
    d = -int(5)
Packit 562c7a
    assert typeof(d) == "Python object", typeof(d)
Packit 562c7a
Packit 562c7a
Packit 562c7a
def builtin_type_operations():
Packit 562c7a
    """
Packit 562c7a
    >>> builtin_type_operations()
Packit 562c7a
    """
Packit 562c7a
    b1 = b'a' * 10
Packit 562c7a
    b1 = 10 * b'a'
Packit 562c7a
    b1 = 10 * b'a' * 10
Packit 562c7a
    assert typeof(b1) == "bytes object", typeof(b1)
Packit 562c7a
    b2 = b'a' + b'b'
Packit 562c7a
    assert typeof(b2) == "bytes object", typeof(b2)
Packit 562c7a
    u1 = u'a' * 10
Packit 562c7a
    u1 = 10 * u'a'
Packit 562c7a
    assert typeof(u1) == "unicode object", typeof(u1)
Packit 562c7a
    u2 = u'a' + u'b'
Packit 562c7a
    assert typeof(u2) == "unicode object", typeof(u2)
Packit 562c7a
    u3 = u'a%s' % u'b'
Packit 562c7a
    u3 = u'a%s' % 10
Packit 562c7a
    assert typeof(u3) == "unicode object", typeof(u3)
Packit 562c7a
    s1 = "abc %s" % "x"
Packit 562c7a
    s1 = "abc %s" % 10
Packit 562c7a
    assert typeof(s1) == "str object", typeof(s1)
Packit 562c7a
    s2 = "abc %s" + "x"
Packit 562c7a
    assert typeof(s2) == "str object", typeof(s2)
Packit 562c7a
    s3 = "abc %s" * 10
Packit 562c7a
    s3 = "abc %s" * 10 * 10
Packit 562c7a
    s3 = 10 * "abc %s" * 10
Packit 562c7a
    assert typeof(s3) == "str object", typeof(s3)
Packit 562c7a
    L1 = [] + []
Packit 562c7a
    assert typeof(L1) == "list object", typeof(L1)
Packit 562c7a
    L2 = [] * 2
Packit 562c7a
    assert typeof(L2) == "list object", typeof(L2)
Packit 562c7a
    T1 = () + ()
Packit 562c7a
    assert typeof(T1) == "tuple object", typeof(T1)
Packit 562c7a
    T2 = () * 2
Packit 562c7a
    assert typeof(T2) == "tuple object", typeof(T2)
Packit 562c7a
Packit 562c7a
def builtin_type_methods():
Packit 562c7a
    """
Packit 562c7a
    >>> builtin_type_methods()
Packit 562c7a
    """
Packit 562c7a
    l = []
Packit 562c7a
    assert typeof(l) == 'list object', typeof(l)
Packit 562c7a
    append = l.append
Packit 562c7a
    assert typeof(append) == 'Python object', typeof(append)
Packit 562c7a
    append(1)
Packit 562c7a
    assert l == [1], str(l)
Packit 562c7a
Packit 562c7a
cdef int cfunc(int x):
Packit 562c7a
    return x+1
Packit 562c7a
Packit 562c7a
def c_functions():
Packit 562c7a
    """
Packit 562c7a
    >>> c_functions()
Packit 562c7a
    """
Packit 562c7a
    f = cfunc
Packit 562c7a
    assert typeof(f) == 'int (*)(int)', typeof(f)
Packit 562c7a
    assert 2 == f(1)
Packit 562c7a
Packit 562c7a
def builtin_functions():
Packit 562c7a
    """
Packit 562c7a
    >>> _abs, _getattr = builtin_functions()
Packit 562c7a
    Python object
Packit 562c7a
    Python object
Packit 562c7a
    >>> _abs(-1)
Packit 562c7a
    1
Packit 562c7a
    >>> class o(object): pass
Packit 562c7a
    >>> o.x = 1
Packit 562c7a
    >>> _getattr(o, 'x')
Packit 562c7a
    1
Packit 562c7a
    """
Packit 562c7a
    _abs = abs
Packit 562c7a
    print(typeof(_abs))
Packit 562c7a
    _getattr = getattr
Packit 562c7a
    print(typeof(_getattr))
Packit 562c7a
    return _abs, _getattr
Packit 562c7a
Packit 562c7a
def cascade():
Packit 562c7a
    """
Packit 562c7a
    >>> cascade()
Packit 562c7a
    """
Packit 562c7a
    a = 1.0
Packit 562c7a
    b = a + 2
Packit 562c7a
    c = b + 3
Packit 562c7a
    d = c + 4
Packit 562c7a
    assert typeof(d) == "double"
Packit 562c7a
    e = a + b + c + d
Packit 562c7a
    assert typeof(e) == "double"
Packit 562c7a
Packit 562c7a
def cascaded_assignment():
Packit 562c7a
    a = b = c = d = 1.0
Packit 562c7a
    assert typeof(a) == "double"
Packit 562c7a
    assert typeof(b) == "double"
Packit 562c7a
    assert typeof(c) == "double"
Packit 562c7a
    assert typeof(d) == "double"
Packit 562c7a
    e = a + b + c + d
Packit 562c7a
    assert typeof(e) == "double"
Packit 562c7a
Packit 562c7a
def increment():
Packit 562c7a
    """
Packit 562c7a
    >>> increment()
Packit 562c7a
    """
Packit 562c7a
    a = 5
Packit 562c7a
    a += 1
Packit 562c7a
    assert typeof(a) == "long"
Packit 562c7a
Packit 562c7a
def loop():
Packit 562c7a
    """
Packit 562c7a
    >>> loop()
Packit 562c7a
    """
Packit 562c7a
    for a in range(10):
Packit 562c7a
        pass
Packit 562c7a
    assert typeof(a) == "long"
Packit 562c7a
Packit 562c7a
    b = 1.0
Packit 562c7a
    for b in range(5):
Packit 562c7a
        pass
Packit 562c7a
    assert typeof(b) == "double"
Packit 562c7a
Packit 562c7a
    for c from 0 <= c < 10 by .5:
Packit 562c7a
        pass
Packit 562c7a
    assert typeof(c) == "double"
Packit 562c7a
Packit 562c7a
    for d in range(0, 10L, 2):
Packit 562c7a
        pass
Packit 562c7a
    assert typeof(a) == "long"
Packit 562c7a
Packit 562c7a
def loop_over_charptr():
Packit 562c7a
    """
Packit 562c7a
    >>> print( loop_over_charptr() )
Packit 562c7a
    char
Packit 562c7a
    """
Packit 562c7a
    cdef char* char_ptr_string = 'abcdefg'
Packit 562c7a
    for c in char_ptr_string:
Packit 562c7a
        pass
Packit 562c7a
    return typeof(c)
Packit 562c7a
Packit 562c7a
def loop_over_bytes_literal():
Packit 562c7a
    """
Packit 562c7a
    >>> print( loop_over_bytes_literal() )
Packit 562c7a
    Python object
Packit 562c7a
    """
Packit 562c7a
    for c in b'abcdefg':
Packit 562c7a
        pass
Packit 562c7a
    return typeof(c)
Packit 562c7a
Packit 562c7a
def loop_over_bytes():
Packit 562c7a
    """
Packit 562c7a
    >>> print( loop_over_bytes() )
Packit 562c7a
    Python object
Packit 562c7a
    """
Packit 562c7a
    cdef bytes bytes_string = b'abcdefg'
Packit 562c7a
    # bytes in Py2, int in Py3
Packit 562c7a
    for c in bytes_string:
Packit 562c7a
        pass
Packit 562c7a
    return typeof(c)
Packit 562c7a
Packit 562c7a
def loop_over_str():
Packit 562c7a
    """
Packit 562c7a
    >>> print( loop_over_str() )
Packit 562c7a
    str object
Packit 562c7a
    """
Packit 562c7a
    cdef str string = 'abcdefg'
Packit 562c7a
    # str (bytes) in Py2, str (unicode) in Py3
Packit 562c7a
    for c in string:
Packit 562c7a
        pass
Packit 562c7a
    return typeof(c)
Packit 562c7a
Packit 562c7a
def loop_over_unicode():
Packit 562c7a
    """
Packit 562c7a
    >>> print( loop_over_unicode() )
Packit 562c7a
    Py_UCS4
Packit 562c7a
    """
Packit 562c7a
    cdef unicode ustring = u'abcdefg'
Packit 562c7a
    # Py_UCS4 can represent any Unicode character
Packit 562c7a
    for uchar in ustring:
Packit 562c7a
        pass
Packit 562c7a
    return typeof(uchar)
Packit 562c7a
Packit 562c7a
def loop_over_unicode_literal():
Packit 562c7a
    """
Packit 562c7a
    >>> print( loop_over_unicode_literal() )
Packit 562c7a
    Py_UCS4
Packit 562c7a
    """
Packit 562c7a
    # Py_UCS4 can represent any Unicode character
Packit 562c7a
    for uchar in u'abcdefg':
Packit 562c7a
        pass
Packit 562c7a
    return typeof(uchar)
Packit 562c7a
Packit 562c7a
def loop_over_int_array():
Packit 562c7a
    """
Packit 562c7a
    >>> print( loop_over_int_array() )
Packit 562c7a
    int
Packit 562c7a
    """
Packit 562c7a
    cdef int[10] int_array
Packit 562c7a
    for i in int_array:
Packit 562c7a
        pass
Packit 562c7a
    return typeof(i)
Packit 562c7a
Packit 562c7a
cdef struct MyStruct:
Packit 562c7a
    int a
Packit 562c7a
Packit 562c7a
def loop_over_struct_ptr():
Packit 562c7a
    """
Packit 562c7a
    >>> print( loop_over_struct_ptr() )
Packit 562c7a
    MyStruct
Packit 562c7a
    """
Packit 562c7a
    cdef MyStruct[10] a_list
Packit 562c7a
    cdef MyStruct *a_ptr = a_list
Packit 562c7a
    for i in a_list[:10]:
Packit 562c7a
        pass
Packit 562c7a
    return typeof(i)
Packit 562c7a
Packit 562c7a
cdef unicode retu():
Packit 562c7a
    return u"12345"
Packit 562c7a
Packit 562c7a
cdef bytes retb():
Packit 562c7a
    return b"12345"
Packit 562c7a
Packit 562c7a
def conditional(x):
Packit 562c7a
    """
Packit 562c7a
    >>> conditional(True)
Packit 562c7a
    (True, 'Python object')
Packit 562c7a
    >>> conditional(False)
Packit 562c7a
    (False, 'Python object')
Packit 562c7a
    """
Packit 562c7a
    if x:
Packit 562c7a
        a = retu()
Packit 562c7a
    else:
Packit 562c7a
        a = retb()
Packit 562c7a
    return type(a) is unicode, typeof(a)
Packit 562c7a
Packit 562c7a
##################################################
Packit 562c7a
# type inference tests that work in 'safe' mode
Packit 562c7a
Packit 562c7a
@infer_types(None)
Packit 562c7a
def double_inference():
Packit 562c7a
    """
Packit 562c7a
    >>> values, types = double_inference()
Packit 562c7a
    >>> values == (1.0, 1.0*2, 1.0*2.0+2.0*2.0, 1.0*2.0)
Packit 562c7a
    True
Packit 562c7a
    >>> types
Packit 562c7a
    ('double', 'double', 'double', 'Python object')
Packit 562c7a
    """
Packit 562c7a
    d_a = 1.0
Packit 562c7a
    d_b = d_a * float(2)
Packit 562c7a
    d_c = d_a * float(some_float_value()) + d_b * float(some_float_value())
Packit 562c7a
    o_d = d_a * some_float_value()
Packit 562c7a
    return (d_a,d_b,d_c,o_d), (typeof(d_a), typeof(d_b), typeof(d_c), typeof(o_d))
Packit 562c7a
Packit 562c7a
cdef object some_float_value():
Packit 562c7a
    return 2.0
Packit 562c7a
Packit 562c7a
Packit 562c7a
@infer_types(None)
Packit 562c7a
@cython.test_fail_if_path_exists('//DefNode//NameNode[@type.is_pyobject = True]')
Packit 562c7a
@cython.test_assert_path_exists('//DefNode//NameNode[@type.is_pyobject]',
Packit 562c7a
                                '//DefNode//NameNode[@type.is_pyobject = False]')
Packit 562c7a
def double_loop():
Packit 562c7a
    """
Packit 562c7a
    >>> double_loop() == 1.0 * 10
Packit 562c7a
    True
Packit 562c7a
    """
Packit 562c7a
    cdef int i
Packit 562c7a
    d = 1.0
Packit 562c7a
    for i in range(9):
Packit 562c7a
        d += 1.0
Packit 562c7a
    return d
Packit 562c7a
Packit 562c7a
@infer_types(None)
Packit 562c7a
def safe_only():
Packit 562c7a
    """
Packit 562c7a
    >>> safe_only()
Packit 562c7a
    """
Packit 562c7a
    a = 1.0
Packit 562c7a
    assert typeof(a) == "double", typeof(c)
Packit 562c7a
    b = 1;
Packit 562c7a
    assert typeof(b) == "long", typeof(b)
Packit 562c7a
    c = MyType()
Packit 562c7a
    assert typeof(c) == "MyType", typeof(c)
Packit 562c7a
    for i in range(10): pass
Packit 562c7a
    assert typeof(i) == "long", typeof(i)
Packit 562c7a
    d = 1
Packit 562c7a
    res = ~d
Packit 562c7a
    assert typeof(d) == "long", typeof(d)
Packit 562c7a
Packit 562c7a
    # we special-case inference to type str, see
Packit 562c7a
    # trac #553
Packit 562c7a
    s = "abc"
Packit 562c7a
    assert typeof(s) == "Python object", typeof(s)
Packit 562c7a
    cdef str t = "def"
Packit 562c7a
    assert typeof(t) == "str object", typeof(t)
Packit 562c7a
Packit 562c7a
    # potentially overflowing arithmetic
Packit 562c7a
    e = 1
Packit 562c7a
    e += 1
Packit 562c7a
    assert typeof(e) == "Python object", typeof(e)
Packit 562c7a
    f = 1
Packit 562c7a
    res = f * 10
Packit 562c7a
    assert typeof(f) == "Python object", typeof(f)
Packit 562c7a
    g = 1
Packit 562c7a
    res = 10*(~g)
Packit 562c7a
    assert typeof(g) == "Python object", typeof(g)
Packit 562c7a
    for j in range(10):
Packit 562c7a
        res = -j
Packit 562c7a
    assert typeof(j) == "Python object", typeof(j)
Packit 562c7a
    h = 1
Packit 562c7a
    res = abs(h)
Packit 562c7a
    assert typeof(h) == "Python object", typeof(h)
Packit 562c7a
    cdef int c_int = 1
Packit 562c7a
    assert typeof(abs(c_int)) == "int", typeof(abs(c_int))
Packit 562c7a
Packit 562c7a
@infer_types(None)
Packit 562c7a
def safe_c_functions():
Packit 562c7a
    """
Packit 562c7a
    >>> safe_c_functions()
Packit 562c7a
    """
Packit 562c7a
    f = cfunc
Packit 562c7a
    assert typeof(f) == 'int (*)(int)', typeof(f)
Packit 562c7a
    assert 2 == f(1)
Packit 562c7a
Packit 562c7a
@infer_types(None)
Packit 562c7a
def ptr_types():
Packit 562c7a
    """
Packit 562c7a
    >>> ptr_types()
Packit 562c7a
    """
Packit 562c7a
    cdef int a
Packit 562c7a
    a_ptr = &a
Packit 562c7a
    assert typeof(a_ptr) == "int *", typeof(a_ptr)
Packit 562c7a
    a_ptr_ptr = &a_ptr
Packit 562c7a
    assert typeof(a_ptr_ptr) == "int **", typeof(a_ptr_ptr)
Packit 562c7a
    cdef int[1] b
Packit 562c7a
    b_ref = b
Packit 562c7a
    assert typeof(b_ref) == "int *", typeof(b_ref)
Packit 562c7a
    ptr = &a
Packit 562c7a
    ptr = b
Packit 562c7a
    assert typeof(ptr) == "int *", typeof(ptr)
Packit 562c7a
Packit 562c7a
def const_types(const double x, double y, double& z):
Packit 562c7a
    """
Packit 562c7a
    >>> const_types(1, 1, 1)
Packit 562c7a
    """
Packit 562c7a
    a = x
Packit 562c7a
    a = y
Packit 562c7a
    a = z
Packit 562c7a
    assert typeof(a) == "double", typeof(a)
Packit 562c7a
Packit 562c7a
@infer_types(None)
Packit 562c7a
def args_tuple_keywords(*args, **kwargs):
Packit 562c7a
    """
Packit 562c7a
    >>> args_tuple_keywords(1,2,3, a=1, b=2)
Packit 562c7a
    """
Packit 562c7a
    assert typeof(args) == "tuple object", typeof(args)
Packit 562c7a
    assert typeof(kwargs) == "dict object", typeof(kwargs)
Packit 562c7a
Packit 562c7a
@infer_types(None)
Packit 562c7a
def args_tuple_keywords_reassign_same(*args, **kwargs):
Packit 562c7a
    """
Packit 562c7a
    >>> args_tuple_keywords_reassign_same(1,2,3, a=1, b=2)
Packit 562c7a
    """
Packit 562c7a
    assert typeof(args) == "tuple object", typeof(args)
Packit 562c7a
    assert typeof(kwargs) == "dict object", typeof(kwargs)
Packit 562c7a
Packit 562c7a
    args = ()
Packit 562c7a
    kwargs = {}
Packit 562c7a
Packit 562c7a
@infer_types(None)
Packit 562c7a
def args_tuple_keywords_reassign_pyobjects(*args, **kwargs):
Packit 562c7a
    """
Packit 562c7a
    >>> args_tuple_keywords_reassign_pyobjects(1,2,3, a=1, b=2)
Packit 562c7a
    """
Packit 562c7a
    assert typeof(args) == "Python object", typeof(args)
Packit 562c7a
    assert typeof(kwargs) == "Python object", typeof(kwargs)
Packit 562c7a
Packit 562c7a
    args = []
Packit 562c7a
    kwargs = "test"
Packit 562c7a
Packit 562c7a
#                 / A -> AA -> AAA
Packit 562c7a
# Base0 -> Base -
Packit 562c7a
#                 \ B -> BB
Packit 562c7a
# C -> CC
Packit 562c7a
Packit 562c7a
cdef class Base0: pass
Packit 562c7a
cdef class Base(Base0): pass
Packit 562c7a
cdef class A(Base): pass
Packit 562c7a
cdef class AA(A): pass
Packit 562c7a
cdef class AAA(AA): pass
Packit 562c7a
cdef class B(Base): pass
Packit 562c7a
cdef class BB(B): pass
Packit 562c7a
cdef class C: pass
Packit 562c7a
cdef class CC(C): pass
Packit 562c7a
Packit 562c7a
@infer_types(None)
Packit 562c7a
def common_extension_type_base():
Packit 562c7a
    """
Packit 562c7a
    >>> common_extension_type_base()
Packit 562c7a
    """
Packit 562c7a
    x = A()
Packit 562c7a
    x = AA()
Packit 562c7a
    assert typeof(x) == "A", typeof(x)
Packit 562c7a
    y = A()
Packit 562c7a
    y = B()
Packit 562c7a
    assert typeof(y) == "Base", typeof(y)
Packit 562c7a
    z = AAA()
Packit 562c7a
    z = BB()
Packit 562c7a
    assert typeof(z) == "Base", typeof(z)
Packit 562c7a
    w = A()
Packit 562c7a
    w = CC()
Packit 562c7a
    assert typeof(w) == "Python object", typeof(w)
Packit 562c7a
Packit 562c7a
cdef class AcceptsKeywords:
Packit 562c7a
    def __init__(self, *args, **kwds):
Packit 562c7a
        pass
Packit 562c7a
Packit 562c7a
@infer_types(None)
Packit 562c7a
def constructor_call():
Packit 562c7a
    """
Packit 562c7a
    >>> constructor_call()
Packit 562c7a
    """
Packit 562c7a
    x = AcceptsKeywords(a=1, b=2)
Packit 562c7a
    assert typeof(x) == "AcceptsKeywords", typeof(x)
Packit 562c7a
Packit 562c7a
Packit 562c7a
@infer_types(None)
Packit 562c7a
def large_literals():
Packit 562c7a
    """
Packit 562c7a
    >>> large_literals()
Packit 562c7a
    """
Packit 562c7a
    # It's only safe to infer small integer literals.
Packit 562c7a
    a = 10
Packit 562c7a
    b = 100000000000000000000000000000000
Packit 562c7a
    assert typeof(a) == "long", typeof(a)
Packit 562c7a
    assert typeof(b) == "Python object", typeof(b)
Packit 562c7a
    c, d = 10, 100000000000000000000000000000000
Packit 562c7a
    assert typeof(c) == "long", typeof(c)
Packit 562c7a
    assert typeof(d) == "Python object", typeof(d)
Packit 562c7a
Packit 562c7a
Packit 562c7a
class EmptyContextManager(object):
Packit 562c7a
    def __enter__(self):
Packit 562c7a
        return None
Packit 562c7a
    def __exit__(self, *args):
Packit 562c7a
        return 0
Packit 562c7a
Packit 562c7a
def with_statement():
Packit 562c7a
    """
Packit 562c7a
    >>> with_statement()
Packit 562c7a
    Python object
Packit 562c7a
    Python object
Packit 562c7a
    """
Packit 562c7a
    x = 1.0
Packit 562c7a
    with EmptyContextManager() as x:
Packit 562c7a
        print(typeof(x))
Packit 562c7a
    print(typeof(x))
Packit 562c7a
    return x
Packit 562c7a
Packit 562c7a
@cython.final
Packit 562c7a
cdef class TypedContextManager(object):
Packit 562c7a
    cpdef double __enter__(self):
Packit 562c7a
        return 2.0
Packit 562c7a
    def __exit__(self, *args):
Packit 562c7a
        return 0
Packit 562c7a
Packit 562c7a
def with_statement_typed():
Packit 562c7a
    """
Packit 562c7a
    >>> with_statement_typed()
Packit 562c7a
    double
Packit 562c7a
    double
Packit 562c7a
    2.0
Packit 562c7a
    """
Packit 562c7a
    x = 1.0
Packit 562c7a
    with TypedContextManager() as x:
Packit 562c7a
        print(typeof(x))
Packit 562c7a
    print(typeof(x))
Packit 562c7a
    return x
Packit 562c7a
Packit 562c7a
def with_statement_untyped():
Packit 562c7a
    """
Packit 562c7a
    >>> with_statement_untyped()
Packit 562c7a
    Python object
Packit 562c7a
    Python object
Packit 562c7a
    2.0
Packit 562c7a
    """
Packit 562c7a
    x = 1.0
Packit 562c7a
    cdef object t = TypedContextManager()
Packit 562c7a
    with t as x:
Packit 562c7a
        print(typeof(x))
Packit 562c7a
    print(typeof(x))
Packit 562c7a
    return x
Packit 562c7a
Packit 562c7a
def self_lookup(a):
Packit 562c7a
    b = a
Packit 562c7a
    b = b.foo(keyword=None)
Packit 562c7a
    print typeof(b)
Packit 562c7a
Packit 562c7a
# Regression test for trac #638.
Packit 562c7a
Packit 562c7a
def bar(foo):
Packit 562c7a
    qux = foo
Packit 562c7a
    quux = foo[qux.baz]
Packit 562c7a
Packit 562c7a
Packit 562c7a
cdef enum MyEnum:
Packit 562c7a
    enum_x = 1
Packit 562c7a
    enum_y = 2
Packit 562c7a
Packit 562c7a
ctypedef long my_long
Packit 562c7a
def test_int_typedef_inference():
Packit 562c7a
    """
Packit 562c7a
    >>> test_int_typedef_inference()
Packit 562c7a
    """
Packit 562c7a
    cdef long x = 1
Packit 562c7a
    cdef my_long y = 2
Packit 562c7a
    cdef long long z = 3
Packit 562c7a
    assert typeof(x + y) == typeof(y + x) == 'my_long', typeof(x + y)
Packit 562c7a
    assert typeof(y + z) == typeof(z + y) == 'long long', typeof(y + z)
Packit 562c7a
Packit 562c7a
from libc.stdint cimport int32_t, int64_t
Packit 562c7a
def int64_long_sum():
Packit 562c7a
    cdef long x = 1
Packit 562c7a
    cdef int32_t x32 = 2
Packit 562c7a
    cdef int64_t x64 = 3
Packit 562c7a
    cdef unsigned long ux = 4
Packit 562c7a
    assert typeof(x + x32) == typeof(x32 + x) == 'long', typeof(x + x32)
Packit 562c7a
    assert typeof(x + x64) == typeof(x64 + x) == 'int64_t', typeof(x + x64)
Packit 562c7a
    # The correct answer here is either unsigned long or int64_t, depending on
Packit 562c7a
    # whether sizeof(long) == 64 or not.  Incorrect signedness is probably
Packit 562c7a
    # preferable to incorrect width.
Packit 562c7a
    assert typeof(ux + x64) == typeof(x64 + ux) == 'int64_t', typeof(ux + x64)
Packit 562c7a
Packit 562c7a
cdef class InferInProperties:
Packit 562c7a
    """
Packit 562c7a
    >>> InferInProperties().x
Packit 562c7a
    ('double', 'unicode object', 'MyEnum', 'MyEnum')
Packit 562c7a
    """
Packit 562c7a
    cdef MyEnum attr
Packit 562c7a
    def __cinit__(self):
Packit 562c7a
        self.attr = enum_x
Packit 562c7a
Packit 562c7a
    property x:
Packit 562c7a
        def __get__(self):
Packit 562c7a
            a = 1.0
Packit 562c7a
            b = u'abc'
Packit 562c7a
            c = self.attr
Packit 562c7a
            d = enum_y
Packit 562c7a
            c = d
Packit 562c7a
            return typeof(a), typeof(b), typeof(c), typeof(d)
Packit 562c7a
Packit 562c7a
cdef class WithMethods:
Packit 562c7a
    cdef int offset
Packit 562c7a
    def __init__(self, offset):
Packit 562c7a
        self.offset = offset
Packit 562c7a
    cpdef int one_arg(self, int x):
Packit 562c7a
        return x + self.offset
Packit 562c7a
    cpdef int default_arg(self, int x, int y=0):
Packit 562c7a
        return x + y + self.offset
Packit 562c7a
Packit 562c7a
def test_bound_methods():
Packit 562c7a
  """
Packit 562c7a
  >>> test_bound_methods()
Packit 562c7a
  """
Packit 562c7a
  o = WithMethods(10)
Packit 562c7a
  assert typeof(o) == 'WithMethods', typeof(o)
Packit 562c7a
Packit 562c7a
  one_arg = o.one_arg
Packit 562c7a
  assert one_arg(2) == 12, one_arg(2)
Packit 562c7a
Packit 562c7a
  default_arg = o.default_arg
Packit 562c7a
  assert default_arg(2) == 12, default_arg(2)
Packit 562c7a
  assert default_arg(2, 3) == 15, default_arg(2, 2)