2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / gcc / testsuite / gcc.c-torture / execute / builtin-abs-1.c
blob8a34353763d4535a1cf9b58b11d5123b51f04faa
1 /* Test for builtin abs, labs, llabs, imaxabs. */
2 /* Origin: Joseph Myers <jsm28@cam.ac.uk> */
4 /* These next definitions are kludges. When GCC has a <stdint.h> it
5 should be used.
6 */
7 #include <limits.h>
8 #if INT_MAX == __LONG_LONG_MAX__
9 typedef int intmax_t;
10 #define INTMAX_MAX INT_MAX
11 #elif LONG_MAX == __LONG_LONG_MAX__
12 typedef long intmax_t;
13 #define INTMAX_MAX LONG_MAX
14 #else
15 typedef long long intmax_t;
16 #define INTMAX_MAX __LONG_LONG_MAX__
17 #endif
19 extern int abs (int);
20 extern long labs (long);
21 extern long long llabs (long long);
22 extern intmax_t imaxabs (intmax_t);
23 extern void abort (void);
24 extern void exit (int);
26 extern void link_failure (void);
28 int
29 main (void)
31 /* For each type, test both runtime and compile time (constant folding)
32 optimization. */
33 volatile int i0 = 0, i1 = 1, im1 = -1, imin = -INT_MAX, imax = INT_MAX;
34 volatile long l0 = 0L, l1 = 1L, lm1 = -1L, lmin = -LONG_MAX, lmax = LONG_MAX;
35 volatile long long ll0 = 0LL, ll1 = 1LL, llm1 = -1LL;
36 volatile long long llmin = -__LONG_LONG_MAX__, llmax = __LONG_LONG_MAX__;
37 volatile intmax_t imax0 = 0, imax1 = 1, imaxm1 = -1;
38 volatile intmax_t imaxmin = -INTMAX_MAX, imaxmax = INTMAX_MAX;
39 if (abs (i0) != 0)
40 abort ();
41 if (abs (0) != 0)
42 link_failure ();
43 if (abs (i1) != 1)
44 abort ();
45 if (abs (1) != 1)
46 link_failure ();
47 if (abs (im1) != 1)
48 abort ();
49 if (abs (-1) != 1)
50 link_failure ();
51 if (abs (imin) != INT_MAX)
52 abort ();
53 if (abs (-INT_MAX) != INT_MAX)
54 link_failure ();
55 if (abs (imax) != INT_MAX)
56 abort ();
57 if (abs (INT_MAX) != INT_MAX)
58 link_failure ();
59 if (labs (l0) != 0L)
60 abort ();
61 if (labs (0L) != 0L)
62 link_failure ();
63 if (labs (l1) != 1L)
64 abort ();
65 if (labs (1L) != 1L)
66 link_failure ();
67 if (labs (lm1) != 1L)
68 abort ();
69 if (labs (-1L) != 1L)
70 link_failure ();
71 if (labs (lmin) != LONG_MAX)
72 abort ();
73 if (labs (-LONG_MAX) != LONG_MAX)
74 link_failure ();
75 if (labs (lmax) != LONG_MAX)
76 abort ();
77 if (labs (LONG_MAX) != LONG_MAX)
78 link_failure ();
79 if (llabs (ll0) != 0LL)
80 abort ();
81 if (llabs (0LL) != 0LL)
82 link_failure ();
83 if (llabs (ll1) != 1LL)
84 abort ();
85 if (llabs (1LL) != 1LL)
86 link_failure ();
87 if (llabs (llm1) != 1LL)
88 abort ();
89 if (llabs (-1LL) != 1LL)
90 link_failure ();
91 if (llabs (llmin) != __LONG_LONG_MAX__)
92 abort ();
93 if (llabs (-__LONG_LONG_MAX__) != __LONG_LONG_MAX__)
94 link_failure ();
95 if (llabs (llmax) != __LONG_LONG_MAX__)
96 abort ();
97 if (llabs (__LONG_LONG_MAX__) != __LONG_LONG_MAX__)
98 link_failure ();
99 if (imaxabs (imax0) != 0)
100 abort ();
101 if (imaxabs (0) != 0)
102 link_failure ();
103 if (imaxabs (imax1) != 1)
104 abort ();
105 if (imaxabs (1) != 1)
106 link_failure ();
107 if (imaxabs (imaxm1) != 1)
108 abort ();
109 if (imaxabs (-1) != 1)
110 link_failure ();
111 if (imaxabs (imaxmin) != INTMAX_MAX)
112 abort ();
113 if (imaxabs (-INTMAX_MAX) != INTMAX_MAX)
114 link_failure ();
115 if (imaxabs (imaxmax) != INTMAX_MAX)
116 abort ();
117 if (imaxabs (INTMAX_MAX) != INTMAX_MAX)
118 link_failure ();
119 exit (0);
122 /* All the above cases should have been optimized to something else,
123 even if not optimizing (unless -fno-builtin was specified). So any
124 remaining calls to the original functions should abort. */
126 static int
127 abs (int x)
129 abort ();
132 static long
133 labs (long x)
135 abort ();
138 static long long
139 llabs (long long x)
141 abort ();
144 static intmax_t
145 imaxabs (intmax_t x)
147 abort ();
150 /* When optimizing, all the constant cases should have been
151 constant folded, so no calls to link_failure should remain. In any case,
152 link_failure should not be called. */
154 #ifndef __OPTIMIZE__
155 void
156 link_failure (void)
158 abort ();
160 #endif