1# mode: run
2# ticket: 698
3# distutils: extra_compile_args=-fwrapv
4
5cdef extern from *:
6    int INT_MAX
7    long LONG_MAX
8
9max_int = INT_MAX
10max_long = LONG_MAX
11max_long_long = (<object>2) ** (sizeof(long long) * 8 - 1) - 1
12
13
14cimport cython
15
16def abs_as_name():
17    """
18    >>> _abs = abs_as_name()
19    >>> _abs(-5)
20    5
21    """
22    x = abs
23    return x
24
25def py_abs(a):
26    """
27    >>> py_abs(-5)
28    5
29    >>> py_abs(-5.5)
30    5.5
31    """
32    return abs(a)
33
34@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
35                                "//ReturnStatNode//NameNode[@entry.cname = 'abs']")
36def sub_abs(int a):
37    """
38    >>> sub_abs(5)
39    (-5, 95)
40    >>> sub_abs(105)
41    (-105, -5)
42    """
43    return -abs(a), 100 - abs(a)
44
45@cython.overflowcheck(True)
46@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
47                                "//ReturnStatNode//NameNode[@entry.cname = 'abs']")
48def int_abs(int a):
49    """
50    >>> int_abs(-5) == 5
51    True
52    >>> int_abs(-5.1) == 5
53    True
54    >>> int_abs(-max_int-1)     #doctest: +ELLIPSIS
55    Traceback (most recent call last):
56        ...
57    OverflowError: ...
58    >>> int_abs(max_int) == abs(max_int)         or (max_int, int_abs(max_int), abs(max_int))
59    True
60    """
61    return abs(a)
62
63@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']")
64@cython.test_fail_if_path_exists("//ReturnStatNode//NameNode[@entry.cname = 'abs']",
65                                 "//ReturnStatNode//NameNode[@entry.cname = 'labs']")
66def uint_abs(unsigned int a):
67    """
68    >>> uint_abs(max_int) == abs(max_int)         or (max_int, uint_abs(max_int), abs(max_int))
69    True
70    """
71    return abs(a)
72
73@cython.overflowcheck(True)
74@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
75                                "//ReturnStatNode//NameNode[@entry.cname = 'labs']")
76def long_abs(long a):
77    """
78    >>> long_abs(-5) == 5
79    True
80    >>> long_abs(-5.1) == 5
81    True
82    >>> long_abs(-max_long-1)     #doctest: +ELLIPSIS
83    Traceback (most recent call last):
84        ...
85    OverflowError: ...
86    >>> long_abs(max_long) == abs(max_long)         or (max_long, long_abs(max_long), abs(max_long))
87    True
88    """
89    return abs(a)
90
91@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']")
92@cython.test_fail_if_path_exists("//ReturnStatNode//NameNode[@entry.cname = 'abs']",
93                                 "//ReturnStatNode//NameNode[@entry.cname = 'labs']")
94def ulong_abs(unsigned long a):
95    """
96    >>> ulong_abs(max_long) == abs(max_long)         or (max_int, ulong_abs(max_long), abs(max_long))
97    True
98    >>> ulong_abs(max_long + 5) == abs(max_long + 5)         or (max_long + 5, ulong_abs(max_long + 5), abs(max_long + 5))
99    True
100    """
101    return abs(a)
102
103@cython.overflowcheck(True)
104@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
105                                "//ReturnStatNode//NameNode[@entry.cname = '__Pyx_abs_longlong']")
106def long_long_abs(long long a):
107    """
108    >>> long_long_abs(-(2**33)) == 2**33
109    True
110    >>> long_long_abs(-max_long_long-1)     #doctest: +ELLIPSIS
111    Traceback (most recent call last):
112        ...
113    OverflowError: ...
114    >>> long_long_abs(max_long_long) == abs(max_long_long)        or (max_long_long, long_long_abs(max_long_long), abs(max_long_long))
115    True
116    """
117    return abs(a)
118
119@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
120                                "//ReturnStatNode//NameNode[@entry.cname = 'fabs']")
121def double_abs(double a):
122    """
123    >>> double_abs(-5)
124    5.0
125    >>> double_abs(-5.5)
126    5.5
127    """
128    return abs(a)
129
130@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
131                                "//ReturnStatNode//NameNode[@entry.cname = 'fabsf']")
132def float_abs(float a):
133    """
134    >>> float_abs(-5)
135    5.0
136    >>> float_abs(-5.5)
137    5.5
138    """
139    return abs(a)
140
141@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
142                                "//ReturnStatNode//NameNode[@entry.cname = '__Pyx_c_abs_double']")
143def complex_abs(complex a):
144    """
145    >>> complex_abs(-5j)
146    5.0
147    >>> complex_abs(-5.5j)
148    5.5
149    """
150    return abs(a)
151