1# mode: run
2# ticket: t698
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.overflowcheck(True)
64@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
65                                "//ReturnStatNode//NameNode[@entry.cname = 'abs']")
66cdef int c_int_abs(int a) nogil except *:
67    return abs(a)
68
69def test_c_int_abs(int a):
70    """
71    >>> test_c_int_abs(-5) == 5
72    True
73    >>> test_c_int_abs(-5.1) == 5
74    True
75    >>> test_c_int_abs(-max_int-1)     #doctest: +ELLIPSIS
76    Traceback (most recent call last):
77        ...
78    OverflowError: ...
79    >>> test_c_int_abs(max_int) == abs(max_int)  or (max_int, test_c_int_abs(max_int), abs(max_int))
80    True
81    """
82    return c_int_abs(a)
83
84@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']")
85@cython.test_fail_if_path_exists("//ReturnStatNode//NameNode[@entry.cname = 'abs']",
86                                 "//ReturnStatNode//NameNode[@entry.cname = 'labs']")
87def uint_abs(unsigned int a):
88    """
89    >>> uint_abs(max_int) == abs(max_int)         or (max_int, uint_abs(max_int), abs(max_int))
90    True
91    """
92    return abs(a)
93
94@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']")
95@cython.test_fail_if_path_exists("//ReturnStatNode//NameNode[@entry.cname = 'abs']",
96                                 "//ReturnStatNode//NameNode[@entry.cname = 'labs']")
97cdef unsigned int c_uint_abs(unsigned int a) nogil:
98    return abs(a)
99
100def test_c_uint_abs(unsigned int a):
101    """
102    >>> test_c_uint_abs(max_int) == abs(max_int)  or (max_int, test_c_uint_abs(max_int), abs(max_int))
103    True
104    """
105    return c_uint_abs(a)
106
107@cython.overflowcheck(True)
108@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
109                                "//ReturnStatNode//NameNode[@entry.cname = 'labs']")
110def long_abs(long a):
111    """
112    >>> long_abs(-5) == 5
113    True
114    >>> long_abs(-5.1) == 5
115    True
116    >>> long_abs(-max_long-1)     #doctest: +ELLIPSIS
117    Traceback (most recent call last):
118        ...
119    OverflowError: ...
120    >>> long_abs(max_long) == abs(max_long)         or (max_long, long_abs(max_long), abs(max_long))
121    True
122    """
123    return abs(a)
124
125@cython.overflowcheck(True)
126@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
127                                "//ReturnStatNode//NameNode[@entry.cname = 'labs']")
128cdef long c_long_abs(long a) nogil except *:
129    return abs(a)
130
131def test_c_long_abs(long a):
132    """
133    >>> test_c_long_abs(-5) == 5
134    True
135    >>> test_c_long_abs(-5.1) == 5
136    True
137    >>> test_c_long_abs(-max_long-1)     #doctest: +ELLIPSIS
138    Traceback (most recent call last):
139        ...
140    OverflowError: ...
141    >>> test_c_long_abs(max_long) == abs(max_long)  or (max_long, test_c_long_abs(max_long), abs(max_long))
142    True
143    """
144    return c_long_abs(a)
145
146@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']")
147@cython.test_fail_if_path_exists("//ReturnStatNode//NameNode[@entry.cname = 'abs']",
148                                 "//ReturnStatNode//NameNode[@entry.cname = 'labs']")
149def ulong_abs(unsigned long a):
150    """
151    >>> ulong_abs(max_long) == abs(max_long)         or (max_int, ulong_abs(max_long), abs(max_long))
152    True
153    >>> ulong_abs(max_long + 5) == abs(max_long + 5)         or (max_long + 5, ulong_abs(max_long + 5), abs(max_long + 5))
154    True
155    """
156    return abs(a)
157
158@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']")
159@cython.test_fail_if_path_exists("//ReturnStatNode//NameNode[@entry.cname = 'abs']",
160                                 "//ReturnStatNode//NameNode[@entry.cname = 'labs']")
161cdef unsigned long c_ulong_abs(unsigned long a) nogil:
162    return abs(a)
163
164def test_c_ulong_abs(unsigned long a):
165    """
166    >>> test_c_ulong_abs(max_long) == abs(max_long)  or (max_int, test_c_ulong_abs(max_long), abs(max_long))
167    True
168    >>> test_c_ulong_abs(max_long + 5) == abs(max_long + 5)  or (max_long + 5, test_c_ulong_abs(max_long + 5), abs(max_long + 5))
169    True
170    """
171    return c_ulong_abs(a)
172
173@cython.overflowcheck(True)
174@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
175                                "//ReturnStatNode//NameNode[@entry.cname = '__Pyx_abs_longlong']")
176def long_long_abs(long long a):
177    """
178    >>> long_long_abs(-(2**33)) == 2**33
179    True
180    >>> long_long_abs(-max_long_long-1)     #doctest: +ELLIPSIS
181    Traceback (most recent call last):
182        ...
183    OverflowError: ...
184    >>> long_long_abs(max_long_long) == abs(max_long_long)        or (max_long_long, long_long_abs(max_long_long), abs(max_long_long))
185    True
186    """
187    return abs(a)
188
189@cython.overflowcheck(True)
190@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
191                                "//ReturnStatNode//NameNode[@entry.cname = '__Pyx_abs_longlong']")
192cdef long long c_long_long_abs(long long a) nogil except *:
193    return abs(a)
194
195def test_c_long_long_abs(long long a):
196    """
197    >>> test_c_long_long_abs(-(2**33)) == 2**33
198    True
199    >>> test_c_long_long_abs(-max_long_long-1)     #doctest: +ELLIPSIS
200    Traceback (most recent call last):
201        ...
202    OverflowError: ...
203    >>> test_c_long_long_abs(max_long_long) == abs(max_long_long) or (max_long_long, test_c_long_long_abs(max_long_long), abs(max_long_long))
204    True
205    """
206    return c_long_long_abs(a)
207
208@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
209                                "//ReturnStatNode//NameNode[@entry.cname = 'fabs']")
210def double_abs(double a):
211    """
212    >>> double_abs(-5)
213    5.0
214    >>> double_abs(-5.5)
215    5.5
216    """
217    return abs(a)
218
219@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
220                                "//ReturnStatNode//NameNode[@entry.cname = 'fabs']")
221cdef double c_double_abs(double a) nogil:
222    return abs(a)
223
224def test_c_double_abs(double a):
225    """
226    >>> test_c_double_abs(-5)
227    5.0
228    >>> test_c_double_abs(-5.5)
229    5.5
230    """
231    return c_double_abs(a)
232
233@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
234                                "//ReturnStatNode//NameNode[@entry.cname = 'fabsf']")
235def float_abs(float a):
236    """
237    >>> float_abs(-5)
238    5.0
239    >>> float_abs(-5.5)
240    5.5
241    """
242    return abs(a)
243
244@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
245                                "//ReturnStatNode//NameNode[@entry.cname = 'fabsf']")
246cdef float c_float_abs(float a) nogil:
247    return abs(a)
248
249def test_c_float_abs(float a):
250    """
251    >>> test_c_float_abs(-5)
252    5.0
253    >>> test_c_float_abs(-5.5)
254    5.5
255    """
256    return c_float_abs(a)
257
258@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
259                                "//ReturnStatNode//NameNode[@entry.cname = '__Pyx_c_abs_double']")
260def complex_abs(complex a):
261    """
262    >>> complex_abs(-5j)
263    5.0
264    >>> complex_abs(-5.5j)
265    5.5
266    """
267    return abs(a)
268
269@cython.test_assert_path_exists("//ReturnStatNode//NameNode[@entry.name = 'abs']",
270                                "//ReturnStatNode//NameNode[@entry.cname = '__Pyx_c_abs_double']")
271cdef double c_complex_abs(complex a) nogil:
272    return abs(a)
273
274def test_c_complex_abs(complex a):
275    """
276    >>> test_c_complex_abs(-5j)
277    5.0
278    >>> test_c_complex_abs(-5.5j)
279    5.5
280    """
281    return c_complex_abs(a)
282