blob: 60cb2816a7ab9d3fed07c567362e62dea5ef24c0 [file] [log] [blame]
Zack Weinbergb0699da2000-03-07 20:58:47 +00001/* Parse C expressions for cpplib.
Neil Booth5d8ebbd2002-01-03 21:43:09 +00002 Copyright (C) 1987, 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2001,
Joseph Myersdadab4f2010-01-01 18:08:17 +00003 2002, 2004, 2008, 2009, 2010 Free Software Foundation.
Richard Kennere38992e2000-04-18 20:42:00 +00004 Contributed by Per Bothner, 1994.
Per Bothner7f2935c1995-03-16 13:59:07 -08005
6This program is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
Jakub Jelinek748086b2009-04-09 17:00:19 +02008Free Software Foundation; either version 3, or (at your option) any
Per Bothner7f2935c1995-03-16 13:59:07 -08009later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
Jakub Jelinek748086b2009-04-09 17:00:19 +020017along with this program; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
Per Bothner7f2935c1995-03-16 13:59:07 -080019
Per Bothner7f2935c1995-03-16 13:59:07 -080020#include "config.h"
Kaveh R. Ghazib04cd5071998-03-30 12:05:54 +000021#include "system.h"
Kaveh R. Ghazi487a6e01998-05-19 08:42:48 +000022#include "cpplib.h"
Paolo Bonzini4f4e53dd2004-05-24 10:50:45 +000023#include "internal.h"
Per Bothner7f2935c1995-03-16 13:59:07 -080024
Neil Booth91318902002-05-26 18:42:21 +000025#define PART_PRECISION (sizeof (cpp_num_part) * CHAR_BIT)
26#define HALF_MASK (~(cpp_num_part) 0 >> (PART_PRECISION / 2))
27#define LOW_PART(num_part) (num_part & HALF_MASK)
28#define HIGH_PART(num_part) (num_part >> (PART_PRECISION / 2))
29
Zack Weinbergcf00a882000-07-08 02:33:00 +000030struct op
Zack Weinbergb0699da2000-03-07 20:58:47 +000031{
Neil Booth68e652752002-07-20 13:31:56 +000032 const cpp_token *token; /* The token forming op (for diagnostics). */
Neil Boothad28cff2002-07-18 22:08:35 +000033 cpp_num value; /* The value logically "right" of op. */
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +000034 source_location loc; /* The location of this value. */
Zack Weinbergcf00a882000-07-08 02:33:00 +000035 enum cpp_ttype op;
Per Bothner7f2935c1995-03-16 13:59:07 -080036};
Per Bothner7f2935c1995-03-16 13:59:07 -080037
Neil Booth91318902002-05-26 18:42:21 +000038/* Some simple utility routines on double integers. */
39#define num_zerop(num) ((num.low | num.high) == 0)
40#define num_eq(num1, num2) (num1.low == num2.low && num1.high == num2.high)
Zack Weinberg6cf87ca2003-06-17 06:17:44 +000041static bool num_positive (cpp_num, size_t);
42static bool num_greater_eq (cpp_num, cpp_num, size_t);
43static cpp_num num_trim (cpp_num, size_t);
44static cpp_num num_part_mul (cpp_num_part, cpp_num_part);
Neil Booth91318902002-05-26 18:42:21 +000045
Zack Weinberg6cf87ca2003-06-17 06:17:44 +000046static cpp_num num_unary_op (cpp_reader *, cpp_num, enum cpp_ttype);
47static cpp_num num_binary_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype);
48static cpp_num num_negate (cpp_num, size_t);
49static cpp_num num_bitwise_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype);
50static cpp_num num_inequality_op (cpp_reader *, cpp_num, cpp_num,
51 enum cpp_ttype);
52static cpp_num num_equality_op (cpp_reader *, cpp_num, cpp_num,
53 enum cpp_ttype);
54static cpp_num num_mul (cpp_reader *, cpp_num, cpp_num);
Manuel López-Ibáñezb506a5a2009-06-18 15:10:23 +000055static cpp_num num_div_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype,
56 source_location);
Zack Weinberg6cf87ca2003-06-17 06:17:44 +000057static cpp_num num_lshift (cpp_num, size_t, size_t);
58static cpp_num num_rshift (cpp_num, size_t, size_t);
Neil Booth91318902002-05-26 18:42:21 +000059
Zack Weinberg6cf87ca2003-06-17 06:17:44 +000060static cpp_num append_digit (cpp_num, int, int, size_t);
61static cpp_num parse_defined (cpp_reader *);
62static cpp_num eval_token (cpp_reader *, const cpp_token *);
63static struct op *reduce (cpp_reader *, struct op *, enum cpp_ttype);
64static unsigned int interpret_float_suffix (const uchar *, size_t);
65static unsigned int interpret_int_suffix (const uchar *, size_t);
66static void check_promotion (cpp_reader *, const struct op *);
Neil Booth91318902002-05-26 18:42:21 +000067
Neil Boothcd7ab832002-05-29 17:15:42 +000068/* Token type abuse to create unary plus and minus operators. */
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +000069#define CPP_UPLUS ((enum cpp_ttype) (CPP_LAST_CPP_OP + 1))
70#define CPP_UMINUS ((enum cpp_ttype) (CPP_LAST_CPP_OP + 2))
Zack Weinbergcf00a882000-07-08 02:33:00 +000071
Zack Weinberg15dad1d2000-05-18 15:55:46 +000072/* With -O2, gcc appears to produce nice code, moving the error
73 message load and subsequent jump completely out of the main path. */
Zack Weinberg15dad1d2000-05-18 15:55:46 +000074#define SYNTAX_ERROR(msgid) \
John David Anglin0527bc42003-11-01 22:56:54 +000075 do { cpp_error (pfile, CPP_DL_ERROR, msgid); goto syntax_error; } while(0)
Zack Weinberg15dad1d2000-05-18 15:55:46 +000076#define SYNTAX_ERROR2(msgid, arg) \
John David Anglin0527bc42003-11-01 22:56:54 +000077 do { cpp_error (pfile, CPP_DL_ERROR, msgid, arg); goto syntax_error; } \
78 while(0)
Zack Weinberg15dad1d2000-05-18 15:55:46 +000079
Neil Boothcd7ab832002-05-29 17:15:42 +000080/* Subroutine of cpp_classify_number. S points to a float suffix of
81 length LEN, possibly zero. Returns 0 for an invalid suffix, or a
82 flag vector describing the suffix. */
83static unsigned int
Zack Weinberg6cf87ca2003-06-17 06:17:44 +000084interpret_float_suffix (const uchar *s, size_t len)
Per Bothner7f2935c1995-03-16 13:59:07 -080085{
Janis Johnsoneec49112009-04-01 17:04:42 +000086 size_t flags;
Janis Johnson839a3b82009-04-01 17:31:26 +000087 size_t f, d, l, w, q, i;
Uros Bizjakc77cd3d2007-07-03 07:53:58 +020088
Janis Johnsoneec49112009-04-01 17:04:42 +000089 flags = 0;
Janis Johnson839a3b82009-04-01 17:31:26 +000090 f = d = l = w = q = i = 0;
Zack Weinbergcf00a882000-07-08 02:33:00 +000091
Janis Johnsoneec49112009-04-01 17:04:42 +000092 /* Process decimal float suffixes, which are two letters starting
93 with d or D. Order and case are significant. */
94 if (len == 2 && (*s == 'd' || *s == 'D'))
95 {
96 bool uppercase = (*s == 'D');
97 switch (s[1])
98 {
99 case 'f': return (!uppercase ? (CPP_N_DFLOAT | CPP_N_SMALL): 0); break;
100 case 'F': return (uppercase ? (CPP_N_DFLOAT | CPP_N_SMALL) : 0); break;
101 case 'd': return (!uppercase ? (CPP_N_DFLOAT | CPP_N_MEDIUM): 0); break;
102 case 'D': return (uppercase ? (CPP_N_DFLOAT | CPP_N_MEDIUM) : 0); break;
103 case 'l': return (!uppercase ? (CPP_N_DFLOAT | CPP_N_LARGE) : 0); break;
104 case 'L': return (uppercase ? (CPP_N_DFLOAT | CPP_N_LARGE) : 0); break;
105 default:
Janis Johnson839a3b82009-04-01 17:31:26 +0000106 /* Additional two-character suffixes beginning with D are not
107 for decimal float constants. */
108 break;
Janis Johnsoneec49112009-04-01 17:04:42 +0000109 }
110 }
111
112 /* Recognize a fixed-point suffix. */
113 switch (s[len-1])
114 {
115 case 'k': case 'K': flags = CPP_N_ACCUM; break;
116 case 'r': case 'R': flags = CPP_N_FRACT; break;
117 default: break;
118 }
119
120 /* Continue processing a fixed-point suffix. The suffix is case
121 insensitive except for ll or LL. Order is significant. */
122 if (flags)
123 {
124 if (len == 1)
125 return flags;
126 len--;
127
128 if (*s == 'u' || *s == 'U')
129 {
130 flags |= CPP_N_UNSIGNED;
131 if (len == 1)
132 return flags;
133 len--;
134 s++;
135 }
136
137 switch (*s)
138 {
139 case 'h': case 'H':
140 if (len == 1)
141 return flags |= CPP_N_SMALL;
142 break;
143 case 'l':
144 if (len == 1)
145 return flags |= CPP_N_MEDIUM;
146 if (len == 2 && s[1] == 'l')
147 return flags |= CPP_N_LARGE;
148 break;
149 case 'L':
150 if (len == 1)
151 return flags |= CPP_N_MEDIUM;
152 if (len == 2 && s[1] == 'L')
153 return flags |= CPP_N_LARGE;
154 break;
155 default:
156 break;
157 }
158 /* Anything left at this point is invalid. */
159 return 0;
160 }
161
162 /* In any remaining valid suffix, the case and order don't matter. */
Neil Boothcd7ab832002-05-29 17:15:42 +0000163 while (len--)
164 switch (s[len])
165 {
Janis Johnsoneec49112009-04-01 17:04:42 +0000166 case 'f': case 'F': f++; break;
Janis Johnson839a3b82009-04-01 17:31:26 +0000167 case 'd': case 'D': d++; break;
Janis Johnsoneec49112009-04-01 17:04:42 +0000168 case 'l': case 'L': l++; break;
169 case 'w': case 'W': w++; break;
170 case 'q': case 'Q': q++; break;
Neil Boothcd7ab832002-05-29 17:15:42 +0000171 case 'i': case 'I':
172 case 'j': case 'J': i++; break;
173 default:
174 return 0;
175 }
Zack Weinbergcf00a882000-07-08 02:33:00 +0000176
Janis Johnson839a3b82009-04-01 17:31:26 +0000177 if (f + d + l + w + q > 1 || i > 1)
Jon Grimmad6ed772005-12-06 23:13:15 +0000178 return 0;
179
Neil Boothcd7ab832002-05-29 17:15:42 +0000180 return ((i ? CPP_N_IMAGINARY : 0)
181 | (f ? CPP_N_SMALL :
Janis Johnson839a3b82009-04-01 17:31:26 +0000182 d ? CPP_N_MEDIUM :
Uros Bizjakc77cd3d2007-07-03 07:53:58 +0200183 l ? CPP_N_LARGE :
184 w ? CPP_N_MD_W :
Janis Johnson839a3b82009-04-01 17:31:26 +0000185 q ? CPP_N_MD_Q : CPP_N_DEFAULT));
Neil Boothcd7ab832002-05-29 17:15:42 +0000186}
187
188/* Subroutine of cpp_classify_number. S points to an integer suffix
189 of length LEN, possibly zero. Returns 0 for an invalid suffix, or a
190 flag vector describing the suffix. */
191static unsigned int
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000192interpret_int_suffix (const uchar *s, size_t len)
Neil Boothcd7ab832002-05-29 17:15:42 +0000193{
194 size_t u, l, i;
195
196 u = l = i = 0;
197
198 while (len--)
199 switch (s[len])
200 {
201 case 'u': case 'U': u++; break;
202 case 'i': case 'I':
203 case 'j': case 'J': i++; break;
204 case 'l': case 'L': l++;
205 /* If there are two Ls, they must be adjacent and the same case. */
206 if (l == 2 && s[len] != s[len + 1])
207 return 0;
208 break;
209 default:
210 return 0;
211 }
212
213 if (l > 2 || u > 1 || i > 1)
214 return 0;
215
216 return ((i ? CPP_N_IMAGINARY : 0)
217 | (u ? CPP_N_UNSIGNED : 0)
218 | ((l == 0) ? CPP_N_SMALL
219 : (l == 1) ? CPP_N_MEDIUM : CPP_N_LARGE));
220}
221
222/* Categorize numeric constants according to their field (integer,
223 floating point, or invalid), radix (decimal, octal, hexadecimal),
224 and type suffixes. */
225unsigned int
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000226cpp_classify_number (cpp_reader *pfile, const cpp_token *token)
Neil Boothcd7ab832002-05-29 17:15:42 +0000227{
228 const uchar *str = token->val.str.text;
229 const uchar *limit;
230 unsigned int max_digit, result, radix;
231 enum {NOT_FLOAT = 0, AFTER_POINT, AFTER_EXPON} float_flag;
Joseph Myersdadab4f2010-01-01 18:08:17 +0000232 bool seen_digit;
Neil Boothcd7ab832002-05-29 17:15:42 +0000233
234 /* If the lexer has done its job, length one can only be a single
235 digit. Fast-path this very common case. */
236 if (token->val.str.len == 1)
237 return CPP_N_INTEGER | CPP_N_SMALL | CPP_N_DECIMAL;
238
239 limit = str + token->val.str.len;
240 float_flag = NOT_FLOAT;
241 max_digit = 0;
242 radix = 10;
Joseph Myersdadab4f2010-01-01 18:08:17 +0000243 seen_digit = false;
Neil Boothcd7ab832002-05-29 17:15:42 +0000244
245 /* First, interpret the radix. */
246 if (*str == '0')
247 {
248 radix = 8;
249 str++;
250
251 /* Require at least one hex digit to classify it as hex. */
Michael Matz7f1fc382003-03-31 15:50:53 +0000252 if ((*str == 'x' || *str == 'X')
253 && (str[1] == '.' || ISXDIGIT (str[1])))
Neil Boothcd7ab832002-05-29 17:15:42 +0000254 {
255 radix = 16;
256 str++;
257 }
Joerg Wunschf7fd7752007-06-05 22:25:27 +0000258 else if ((*str == 'b' || *str == 'B') && (str[1] == '0' || str[1] == '1'))
259 {
260 radix = 2;
261 str++;
262 }
Neil Boothcd7ab832002-05-29 17:15:42 +0000263 }
264
265 /* Now scan for a well-formed integer or float. */
266 for (;;)
267 {
268 unsigned int c = *str++;
269
270 if (ISDIGIT (c) || (ISXDIGIT (c) && radix == 16))
271 {
Joseph Myersdadab4f2010-01-01 18:08:17 +0000272 seen_digit = true;
Neil Boothcd7ab832002-05-29 17:15:42 +0000273 c = hex_value (c);
274 if (c > max_digit)
275 max_digit = c;
276 }
277 else if (c == '.')
278 {
279 if (float_flag == NOT_FLOAT)
280 float_flag = AFTER_POINT;
281 else
282 SYNTAX_ERROR ("too many decimal points in number");
283 }
284 else if ((radix <= 10 && (c == 'e' || c == 'E'))
285 || (radix == 16 && (c == 'p' || c == 'P')))
286 {
287 float_flag = AFTER_EXPON;
288 break;
289 }
290 else
291 {
292 /* Start of suffix. */
293 str--;
294 break;
295 }
296 }
297
Chao-ying Fuac6b1c62007-08-30 23:05:17 +0000298 /* The suffix may be for decimal fixed-point constants without exponent. */
299 if (radix != 16 && float_flag == NOT_FLOAT)
300 {
301 result = interpret_float_suffix (str, limit - str);
302 if ((result & CPP_N_FRACT) || (result & CPP_N_ACCUM))
303 {
304 result |= CPP_N_FLOATING;
305 /* We need to restore the radix to 10, if the radix is 8. */
306 if (radix == 8)
307 radix = 10;
308
309 if (CPP_PEDANTIC (pfile))
310 cpp_error (pfile, CPP_DL_PEDWARN,
311 "fixed-point constants are a GCC extension");
312 goto syntax_ok;
313 }
314 else
315 result = 0;
316 }
317
Neil Boothcd7ab832002-05-29 17:15:42 +0000318 if (float_flag != NOT_FLOAT && radix == 8)
319 radix = 10;
320
321 if (max_digit >= radix)
Joerg Wunschf7fd7752007-06-05 22:25:27 +0000322 {
323 if (radix == 2)
324 SYNTAX_ERROR2 ("invalid digit \"%c\" in binary constant", '0' + max_digit);
325 else
326 SYNTAX_ERROR2 ("invalid digit \"%c\" in octal constant", '0' + max_digit);
327 }
Neil Boothcd7ab832002-05-29 17:15:42 +0000328
329 if (float_flag != NOT_FLOAT)
330 {
Joerg Wunschf7fd7752007-06-05 22:25:27 +0000331 if (radix == 2)
332 {
333 cpp_error (pfile, CPP_DL_ERROR,
334 "invalid prefix \"0b\" for floating constant");
335 return CPP_N_INVALID;
336 }
337
Joseph Myersdadab4f2010-01-01 18:08:17 +0000338 if (radix == 16 && !seen_digit)
339 SYNTAX_ERROR ("no digits in hexadecimal floating constant");
340
Neil Boothcd7ab832002-05-29 17:15:42 +0000341 if (radix == 16 && CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, c99))
John David Anglin0527bc42003-11-01 22:56:54 +0000342 cpp_error (pfile, CPP_DL_PEDWARN,
Neil Boothcd7ab832002-05-29 17:15:42 +0000343 "use of C99 hexadecimal floating constant");
344
345 if (float_flag == AFTER_EXPON)
346 {
347 if (*str == '+' || *str == '-')
348 str++;
349
350 /* Exponent is decimal, even if string is a hex float. */
351 if (!ISDIGIT (*str))
352 SYNTAX_ERROR ("exponent has no digits");
353
354 do
355 str++;
356 while (ISDIGIT (*str));
357 }
358 else if (radix == 16)
359 SYNTAX_ERROR ("hexadecimal floating constants require an exponent");
360
361 result = interpret_float_suffix (str, limit - str);
362 if (result == 0)
363 {
John David Anglin0527bc42003-11-01 22:56:54 +0000364 cpp_error (pfile, CPP_DL_ERROR,
Neil Boothcd7ab832002-05-29 17:15:42 +0000365 "invalid suffix \"%.*s\" on floating constant",
Andreas Jaeger91b12472002-06-01 16:11:45 +0200366 (int) (limit - str), str);
Neil Boothcd7ab832002-05-29 17:15:42 +0000367 return CPP_N_INVALID;
368 }
369
370 /* Traditional C didn't accept any floating suffixes. */
371 if (limit != str
372 && CPP_WTRADITIONAL (pfile)
373 && ! cpp_sys_macro_p (pfile))
John David Anglin0527bc42003-11-01 22:56:54 +0000374 cpp_error (pfile, CPP_DL_WARNING,
Neil Boothcd7ab832002-05-29 17:15:42 +0000375 "traditional C rejects the \"%.*s\" suffix",
Andreas Jaeger91b12472002-06-01 16:11:45 +0200376 (int) (limit - str), str);
Neil Boothcd7ab832002-05-29 17:15:42 +0000377
Janis Johnson839a3b82009-04-01 17:31:26 +0000378 /* A suffix for double is a GCC extension via decimal float support.
379 If the suffix also specifies an imaginary value we'll catch that
380 later. */
381 if ((result == CPP_N_MEDIUM) && CPP_PEDANTIC (pfile))
382 cpp_error (pfile, CPP_DL_PEDWARN,
383 "suffix for double constant is a GCC extension");
384
Jon Grimmad6ed772005-12-06 23:13:15 +0000385 /* Radix must be 10 for decimal floats. */
386 if ((result & CPP_N_DFLOAT) && radix != 10)
387 {
388 cpp_error (pfile, CPP_DL_ERROR,
389 "invalid suffix \"%.*s\" with hexadecimal floating constant",
390 (int) (limit - str), str);
391 return CPP_N_INVALID;
392 }
393
Chao-ying Fuac6b1c62007-08-30 23:05:17 +0000394 if ((result & (CPP_N_FRACT | CPP_N_ACCUM)) && CPP_PEDANTIC (pfile))
395 cpp_error (pfile, CPP_DL_PEDWARN,
396 "fixed-point constants are a GCC extension");
397
Janis Johnson5a6bb572007-05-14 23:45:40 +0000398 if ((result & CPP_N_DFLOAT) && CPP_PEDANTIC (pfile))
399 cpp_error (pfile, CPP_DL_PEDWARN,
400 "decimal float constants are a GCC extension");
401
Neil Boothcd7ab832002-05-29 17:15:42 +0000402 result |= CPP_N_FLOATING;
403 }
404 else
405 {
406 result = interpret_int_suffix (str, limit - str);
407 if (result == 0)
408 {
John David Anglin0527bc42003-11-01 22:56:54 +0000409 cpp_error (pfile, CPP_DL_ERROR,
Neil Boothcd7ab832002-05-29 17:15:42 +0000410 "invalid suffix \"%.*s\" on integer constant",
Andreas Jaeger91b12472002-06-01 16:11:45 +0200411 (int) (limit - str), str);
Neil Boothcd7ab832002-05-29 17:15:42 +0000412 return CPP_N_INVALID;
413 }
414
Zack Weinberg56da7202002-08-02 04:18:16 +0000415 /* Traditional C only accepted the 'L' suffix.
416 Suppress warning about 'LL' with -Wno-long-long. */
417 if (CPP_WTRADITIONAL (pfile) && ! cpp_sys_macro_p (pfile))
418 {
419 int u_or_i = (result & (CPP_N_UNSIGNED|CPP_N_IMAGINARY));
420 int large = (result & CPP_N_WIDTH) == CPP_N_LARGE;
421
422 if (u_or_i || (large && CPP_OPTION (pfile, warn_long_long)))
John David Anglin0527bc42003-11-01 22:56:54 +0000423 cpp_error (pfile, CPP_DL_WARNING,
Zack Weinberg56da7202002-08-02 04:18:16 +0000424 "traditional C rejects the \"%.*s\" suffix",
425 (int) (limit - str), str);
426 }
Neil Boothcd7ab832002-05-29 17:15:42 +0000427
428 if ((result & CPP_N_WIDTH) == CPP_N_LARGE
Neil Boothcd7ab832002-05-29 17:15:42 +0000429 && CPP_OPTION (pfile, warn_long_long))
Manuel López-Ibáñez9c650d92009-04-20 22:12:52 +0000430 cpp_error (pfile,
431 CPP_OPTION (pfile, c99) ? CPP_DL_WARNING : CPP_DL_PEDWARN,
432 CPP_OPTION (pfile, cplusplus)
433 ? "use of C++0x long long integer constant"
434 : "use of C99 long long integer constant");
Neil Boothcd7ab832002-05-29 17:15:42 +0000435
436 result |= CPP_N_INTEGER;
437 }
438
Chao-ying Fuac6b1c62007-08-30 23:05:17 +0000439 syntax_ok:
Neil Boothcd7ab832002-05-29 17:15:42 +0000440 if ((result & CPP_N_IMAGINARY) && CPP_PEDANTIC (pfile))
John David Anglin0527bc42003-11-01 22:56:54 +0000441 cpp_error (pfile, CPP_DL_PEDWARN,
442 "imaginary constants are a GCC extension");
Joerg Wunschf7fd7752007-06-05 22:25:27 +0000443 if (radix == 2 && CPP_PEDANTIC (pfile))
444 cpp_error (pfile, CPP_DL_PEDWARN,
445 "binary constants are a GCC extension");
Neil Boothcd7ab832002-05-29 17:15:42 +0000446
447 if (radix == 10)
448 result |= CPP_N_DECIMAL;
449 else if (radix == 16)
450 result |= CPP_N_HEX;
Joerg Wunschf7fd7752007-06-05 22:25:27 +0000451 else if (radix == 2)
452 result |= CPP_N_BINARY;
Neil Boothcd7ab832002-05-29 17:15:42 +0000453 else
454 result |= CPP_N_OCTAL;
455
456 return result;
457
458 syntax_error:
459 return CPP_N_INVALID;
460}
461
462/* cpp_interpret_integer converts an integer constant into a cpp_num,
463 of precision options->precision.
464
465 We do not provide any interface for decimal->float conversion,
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000466 because the preprocessor doesn't need it and we don't want to
467 drag in GCC's floating point emulator. */
Neil Boothcd7ab832002-05-29 17:15:42 +0000468cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000469cpp_interpret_integer (cpp_reader *pfile, const cpp_token *token,
470 unsigned int type)
Neil Boothcd7ab832002-05-29 17:15:42 +0000471{
472 const uchar *p, *end;
473 cpp_num result;
474
475 result.low = 0;
476 result.high = 0;
Neil Booth23ff0222002-07-17 17:27:14 +0000477 result.unsignedp = !!(type & CPP_N_UNSIGNED);
478 result.overflow = false;
Neil Boothcd7ab832002-05-29 17:15:42 +0000479
480 p = token->val.str.text;
481 end = p + token->val.str.len;
482
483 /* Common case of a single digit. */
484 if (token->val.str.len == 1)
485 result.low = p[0] - '0';
486 else
487 {
488 cpp_num_part max;
489 size_t precision = CPP_OPTION (pfile, precision);
490 unsigned int base = 10, c = 0;
491 bool overflow = false;
492
493 if ((type & CPP_N_RADIX) == CPP_N_OCTAL)
494 {
495 base = 8;
496 p++;
497 }
498 else if ((type & CPP_N_RADIX) == CPP_N_HEX)
499 {
500 base = 16;
501 p += 2;
502 }
Joerg Wunschf7fd7752007-06-05 22:25:27 +0000503 else if ((type & CPP_N_RADIX) == CPP_N_BINARY)
504 {
505 base = 2;
506 p += 2;
507 }
Neil Boothcd7ab832002-05-29 17:15:42 +0000508
509 /* We can add a digit to numbers strictly less than this without
510 needing the precision and slowness of double integers. */
511 max = ~(cpp_num_part) 0;
512 if (precision < PART_PRECISION)
513 max >>= PART_PRECISION - precision;
514 max = (max - base + 1) / base + 1;
515
516 for (; p < end; p++)
517 {
518 c = *p;
519
520 if (ISDIGIT (c) || (base == 16 && ISXDIGIT (c)))
521 c = hex_value (c);
522 else
523 break;
524
525 /* Strict inequality for when max is set to zero. */
526 if (result.low < max)
527 result.low = result.low * base + c;
528 else
529 {
530 result = append_digit (result, c, base, precision);
531 overflow |= result.overflow;
532 max = 0;
533 }
534 }
535
536 if (overflow)
John David Anglin0527bc42003-11-01 22:56:54 +0000537 cpp_error (pfile, CPP_DL_PEDWARN,
Neil Boothcd7ab832002-05-29 17:15:42 +0000538 "integer constant is too large for its type");
Neil Booth017acb42002-06-20 20:34:19 +0000539 /* If too big to be signed, consider it unsigned. Only warn for
540 decimal numbers. Traditional numbers were always signed (but
Kazu Hirata8d9afc4e2002-09-16 11:42:00 +0000541 we still honor an explicit U suffix); but we only have
Neil Boothcd98faa2002-07-09 22:21:37 +0000542 traditional semantics in directives. */
Neil Booth017acb42002-06-20 20:34:19 +0000543 else if (!result.unsignedp
Neil Boothcd98faa2002-07-09 22:21:37 +0000544 && !(CPP_OPTION (pfile, traditional)
545 && pfile->state.in_directive)
Neil Booth017acb42002-06-20 20:34:19 +0000546 && !num_positive (result, precision))
Neil Boothcd7ab832002-05-29 17:15:42 +0000547 {
Joseph Myersf88d0772009-04-25 19:46:03 +0100548 /* This is for constants within the range of uintmax_t but
Joseph Myers813b9e72009-04-25 19:59:20 +0100549 not that of intmax_t. For such decimal constants, a
Joseph Myersf88d0772009-04-25 19:46:03 +0100550 diagnostic is required for C99 as the selected type must
551 be signed and not having a type is a constraint violation
552 (DR#298, TC3), so this must be a pedwarn. For C90,
553 unsigned long is specified to be used for a constant that
554 does not fit in signed long; if uintmax_t has the same
555 range as unsigned long this means only a warning is
556 appropriate here. C90 permits the preprocessor to use a
557 wider range than unsigned long in the compiler, so if
558 uintmax_t is wider than unsigned long no diagnostic is
559 required for such constants in preprocessor #if
560 expressions and the compiler will pedwarn for such
561 constants outside the range of unsigned long that reach
562 the compiler so a diagnostic is not required there
563 either; thus, pedwarn for C99 but use a plain warning for
564 C90. */
Neil Boothcd7ab832002-05-29 17:15:42 +0000565 if (base == 10)
Joseph Myersf88d0772009-04-25 19:46:03 +0100566 cpp_error (pfile, (CPP_OPTION (pfile, c99)
567 ? CPP_DL_PEDWARN
568 : CPP_DL_WARNING),
Neil Boothcd7ab832002-05-29 17:15:42 +0000569 "integer constant is so large that it is unsigned");
Neil Booth23ff0222002-07-17 17:27:14 +0000570 result.unsignedp = true;
Neil Boothcd7ab832002-05-29 17:15:42 +0000571 }
572 }
573
574 return result;
575}
Zack Weinbergcf00a882000-07-08 02:33:00 +0000576
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000577/* Append DIGIT to NUM, a number of PRECISION bits being read in base BASE. */
Neil Booth91318902002-05-26 18:42:21 +0000578static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000579append_digit (cpp_num num, int digit, int base, size_t precision)
Neil Booth91318902002-05-26 18:42:21 +0000580{
581 cpp_num result;
Joerg Wunschf7fd7752007-06-05 22:25:27 +0000582 unsigned int shift;
Neil Booth91318902002-05-26 18:42:21 +0000583 bool overflow;
584 cpp_num_part add_high, add_low;
585
Joerg Wunschf7fd7752007-06-05 22:25:27 +0000586 /* Multiply by 2, 8 or 16. Catching this overflow here means we don't
Neil Booth91318902002-05-26 18:42:21 +0000587 need to worry about add_high overflowing. */
Joerg Wunschf7fd7752007-06-05 22:25:27 +0000588 switch (base)
589 {
590 case 2:
591 shift = 1;
592 break;
593
594 case 16:
595 shift = 4;
596 break;
597
598 default:
599 shift = 3;
600 }
Neil Booth23ff0222002-07-17 17:27:14 +0000601 overflow = !!(num.high >> (PART_PRECISION - shift));
Neil Booth91318902002-05-26 18:42:21 +0000602 result.high = num.high << shift;
603 result.low = num.low << shift;
604 result.high |= num.low >> (PART_PRECISION - shift);
Diego Novillo6de9cd92004-05-13 02:41:07 -0400605 result.unsignedp = num.unsignedp;
Neil Booth91318902002-05-26 18:42:21 +0000606
607 if (base == 10)
608 {
609 add_low = num.low << 1;
610 add_high = (num.high << 1) + (num.low >> (PART_PRECISION - 1));
611 }
612 else
613 add_high = add_low = 0;
614
615 if (add_low + digit < add_low)
616 add_high++;
617 add_low += digit;
Eric Christopher22a8a522007-05-02 21:57:50 +0000618
Neil Booth91318902002-05-26 18:42:21 +0000619 if (result.low + add_low < result.low)
620 add_high++;
621 if (result.high + add_high < result.high)
622 overflow = true;
623
624 result.low += add_low;
625 result.high += add_high;
Diego Novillo6de9cd92004-05-13 02:41:07 -0400626 result.overflow = overflow;
Neil Booth91318902002-05-26 18:42:21 +0000627
628 /* The above code catches overflow of a cpp_num type. This catches
629 overflow of the (possibly shorter) target precision. */
630 num.low = result.low;
631 num.high = result.high;
632 result = num_trim (result, precision);
633 if (!num_eq (result, num))
Diego Novillo6de9cd92004-05-13 02:41:07 -0400634 result.overflow = true;
Neil Booth91318902002-05-26 18:42:21 +0000635
Neil Booth91318902002-05-26 18:42:21 +0000636 return result;
637}
638
Neil Booth5d8ebbd2002-01-03 21:43:09 +0000639/* Handle meeting "defined" in a preprocessor expression. */
Neil Booth91318902002-05-26 18:42:21 +0000640static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000641parse_defined (cpp_reader *pfile)
Zack Weinbergba412f12000-03-01 00:57:09 +0000642{
Neil Booth91318902002-05-26 18:42:21 +0000643 cpp_num result;
Neil Booth93c803682000-10-28 17:59:06 +0000644 int paren = 0;
645 cpp_hashnode *node = 0;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000646 const cpp_token *token;
Neil Booth63d75002001-11-05 22:26:13 +0000647 cpp_context *initial_context = pfile->context;
Zack Weinbergcf00a882000-07-08 02:33:00 +0000648
Neil Booth93c803682000-10-28 17:59:06 +0000649 /* Don't expand macros. */
650 pfile->state.prevent_expansion++;
651
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000652 token = cpp_get_token (pfile);
653 if (token->type == CPP_OPEN_PAREN)
Zack Weinbergcf00a882000-07-08 02:33:00 +0000654 {
655 paren = 1;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000656 token = cpp_get_token (pfile);
Zack Weinbergcf00a882000-07-08 02:33:00 +0000657 }
658
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000659 if (token->type == CPP_NAME)
Zack Weinberg041c3192000-07-04 01:58:21 +0000660 {
Joseph Myers9a0c6182009-05-10 15:27:32 +0100661 node = token->val.node.node;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000662 if (paren && cpp_get_token (pfile)->type != CPP_CLOSE_PAREN)
Neil Booth93c803682000-10-28 17:59:06 +0000663 {
John David Anglin0527bc42003-11-01 22:56:54 +0000664 cpp_error (pfile, CPP_DL_ERROR, "missing ')' after \"defined\"");
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000665 node = 0;
Neil Booth93c803682000-10-28 17:59:06 +0000666 }
Zack Weinberg041c3192000-07-04 01:58:21 +0000667 }
Neil Booth93c803682000-10-28 17:59:06 +0000668 else
Neil Booth3c8465d2001-02-06 20:07:07 +0000669 {
John David Anglin0527bc42003-11-01 22:56:54 +0000670 cpp_error (pfile, CPP_DL_ERROR,
Neil Boothebef4e82002-04-14 18:42:47 +0000671 "operator \"defined\" requires an identifier");
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000672 if (token->flags & NAMED_OP)
Neil Booth3c8465d2001-02-06 20:07:07 +0000673 {
674 cpp_token op;
675
676 op.flags = 0;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000677 op.type = token->type;
John David Anglin0527bc42003-11-01 22:56:54 +0000678 cpp_error (pfile, CPP_DL_ERROR,
Neil Booth3c8465d2001-02-06 20:07:07 +0000679 "(\"%s\" is an alternative token for \"%s\" in C++)",
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000680 cpp_token_as_text (pfile, token),
Neil Booth3c8465d2001-02-06 20:07:07 +0000681 cpp_token_as_text (pfile, &op));
682 }
683 }
Neil Booth93c803682000-10-28 17:59:06 +0000684
Neil Booth91318902002-05-26 18:42:21 +0000685 if (node)
Neil Booth93c803682000-10-28 17:59:06 +0000686 {
Neil Booth335d03e2003-08-03 12:23:46 +0000687 if (pfile->context != initial_context && CPP_PEDANTIC (pfile))
John David Anglin0527bc42003-11-01 22:56:54 +0000688 cpp_error (pfile, CPP_DL_WARNING,
Neil Boothebef4e82002-04-14 18:42:47 +0000689 "this use of \"defined\" may not be portable");
Neil Booth63d75002001-11-05 22:26:13 +0000690
Neil Bootha69cbaa2002-07-23 22:57:49 +0000691 _cpp_mark_macro_used (node);
Joseph Myers93d45d92008-04-02 20:42:53 +0100692 if (!(node->flags & NODE_USED))
693 {
694 node->flags |= NODE_USED;
695 if (node->type == NT_MACRO)
696 {
697 if (pfile->cb.used_define)
698 pfile->cb.used_define (pfile, pfile->directive_line, node);
699 }
700 else
701 {
702 if (pfile->cb.used_undef)
703 pfile->cb.used_undef (pfile, pfile->directive_line, node);
704 }
705 }
Neil Bootha69cbaa2002-07-23 22:57:49 +0000706
Neil Booth6d18adb2001-07-29 17:27:57 +0000707 /* A possible controlling macro of the form #if !defined ().
708 _cpp_parse_expr checks there was no other junk on the line. */
709 pfile->mi_ind_cmacro = node;
Neil Booth93c803682000-10-28 17:59:06 +0000710 }
711
712 pfile->state.prevent_expansion--;
Neil Booth91318902002-05-26 18:42:21 +0000713
Neil Booth23ff0222002-07-17 17:27:14 +0000714 result.unsignedp = false;
Neil Booth91318902002-05-26 18:42:21 +0000715 result.high = 0;
Neil Booth23ff0222002-07-17 17:27:14 +0000716 result.overflow = false;
Neil Booth91318902002-05-26 18:42:21 +0000717 result.low = node && node->type == NT_MACRO;
718 return result;
Zack Weinberg15dad1d2000-05-18 15:55:46 +0000719}
720
Neil Booth60284a52002-04-28 23:14:56 +0000721/* Convert a token into a CPP_NUMBER (an interpreted preprocessing
722 number or character constant, or the result of the "defined" or "#"
Neil Boothcd7ab832002-05-29 17:15:42 +0000723 operators). */
Neil Booth91318902002-05-26 18:42:21 +0000724static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000725eval_token (cpp_reader *pfile, const cpp_token *token)
Per Bothner7f2935c1995-03-16 13:59:07 -0800726{
Neil Booth91318902002-05-26 18:42:21 +0000727 cpp_num result;
Neil Booth60284a52002-04-28 23:14:56 +0000728 unsigned int temp;
Neil Booth4268e8b2002-05-04 07:30:32 +0000729 int unsignedp = 0;
Zack Weinberg041c3192000-07-04 01:58:21 +0000730
Diego Novillo6de9cd92004-05-13 02:41:07 -0400731 result.unsignedp = false;
732 result.overflow = false;
733
Neil Booth93c803682000-10-28 17:59:06 +0000734 switch (token->type)
Zack Weinbergba412f12000-03-01 00:57:09 +0000735 {
Per Bothner7f2935c1995-03-16 13:59:07 -0800736 case CPP_NUMBER:
Neil Boothcd7ab832002-05-29 17:15:42 +0000737 temp = cpp_classify_number (pfile, token);
738 switch (temp & CPP_N_CATEGORY)
739 {
740 case CPP_N_FLOATING:
John David Anglin0527bc42003-11-01 22:56:54 +0000741 cpp_error (pfile, CPP_DL_ERROR,
Neil Boothcd7ab832002-05-29 17:15:42 +0000742 "floating constant in preprocessor expression");
743 break;
744 case CPP_N_INTEGER:
745 if (!(temp & CPP_N_IMAGINARY))
746 return cpp_interpret_integer (pfile, token, temp);
John David Anglin0527bc42003-11-01 22:56:54 +0000747 cpp_error (pfile, CPP_DL_ERROR,
Neil Boothcd7ab832002-05-29 17:15:42 +0000748 "imaginary number in preprocessor expression");
749 break;
750
751 case CPP_N_INVALID:
752 /* Error already issued. */
753 break;
754 }
755 result.high = result.low = 0;
756 break;
Neil Booth7f2f1a62000-11-14 18:32:06 +0000757
Alexandre Oliva525bc952000-02-23 19:21:07 +0000758 case CPP_WCHAR:
Neil Booth4268e8b2002-05-04 07:30:32 +0000759 case CPP_CHAR:
Kris Van Heesb6baa672008-04-18 13:58:08 +0000760 case CPP_CHAR16:
761 case CPP_CHAR32:
Neil Bootha5a49442002-05-06 22:53:10 +0000762 {
Neil Booth91318902002-05-26 18:42:21 +0000763 cppchar_t cc = cpp_interpret_charconst (pfile, token,
764 &temp, &unsignedp);
765
766 result.high = 0;
767 result.low = cc;
Neil Bootha5a49442002-05-06 22:53:10 +0000768 /* Sign-extend the result if necessary. */
Neil Booth91318902002-05-26 18:42:21 +0000769 if (!unsignedp && (cppchar_signed_t) cc < 0)
770 {
771 if (PART_PRECISION > BITS_PER_CPPCHAR_T)
772 result.low |= ~(~(cpp_num_part) 0
773 >> (PART_PRECISION - BITS_PER_CPPCHAR_T));
774 result.high = ~(cpp_num_part) 0;
775 result = num_trim (result, CPP_OPTION (pfile, precision));
776 }
Neil Bootha5a49442002-05-06 22:53:10 +0000777 }
Neil Booth60284a52002-04-28 23:14:56 +0000778 break;
Zack Weinbergba412f12000-03-01 00:57:09 +0000779
Zack Weinberg92936ec2000-07-19 20:18:08 +0000780 case CPP_NAME:
Joseph Myers9a0c6182009-05-10 15:27:32 +0100781 if (token->val.node.node == pfile->spec_nodes.n_defined)
Neil Booth63d75002001-11-05 22:26:13 +0000782 return parse_defined (pfile);
Zack Weinberg7d4918a2001-02-07 18:32:42 +0000783 else if (CPP_OPTION (pfile, cplusplus)
Joseph Myers9a0c6182009-05-10 15:27:32 +0100784 && (token->val.node.node == pfile->spec_nodes.n_true
785 || token->val.node.node == pfile->spec_nodes.n_false))
Zack Weinberg7d4918a2001-02-07 18:32:42 +0000786 {
Neil Booth91318902002-05-26 18:42:21 +0000787 result.high = 0;
Joseph Myers9a0c6182009-05-10 15:27:32 +0100788 result.low = (token->val.node.node == pfile->spec_nodes.n_true);
Zack Weinberg7d4918a2001-02-07 18:32:42 +0000789 }
790 else
791 {
Neil Booth91318902002-05-26 18:42:21 +0000792 result.high = 0;
793 result.low = 0;
Neil Booth87ed1092002-04-28 19:42:54 +0000794 if (CPP_OPTION (pfile, warn_undef) && !pfile->state.skip_eval)
John David Anglin0527bc42003-11-01 22:56:54 +0000795 cpp_error (pfile, CPP_DL_WARNING, "\"%s\" is not defined",
Joseph Myers9a0c6182009-05-10 15:27:32 +0100796 NODE_NAME (token->val.node.node));
Zack Weinberg7d4918a2001-02-07 18:32:42 +0000797 }
Neil Booth60284a52002-04-28 23:14:56 +0000798 break;
Zack Weinberg5dfa4da1999-02-08 20:27:27 +0000799
Tom Tromey899015a2008-05-13 14:50:27 +0000800 case CPP_HASH:
801 if (!pfile->state.skipping)
802 {
803 /* A pedantic warning takes precedence over a deprecated
804 warning here. */
805 if (CPP_PEDANTIC (pfile))
806 cpp_error (pfile, CPP_DL_PEDWARN,
807 "assertions are a GCC extension");
808 else if (CPP_OPTION (pfile, warn_deprecated))
809 cpp_error (pfile, CPP_DL_WARNING,
810 "assertions are a deprecated extension");
811 }
Neil Booth91318902002-05-26 18:42:21 +0000812 _cpp_test_assertion (pfile, &temp);
813 result.high = 0;
814 result.low = temp;
Tom Tromey899015a2008-05-13 14:50:27 +0000815 break;
816
817 default:
818 abort ();
Neil Booth93c803682000-10-28 17:59:06 +0000819 }
Per Bothner7f2935c1995-03-16 13:59:07 -0800820
Neil Booth23ff0222002-07-17 17:27:14 +0000821 result.unsignedp = !!unsignedp;
Neil Booth91318902002-05-26 18:42:21 +0000822 return result;
Per Bothner7f2935c1995-03-16 13:59:07 -0800823}
824
Neil Booth4063b942000-04-02 08:27:23 +0000825/* Operator precedence and flags table.
Neil Boothdbac4af2000-04-01 07:48:59 +0000826
827After an operator is returned from the lexer, if it has priority less
Neil Booth87ed1092002-04-28 19:42:54 +0000828than the operator on the top of the stack, we reduce the stack by one
829operator and repeat the test. Since equal priorities do not reduce,
830this is naturally right-associative.
Neil Boothdbac4af2000-04-01 07:48:59 +0000831
Neil Booth87ed1092002-04-28 19:42:54 +0000832We handle left-associative operators by decrementing the priority of
833just-lexed operators by one, but retaining the priority of operators
834already on the stack.
Neil Boothdbac4af2000-04-01 07:48:59 +0000835
836The remaining cases are '(' and ')'. We handle '(' by skipping the
837reduction phase completely. ')' is given lower priority than
838everything else, including '(', effectively forcing a reduction of the
Kazu Hirata272d0be2002-12-19 05:18:13 +0000839parenthesized expression. If there is a matching '(', the routine
Neil Booth87ed1092002-04-28 19:42:54 +0000840reduce() exits immediately. If the normal exit route sees a ')', then
841there cannot have been a matching '(' and an error message is output.
Neil Boothdbac4af2000-04-01 07:48:59 +0000842
Neil Boothf8b954f2002-04-26 06:32:50 +0000843The parser assumes all shifted operators require a left operand unless
844the flag NO_L_OPERAND is set. These semantics are automatic; any
845extra semantics need to be handled with operator-specific code. */
Per Bothner7f2935c1995-03-16 13:59:07 -0800846
Neil Booth68e652752002-07-20 13:31:56 +0000847/* Flags. If CHECK_PROMOTION, we warn if the effective sign of an
848 operand changes because of integer promotions. */
Neil Booth87ed1092002-04-28 19:42:54 +0000849#define NO_L_OPERAND (1 << 0)
850#define LEFT_ASSOC (1 << 1)
Neil Booth68e652752002-07-20 13:31:56 +0000851#define CHECK_PROMOTION (1 << 2)
Neil Bootheba30522000-03-31 22:23:59 +0000852
Zack Weinbergcf00a882000-07-08 02:33:00 +0000853/* Operator to priority map. Must be in the same order as the first
854 N entries of enum cpp_ttype. */
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +0000855static const struct cpp_operator
Zack Weinbergcf00a882000-07-08 02:33:00 +0000856{
Neil Booth60284a52002-04-28 23:14:56 +0000857 uchar prio;
Neil Booth87ed1092002-04-28 19:42:54 +0000858 uchar flags;
859} optab[] =
860{
Neil Boothad28cff2002-07-18 22:08:35 +0000861 /* EQ */ {0, 0}, /* Shouldn't happen. */
862 /* NOT */ {16, NO_L_OPERAND},
Neil Booth68e652752002-07-20 13:31:56 +0000863 /* GREATER */ {12, LEFT_ASSOC | CHECK_PROMOTION},
864 /* LESS */ {12, LEFT_ASSOC | CHECK_PROMOTION},
865 /* PLUS */ {14, LEFT_ASSOC | CHECK_PROMOTION},
866 /* MINUS */ {14, LEFT_ASSOC | CHECK_PROMOTION},
867 /* MULT */ {15, LEFT_ASSOC | CHECK_PROMOTION},
868 /* DIV */ {15, LEFT_ASSOC | CHECK_PROMOTION},
869 /* MOD */ {15, LEFT_ASSOC | CHECK_PROMOTION},
870 /* AND */ {9, LEFT_ASSOC | CHECK_PROMOTION},
871 /* OR */ {7, LEFT_ASSOC | CHECK_PROMOTION},
872 /* XOR */ {8, LEFT_ASSOC | CHECK_PROMOTION},
Neil Boothad28cff2002-07-18 22:08:35 +0000873 /* RSHIFT */ {13, LEFT_ASSOC},
874 /* LSHIFT */ {13, LEFT_ASSOC},
Zack Weinbergcf00a882000-07-08 02:33:00 +0000875
Neil Boothad28cff2002-07-18 22:08:35 +0000876 /* COMPL */ {16, NO_L_OPERAND},
Neil Booth75aef482002-07-19 19:24:43 +0000877 /* AND_AND */ {6, LEFT_ASSOC},
878 /* OR_OR */ {5, LEFT_ASSOC},
Tom Tromey71c10032008-05-06 17:15:07 +0000879 /* Note that QUERY, COLON, and COMMA must have the same precedence.
880 However, there are some special cases for these in reduce(). */
881 /* QUERY */ {4, 0},
Neil Booth68e652752002-07-20 13:31:56 +0000882 /* COLON */ {4, LEFT_ASSOC | CHECK_PROMOTION},
Tom Tromey71c10032008-05-06 17:15:07 +0000883 /* COMMA */ {4, LEFT_ASSOC},
Neil Booth75aef482002-07-19 19:24:43 +0000884 /* OPEN_PAREN */ {1, NO_L_OPERAND},
Neil Boothad28cff2002-07-18 22:08:35 +0000885 /* CLOSE_PAREN */ {0, 0},
886 /* EOF */ {0, 0},
887 /* EQ_EQ */ {11, LEFT_ASSOC},
888 /* NOT_EQ */ {11, LEFT_ASSOC},
Neil Booth68e652752002-07-20 13:31:56 +0000889 /* GREATER_EQ */ {12, LEFT_ASSOC | CHECK_PROMOTION},
890 /* LESS_EQ */ {12, LEFT_ASSOC | CHECK_PROMOTION},
Neil Boothad28cff2002-07-18 22:08:35 +0000891 /* UPLUS */ {16, NO_L_OPERAND},
892 /* UMINUS */ {16, NO_L_OPERAND}
Zack Weinbergcf00a882000-07-08 02:33:00 +0000893};
894
Per Bothner7f2935c1995-03-16 13:59:07 -0800895/* Parse and evaluate a C expression, reading from PFILE.
Kazu Hiratadf383482002-05-22 22:02:16 +0000896 Returns the truth value of the expression.
Neil Booth87ed1092002-04-28 19:42:54 +0000897
898 The implementation is an operator precedence parser, i.e. a
899 bottom-up parser, using a stack for not-yet-reduced tokens.
900
901 The stack base is op_stack, and the current stack pointer is 'top'.
902 There is a stack element for each operator (only), and the most
903 recently pushed operator is 'top->op'. An operand (value) is
904 stored in the 'value' field of the stack element of the operator
905 that precedes it. */
906bool
Tom Tromeyd7508872008-05-30 14:25:09 +0000907_cpp_parse_expr (cpp_reader *pfile, bool is_if)
Per Bothner7f2935c1995-03-16 13:59:07 -0800908{
Neil Booth87ed1092002-04-28 19:42:54 +0000909 struct op *top = pfile->op_stack;
910 unsigned int lex_count;
911 bool saw_leading_not, want_value = true;
Per Bothner7f2935c1995-03-16 13:59:07 -0800912
Neil Booth87ed1092002-04-28 19:42:54 +0000913 pfile->state.skip_eval = 0;
Per Bothner7f2935c1995-03-16 13:59:07 -0800914
Neil Booth93c803682000-10-28 17:59:06 +0000915 /* Set up detection of #if ! defined(). */
Neil Booth6d18adb2001-07-29 17:27:57 +0000916 pfile->mi_ind_cmacro = 0;
Neil Booth87ed1092002-04-28 19:42:54 +0000917 saw_leading_not = false;
Neil Booth6d18adb2001-07-29 17:27:57 +0000918 lex_count = 0;
Neil Booth93c803682000-10-28 17:59:06 +0000919
Neil Booth87ed1092002-04-28 19:42:54 +0000920 /* Lowest priority operator prevents further reductions. */
Zack Weinbergcf00a882000-07-08 02:33:00 +0000921 top->op = CPP_EOF;
Neil Booth4063b942000-04-02 08:27:23 +0000922
Per Bothner7f2935c1995-03-16 13:59:07 -0800923 for (;;)
924 {
Zack Weinbergcf00a882000-07-08 02:33:00 +0000925 struct op op;
Per Bothner7f2935c1995-03-16 13:59:07 -0800926
Neil Booth6d18adb2001-07-29 17:27:57 +0000927 lex_count++;
Neil Booth68e652752002-07-20 13:31:56 +0000928 op.token = cpp_get_token (pfile);
929 op.op = op.token->type;
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +0000930 op.loc = op.token->src_loc;
Per Bothner7f2935c1995-03-16 13:59:07 -0800931
Per Bothner7f2935c1995-03-16 13:59:07 -0800932 switch (op.op)
933 {
Neil Booth60284a52002-04-28 23:14:56 +0000934 /* These tokens convert into values. */
Neil Boothc60e94a2001-07-19 06:12:50 +0000935 case CPP_NUMBER:
Neil Booth60284a52002-04-28 23:14:56 +0000936 case CPP_CHAR:
937 case CPP_WCHAR:
Kris Van Heesb6baa672008-04-18 13:58:08 +0000938 case CPP_CHAR16:
939 case CPP_CHAR32:
Neil Booth60284a52002-04-28 23:14:56 +0000940 case CPP_NAME:
941 case CPP_HASH:
Neil Boothf8b954f2002-04-26 06:32:50 +0000942 if (!want_value)
Neil Booth60284a52002-04-28 23:14:56 +0000943 SYNTAX_ERROR2 ("missing binary operator before token \"%s\"",
Neil Booth68e652752002-07-20 13:31:56 +0000944 cpp_token_as_text (pfile, op.token));
Neil Boothf8b954f2002-04-26 06:32:50 +0000945 want_value = false;
Neil Booth68e652752002-07-20 13:31:56 +0000946 top->value = eval_token (pfile, op.token);
Neil Booth9ee703132000-04-01 07:42:37 +0000947 continue;
948
Neil Booth6d18adb2001-07-29 17:27:57 +0000949 case CPP_NOT:
950 saw_leading_not = lex_count == 1;
Neil Booth6d18adb2001-07-29 17:27:57 +0000951 break;
Zack Weinbergcf00a882000-07-08 02:33:00 +0000952 case CPP_PLUS:
Neil Boothf8b954f2002-04-26 06:32:50 +0000953 if (want_value)
954 op.op = CPP_UPLUS;
955 break;
956 case CPP_MINUS:
957 if (want_value)
958 op.op = CPP_UMINUS;
959 break;
Neil Booth60284a52002-04-28 23:14:56 +0000960
Neil Boothf8b954f2002-04-26 06:32:50 +0000961 default:
Neil Booth60284a52002-04-28 23:14:56 +0000962 if ((int) op.op <= (int) CPP_EQ || (int) op.op >= (int) CPP_PLUS_EQ)
Neil Boothcd7ab832002-05-29 17:15:42 +0000963 SYNTAX_ERROR2 ("token \"%s\" is not valid in preprocessor expressions",
Neil Booth68e652752002-07-20 13:31:56 +0000964 cpp_token_as_text (pfile, op.token));
Neil Boothf8b954f2002-04-26 06:32:50 +0000965 break;
Per Bothner7f2935c1995-03-16 13:59:07 -0800966 }
967
Neil Booth87ed1092002-04-28 19:42:54 +0000968 /* Check we have a value or operator as appropriate. */
969 if (optab[op.op].flags & NO_L_OPERAND)
Neil Booth4063b942000-04-02 08:27:23 +0000970 {
Neil Boothf8b954f2002-04-26 06:32:50 +0000971 if (!want_value)
Neil Booth60284a52002-04-28 23:14:56 +0000972 SYNTAX_ERROR2 ("missing binary operator before token \"%s\"",
Neil Booth68e652752002-07-20 13:31:56 +0000973 cpp_token_as_text (pfile, op.token));
Neil Boothb22ef132000-04-03 22:33:12 +0000974 }
Neil Booth87ed1092002-04-28 19:42:54 +0000975 else if (want_value)
Neil Boothb22ef132000-04-03 22:33:12 +0000976 {
Neil Bootha09d4742004-07-04 12:57:50 +0000977 /* We want a number (or expression) and haven't got one.
978 Try to emit a specific diagnostic. */
979 if (op.op == CPP_CLOSE_PAREN && top->op == CPP_OPEN_PAREN)
980 SYNTAX_ERROR ("missing expression between '(' and ')'");
981
982 if (op.op == CPP_EOF && top->op == CPP_EOF)
Tom Tromeyd7508872008-05-30 14:25:09 +0000983 SYNTAX_ERROR2 ("%s with no expression", is_if ? "#if" : "#elif");
Neil Bootha09d4742004-07-04 12:57:50 +0000984
985 if (top->op != CPP_EOF && top->op != CPP_OPEN_PAREN)
986 SYNTAX_ERROR2 ("operator '%s' has no right operand",
987 cpp_token_as_text (pfile, top->token));
988 else if (op.op == CPP_CLOSE_PAREN || op.op == CPP_EOF)
989 /* Complain about missing paren during reduction. */;
990 else
991 SYNTAX_ERROR2 ("operator '%s' has no left operand",
992 cpp_token_as_text (pfile, op.token));
Neil Booth4063b942000-04-02 08:27:23 +0000993 }
Neil Booth87ed1092002-04-28 19:42:54 +0000994
995 top = reduce (pfile, top, op.op);
996 if (!top)
997 goto syntax_error;
998
Neil Booth60284a52002-04-28 23:14:56 +0000999 if (op.op == CPP_EOF)
1000 break;
1001
Neil Booth87ed1092002-04-28 19:42:54 +00001002 switch (op.op)
1003 {
1004 case CPP_CLOSE_PAREN:
1005 continue;
Neil Booth87ed1092002-04-28 19:42:54 +00001006 case CPP_OR_OR:
Neil Booth91318902002-05-26 18:42:21 +00001007 if (!num_zerop (top->value))
Neil Booth87ed1092002-04-28 19:42:54 +00001008 pfile->state.skip_eval++;
1009 break;
1010 case CPP_AND_AND:
1011 case CPP_QUERY:
Neil Booth91318902002-05-26 18:42:21 +00001012 if (num_zerop (top->value))
Neil Booth87ed1092002-04-28 19:42:54 +00001013 pfile->state.skip_eval++;
1014 break;
1015 case CPP_COLON:
Neil Booth60284a52002-04-28 23:14:56 +00001016 if (top->op != CPP_QUERY)
1017 SYNTAX_ERROR (" ':' without preceding '?'");
Neil Booth91318902002-05-26 18:42:21 +00001018 if (!num_zerop (top[-1].value)) /* Was '?' condition true? */
Neil Booth87ed1092002-04-28 19:42:54 +00001019 pfile->state.skip_eval++;
1020 else
1021 pfile->state.skip_eval--;
1022 default:
1023 break;
1024 }
1025
Neil Boothf8b954f2002-04-26 06:32:50 +00001026 want_value = true;
Neil Booth4063b942000-04-02 08:27:23 +00001027
Mike Stump0f413021996-07-03 22:07:53 +00001028 /* Check for and handle stack overflow. */
Neil Booth87ed1092002-04-28 19:42:54 +00001029 if (++top == pfile->op_limit)
1030 top = _cpp_expand_op_stack (pfile);
Kazu Hiratadf383482002-05-22 22:02:16 +00001031
Per Bothner7f2935c1995-03-16 13:59:07 -08001032 top->op = op.op;
Neil Booth68e652752002-07-20 13:31:56 +00001033 top->token = op.token;
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001034 top->loc = op.token->src_loc;
Per Bothner7f2935c1995-03-16 13:59:07 -08001035 }
Neil Booth9ee703132000-04-01 07:42:37 +00001036
Neil Booth6d18adb2001-07-29 17:27:57 +00001037 /* The controlling macro expression is only valid if we called lex 3
1038 times: <!> <defined expression> and <EOF>. push_conditional ()
1039 checks that we are at top-of-file. */
1040 if (pfile->mi_ind_cmacro && !(saw_leading_not && lex_count == 3))
1041 pfile->mi_ind_cmacro = 0;
1042
Neil Booth87ed1092002-04-28 19:42:54 +00001043 if (top != pfile->op_stack)
Neil Boothebef4e82002-04-14 18:42:47 +00001044 {
Tom Tromeyd7508872008-05-30 14:25:09 +00001045 cpp_error (pfile, CPP_DL_ICE, "unbalanced stack in %s",
1046 is_if ? "#if" : "#elif");
Neil Booth4063b942000-04-02 08:27:23 +00001047 syntax_error:
Neil Booth87ed1092002-04-28 19:42:54 +00001048 return false; /* Return false on syntax error. */
Neil Booth4063b942000-04-02 08:27:23 +00001049 }
Neil Booth9ee703132000-04-01 07:42:37 +00001050
Neil Booth91318902002-05-26 18:42:21 +00001051 return !num_zerop (top->value);
Neil Booth87ed1092002-04-28 19:42:54 +00001052}
1053
1054/* Reduce the operator / value stack if possible, in preparation for
1055 pushing operator OP. Returns NULL on error, otherwise the top of
1056 the stack. */
1057static struct op *
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001058reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op)
Neil Booth87ed1092002-04-28 19:42:54 +00001059{
1060 unsigned int prio;
1061
Neil Booth91318902002-05-26 18:42:21 +00001062 if (top->op <= CPP_EQ || top->op > CPP_LAST_CPP_OP + 2)
1063 {
1064 bad_op:
John David Anglin0527bc42003-11-01 22:56:54 +00001065 cpp_error (pfile, CPP_DL_ICE, "impossible operator '%u'", top->op);
Neil Booth91318902002-05-26 18:42:21 +00001066 return 0;
1067 }
1068
Neil Booth87ed1092002-04-28 19:42:54 +00001069 if (op == CPP_OPEN_PAREN)
1070 return top;
1071
1072 /* Decrement the priority of left-associative operators to force a
1073 reduction with operators of otherwise equal priority. */
1074 prio = optab[op].prio - ((optab[op].flags & LEFT_ASSOC) != 0);
1075 while (prio < optab[top->op].prio)
1076 {
Neil Booth68e652752002-07-20 13:31:56 +00001077 if (CPP_OPTION (pfile, warn_num_sign_change)
1078 && optab[top->op].flags & CHECK_PROMOTION)
1079 check_promotion (pfile, top);
1080
Neil Booth75aef482002-07-19 19:24:43 +00001081 switch (top->op)
1082 {
1083 case CPP_UPLUS:
1084 case CPP_UMINUS:
1085 case CPP_NOT:
1086 case CPP_COMPL:
1087 top[-1].value = num_unary_op (pfile, top->value, top->op);
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001088 top[-1].loc = top->loc;
Neil Booth75aef482002-07-19 19:24:43 +00001089 break;
Neil Booth91318902002-05-26 18:42:21 +00001090
Neil Booth75aef482002-07-19 19:24:43 +00001091 case CPP_PLUS:
1092 case CPP_MINUS:
1093 case CPP_RSHIFT:
1094 case CPP_LSHIFT:
Neil Booth75aef482002-07-19 19:24:43 +00001095 case CPP_COMMA:
1096 top[-1].value = num_binary_op (pfile, top[-1].value,
1097 top->value, top->op);
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001098 top[-1].loc = top->loc;
Neil Booth75aef482002-07-19 19:24:43 +00001099 break;
Neil Booth91318902002-05-26 18:42:21 +00001100
Neil Booth75aef482002-07-19 19:24:43 +00001101 case CPP_GREATER:
1102 case CPP_LESS:
1103 case CPP_GREATER_EQ:
1104 case CPP_LESS_EQ:
1105 top[-1].value
1106 = num_inequality_op (pfile, top[-1].value, top->value, top->op);
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001107 top[-1].loc = top->loc;
Neil Booth75aef482002-07-19 19:24:43 +00001108 break;
Neil Booth91318902002-05-26 18:42:21 +00001109
Neil Booth75aef482002-07-19 19:24:43 +00001110 case CPP_EQ_EQ:
1111 case CPP_NOT_EQ:
1112 top[-1].value
1113 = num_equality_op (pfile, top[-1].value, top->value, top->op);
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001114 top[-1].loc = top->loc;
Neil Booth75aef482002-07-19 19:24:43 +00001115 break;
Neil Boothad28cff2002-07-18 22:08:35 +00001116
Neil Booth75aef482002-07-19 19:24:43 +00001117 case CPP_AND:
1118 case CPP_OR:
1119 case CPP_XOR:
1120 top[-1].value
1121 = num_bitwise_op (pfile, top[-1].value, top->value, top->op);
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001122 top[-1].loc = top->loc;
Neil Booth75aef482002-07-19 19:24:43 +00001123 break;
Neil Boothad28cff2002-07-18 22:08:35 +00001124
Neil Booth75aef482002-07-19 19:24:43 +00001125 case CPP_MULT:
1126 top[-1].value = num_mul (pfile, top[-1].value, top->value);
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001127 top[-1].loc = top->loc;
Neil Booth75aef482002-07-19 19:24:43 +00001128 break;
Neil Boothad28cff2002-07-18 22:08:35 +00001129
Neil Booth75aef482002-07-19 19:24:43 +00001130 case CPP_DIV:
1131 case CPP_MOD:
1132 top[-1].value = num_div_op (pfile, top[-1].value,
Manuel López-Ibáñezb506a5a2009-06-18 15:10:23 +00001133 top->value, top->op, top->loc);
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001134 top[-1].loc = top->loc;
Neil Booth75aef482002-07-19 19:24:43 +00001135 break;
Neil Boothad28cff2002-07-18 22:08:35 +00001136
Neil Booth75aef482002-07-19 19:24:43 +00001137 case CPP_OR_OR:
1138 top--;
1139 if (!num_zerop (top->value))
1140 pfile->state.skip_eval--;
1141 top->value.low = (!num_zerop (top->value)
1142 || !num_zerop (top[1].value));
1143 top->value.high = 0;
1144 top->value.unsignedp = false;
1145 top->value.overflow = false;
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001146 top->loc = top[1].loc;
Neil Booth75aef482002-07-19 19:24:43 +00001147 continue;
1148
1149 case CPP_AND_AND:
1150 top--;
1151 if (num_zerop (top->value))
1152 pfile->state.skip_eval--;
1153 top->value.low = (!num_zerop (top->value)
1154 && !num_zerop (top[1].value));
1155 top->value.high = 0;
1156 top->value.unsignedp = false;
1157 top->value.overflow = false;
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001158 top->loc = top[1].loc;
Neil Booth75aef482002-07-19 19:24:43 +00001159 continue;
1160
1161 case CPP_OPEN_PAREN:
1162 if (op != CPP_CLOSE_PAREN)
1163 {
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001164 cpp_error_with_line (pfile, CPP_DL_ERROR,
1165 top->token->src_loc,
1166 0, "missing ')' in expression");
Neil Booth75aef482002-07-19 19:24:43 +00001167 return 0;
1168 }
1169 top--;
1170 top->value = top[1].value;
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001171 top->loc = top[1].loc;
Neil Booth75aef482002-07-19 19:24:43 +00001172 return top;
1173
1174 case CPP_COLON:
1175 top -= 2;
1176 if (!num_zerop (top->value))
1177 {
Neil Booth91318902002-05-26 18:42:21 +00001178 pfile->state.skip_eval--;
Neil Booth75aef482002-07-19 19:24:43 +00001179 top->value = top[1].value;
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001180 top->loc = top[1].loc;
Neil Booth75aef482002-07-19 19:24:43 +00001181 }
1182 else
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001183 {
1184 top->value = top[2].value;
1185 top->loc = top[2].loc;
1186 }
Neil Booth75aef482002-07-19 19:24:43 +00001187 top->value.unsignedp = (top[1].value.unsignedp
1188 || top[2].value.unsignedp);
1189 continue;
Neil Booth91318902002-05-26 18:42:21 +00001190
Neil Booth75aef482002-07-19 19:24:43 +00001191 case CPP_QUERY:
Tom Tromey71c10032008-05-06 17:15:07 +00001192 /* COMMA and COLON should not reduce a QUERY operator. */
1193 if (op == CPP_COMMA || op == CPP_COLON)
1194 return top;
John David Anglin0527bc42003-11-01 22:56:54 +00001195 cpp_error (pfile, CPP_DL_ERROR, "'?' without following ':'");
Neil Booth75aef482002-07-19 19:24:43 +00001196 return 0;
Neil Booth91318902002-05-26 18:42:21 +00001197
Neil Booth75aef482002-07-19 19:24:43 +00001198 default:
1199 goto bad_op;
1200 }
Neil Boothad28cff2002-07-18 22:08:35 +00001201
1202 top--;
Neil Booth91318902002-05-26 18:42:21 +00001203 if (top->value.overflow && !pfile->state.skip_eval)
John David Anglin0527bc42003-11-01 22:56:54 +00001204 cpp_error (pfile, CPP_DL_PEDWARN,
Neil Booth91318902002-05-26 18:42:21 +00001205 "integer overflow in preprocessor expression");
Neil Booth87ed1092002-04-28 19:42:54 +00001206 }
1207
1208 if (op == CPP_CLOSE_PAREN)
1209 {
John David Anglin0527bc42003-11-01 22:56:54 +00001210 cpp_error (pfile, CPP_DL_ERROR, "missing '(' in expression");
Neil Booth87ed1092002-04-28 19:42:54 +00001211 return 0;
1212 }
1213
1214 return top;
1215}
1216
1217/* Returns the position of the old top of stack after expansion. */
1218struct op *
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001219_cpp_expand_op_stack (cpp_reader *pfile)
Neil Booth87ed1092002-04-28 19:42:54 +00001220{
Neil Booth32fa4562002-05-09 22:27:31 +00001221 size_t old_size = (size_t) (pfile->op_limit - pfile->op_stack);
1222 size_t new_size = old_size * 2 + 20;
Neil Booth87ed1092002-04-28 19:42:54 +00001223
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +00001224 pfile->op_stack = XRESIZEVEC (struct op, pfile->op_stack, new_size);
Neil Booth32fa4562002-05-09 22:27:31 +00001225 pfile->op_limit = pfile->op_stack + new_size;
Neil Booth87ed1092002-04-28 19:42:54 +00001226
Neil Booth32fa4562002-05-09 22:27:31 +00001227 return pfile->op_stack + old_size;
Per Bothner7f2935c1995-03-16 13:59:07 -08001228}
Neil Booth91318902002-05-26 18:42:21 +00001229
Neil Booth68e652752002-07-20 13:31:56 +00001230/* Emits a warning if the effective sign of either operand of OP
1231 changes because of integer promotions. */
1232static void
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001233check_promotion (cpp_reader *pfile, const struct op *op)
Neil Booth68e652752002-07-20 13:31:56 +00001234{
1235 if (op->value.unsignedp == op[-1].value.unsignedp)
1236 return;
1237
1238 if (op->value.unsignedp)
1239 {
1240 if (!num_positive (op[-1].value, CPP_OPTION (pfile, precision)))
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001241 cpp_error_with_line (pfile, CPP_DL_WARNING, op[-1].loc, 0,
1242 "the left operand of \"%s\" changes sign when promoted",
1243 cpp_token_as_text (pfile, op->token));
Neil Booth68e652752002-07-20 13:31:56 +00001244 }
1245 else if (!num_positive (op->value, CPP_OPTION (pfile, precision)))
Manuel López-Ibáñez47960aa2008-10-31 22:00:37 +00001246 cpp_error_with_line (pfile, CPP_DL_WARNING, op->loc, 0,
Neil Booth68e652752002-07-20 13:31:56 +00001247 "the right operand of \"%s\" changes sign when promoted",
1248 cpp_token_as_text (pfile, op->token));
1249}
1250
Neil Booth91318902002-05-26 18:42:21 +00001251/* Clears the unused high order bits of the number pointed to by PNUM. */
1252static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001253num_trim (cpp_num num, size_t precision)
Neil Booth91318902002-05-26 18:42:21 +00001254{
1255 if (precision > PART_PRECISION)
1256 {
1257 precision -= PART_PRECISION;
1258 if (precision < PART_PRECISION)
Neil Booth359b0be2002-05-28 05:44:06 +00001259 num.high &= ((cpp_num_part) 1 << precision) - 1;
Neil Booth91318902002-05-26 18:42:21 +00001260 }
1261 else
1262 {
1263 if (precision < PART_PRECISION)
Neil Booth359b0be2002-05-28 05:44:06 +00001264 num.low &= ((cpp_num_part) 1 << precision) - 1;
Neil Booth91318902002-05-26 18:42:21 +00001265 num.high = 0;
1266 }
1267
1268 return num;
1269}
1270
1271/* True iff A (presumed signed) >= 0. */
1272static bool
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001273num_positive (cpp_num num, size_t precision)
Neil Booth91318902002-05-26 18:42:21 +00001274{
1275 if (precision > PART_PRECISION)
1276 {
1277 precision -= PART_PRECISION;
Neil Booth359b0be2002-05-28 05:44:06 +00001278 return (num.high & (cpp_num_part) 1 << (precision - 1)) == 0;
Neil Booth91318902002-05-26 18:42:21 +00001279 }
1280
Neil Booth359b0be2002-05-28 05:44:06 +00001281 return (num.low & (cpp_num_part) 1 << (precision - 1)) == 0;
Neil Booth91318902002-05-26 18:42:21 +00001282}
1283
Neil Boothceeedfc2002-06-02 19:37:34 +00001284/* Sign extend a number, with PRECISION significant bits and all
1285 others assumed clear, to fill out a cpp_num structure. */
1286cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001287cpp_num_sign_extend (cpp_num num, size_t precision)
Neil Boothceeedfc2002-06-02 19:37:34 +00001288{
1289 if (!num.unsignedp)
1290 {
1291 if (precision > PART_PRECISION)
1292 {
1293 precision -= PART_PRECISION;
1294 if (precision < PART_PRECISION
1295 && (num.high & (cpp_num_part) 1 << (precision - 1)))
1296 num.high |= ~(~(cpp_num_part) 0 >> (PART_PRECISION - precision));
1297 }
1298 else if (num.low & (cpp_num_part) 1 << (precision - 1))
1299 {
1300 if (precision < PART_PRECISION)
1301 num.low |= ~(~(cpp_num_part) 0 >> (PART_PRECISION - precision));
1302 num.high = ~(cpp_num_part) 0;
1303 }
1304 }
1305
1306 return num;
1307}
1308
Neil Booth91318902002-05-26 18:42:21 +00001309/* Returns the negative of NUM. */
1310static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001311num_negate (cpp_num num, size_t precision)
Neil Booth91318902002-05-26 18:42:21 +00001312{
1313 cpp_num copy;
1314
1315 copy = num;
1316 num.high = ~num.high;
1317 num.low = ~num.low;
1318 if (++num.low == 0)
1319 num.high++;
1320 num = num_trim (num, precision);
1321 num.overflow = (!num.unsignedp && num_eq (num, copy) && !num_zerop (num));
1322
1323 return num;
1324}
1325
1326/* Returns true if A >= B. */
1327static bool
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001328num_greater_eq (cpp_num pa, cpp_num pb, size_t precision)
Neil Booth91318902002-05-26 18:42:21 +00001329{
1330 bool unsignedp;
1331
1332 unsignedp = pa.unsignedp || pb.unsignedp;
1333
1334 if (!unsignedp)
1335 {
1336 /* Both numbers have signed type. If they are of different
1337 sign, the answer is the sign of A. */
1338 unsignedp = num_positive (pa, precision);
1339
1340 if (unsignedp != num_positive (pb, precision))
1341 return unsignedp;
1342
1343 /* Otherwise we can do an unsigned comparison. */
1344 }
1345
1346 return (pa.high > pb.high) || (pa.high == pb.high && pa.low >= pb.low);
1347}
1348
1349/* Returns LHS OP RHS, where OP is a bit-wise operation. */
1350static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001351num_bitwise_op (cpp_reader *pfile ATTRIBUTE_UNUSED,
1352 cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
Neil Booth91318902002-05-26 18:42:21 +00001353{
1354 lhs.overflow = false;
1355 lhs.unsignedp = lhs.unsignedp || rhs.unsignedp;
1356
1357 /* As excess precision is zeroed, there is no need to num_trim () as
1358 these operations cannot introduce a set bit there. */
1359 if (op == CPP_AND)
1360 {
1361 lhs.low &= rhs.low;
1362 lhs.high &= rhs.high;
1363 }
1364 else if (op == CPP_OR)
1365 {
1366 lhs.low |= rhs.low;
1367 lhs.high |= rhs.high;
1368 }
1369 else
1370 {
1371 lhs.low ^= rhs.low;
1372 lhs.high ^= rhs.high;
1373 }
1374
1375 return lhs;
1376}
1377
1378/* Returns LHS OP RHS, where OP is an inequality. */
1379static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001380num_inequality_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs,
1381 enum cpp_ttype op)
Neil Booth91318902002-05-26 18:42:21 +00001382{
1383 bool gte = num_greater_eq (lhs, rhs, CPP_OPTION (pfile, precision));
1384
1385 if (op == CPP_GREATER_EQ)
1386 lhs.low = gte;
1387 else if (op == CPP_LESS)
1388 lhs.low = !gte;
1389 else if (op == CPP_GREATER)
1390 lhs.low = gte && !num_eq (lhs, rhs);
1391 else /* CPP_LESS_EQ. */
1392 lhs.low = !gte || num_eq (lhs, rhs);
1393
1394 lhs.high = 0;
1395 lhs.overflow = false;
1396 lhs.unsignedp = false;
1397 return lhs;
1398}
1399
1400/* Returns LHS OP RHS, where OP is == or !=. */
1401static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001402num_equality_op (cpp_reader *pfile ATTRIBUTE_UNUSED,
1403 cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
Neil Booth91318902002-05-26 18:42:21 +00001404{
Jason Merrill97459792002-06-07 09:29:17 -04001405 /* Work around a 3.0.4 bug; see PR 6950. */
1406 bool eq = num_eq (lhs, rhs);
Neil Booth91318902002-05-26 18:42:21 +00001407 if (op == CPP_NOT_EQ)
Jason Merrill97459792002-06-07 09:29:17 -04001408 eq = !eq;
1409 lhs.low = eq;
Neil Booth91318902002-05-26 18:42:21 +00001410 lhs.high = 0;
1411 lhs.overflow = false;
1412 lhs.unsignedp = false;
1413 return lhs;
1414}
1415
1416/* Shift NUM, of width PRECISION, right by N bits. */
1417static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001418num_rshift (cpp_num num, size_t precision, size_t n)
Neil Booth91318902002-05-26 18:42:21 +00001419{
1420 cpp_num_part sign_mask;
Diego Novillo6de9cd92004-05-13 02:41:07 -04001421 bool x = num_positive (num, precision);
Neil Booth91318902002-05-26 18:42:21 +00001422
Diego Novillo6de9cd92004-05-13 02:41:07 -04001423 if (num.unsignedp || x)
Neil Booth91318902002-05-26 18:42:21 +00001424 sign_mask = 0;
1425 else
1426 sign_mask = ~(cpp_num_part) 0;
1427
1428 if (n >= precision)
1429 num.high = num.low = sign_mask;
1430 else
1431 {
1432 /* Sign-extend. */
1433 if (precision < PART_PRECISION)
1434 num.high = sign_mask, num.low |= sign_mask << precision;
1435 else if (precision < 2 * PART_PRECISION)
1436 num.high |= sign_mask << (precision - PART_PRECISION);
1437
1438 if (n >= PART_PRECISION)
1439 {
1440 n -= PART_PRECISION;
1441 num.low = num.high;
1442 num.high = sign_mask;
1443 }
1444
1445 if (n)
1446 {
1447 num.low = (num.low >> n) | (num.high << (PART_PRECISION - n));
1448 num.high = (num.high >> n) | (sign_mask << (PART_PRECISION - n));
1449 }
1450 }
1451
1452 num = num_trim (num, precision);
1453 num.overflow = false;
1454 return num;
1455}
1456
1457/* Shift NUM, of width PRECISION, left by N bits. */
1458static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001459num_lshift (cpp_num num, size_t precision, size_t n)
Neil Booth91318902002-05-26 18:42:21 +00001460{
1461 if (n >= precision)
1462 {
1463 num.overflow = !num.unsignedp && !num_zerop (num);
1464 num.high = num.low = 0;
1465 }
1466 else
1467 {
1468 cpp_num orig, maybe_orig;
1469 size_t m = n;
1470
1471 orig = num;
1472 if (m >= PART_PRECISION)
1473 {
1474 m -= PART_PRECISION;
1475 num.high = num.low;
1476 num.low = 0;
1477 }
1478 if (m)
1479 {
1480 num.high = (num.high << m) | (num.low >> (PART_PRECISION - m));
1481 num.low <<= m;
1482 }
1483 num = num_trim (num, precision);
1484
1485 if (num.unsignedp)
1486 num.overflow = false;
1487 else
1488 {
1489 maybe_orig = num_rshift (num, precision, n);
1490 num.overflow = !num_eq (orig, maybe_orig);
1491 }
1492 }
1493
1494 return num;
1495}
1496
1497/* The four unary operators: +, -, ! and ~. */
1498static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001499num_unary_op (cpp_reader *pfile, cpp_num num, enum cpp_ttype op)
Neil Booth91318902002-05-26 18:42:21 +00001500{
1501 switch (op)
1502 {
1503 case CPP_UPLUS:
Neil Booth75aef482002-07-19 19:24:43 +00001504 if (CPP_WTRADITIONAL (pfile) && !pfile->state.skip_eval)
John David Anglin0527bc42003-11-01 22:56:54 +00001505 cpp_error (pfile, CPP_DL_WARNING,
Neil Booth91318902002-05-26 18:42:21 +00001506 "traditional C rejects the unary plus operator");
1507 num.overflow = false;
1508 break;
1509
1510 case CPP_UMINUS:
1511 num = num_negate (num, CPP_OPTION (pfile, precision));
1512 break;
1513
1514 case CPP_COMPL:
1515 num.high = ~num.high;
1516 num.low = ~num.low;
1517 num = num_trim (num, CPP_OPTION (pfile, precision));
1518 num.overflow = false;
1519 break;
1520
1521 default: /* case CPP_NOT: */
1522 num.low = num_zerop (num);
1523 num.high = 0;
1524 num.overflow = false;
1525 num.unsignedp = false;
1526 break;
1527 }
1528
1529 return num;
1530}
1531
1532/* The various binary operators. */
1533static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001534num_binary_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
Neil Booth91318902002-05-26 18:42:21 +00001535{
1536 cpp_num result;
1537 size_t precision = CPP_OPTION (pfile, precision);
Neil Booth91318902002-05-26 18:42:21 +00001538 size_t n;
1539
1540 switch (op)
1541 {
1542 /* Shifts. */
1543 case CPP_LSHIFT:
1544 case CPP_RSHIFT:
1545 if (!rhs.unsignedp && !num_positive (rhs, precision))
1546 {
1547 /* A negative shift is a positive shift the other way. */
1548 if (op == CPP_LSHIFT)
1549 op = CPP_RSHIFT;
1550 else
1551 op = CPP_LSHIFT;
1552 rhs = num_negate (rhs, precision);
1553 }
1554 if (rhs.high)
1555 n = ~0; /* Maximal. */
1556 else
1557 n = rhs.low;
1558 if (op == CPP_LSHIFT)
1559 lhs = num_lshift (lhs, precision, n);
1560 else
1561 lhs = num_rshift (lhs, precision, n);
1562 break;
1563
Neil Booth91318902002-05-26 18:42:21 +00001564 /* Arithmetic. */
1565 case CPP_MINUS:
1566 rhs = num_negate (rhs, precision);
1567 case CPP_PLUS:
1568 result.low = lhs.low + rhs.low;
1569 result.high = lhs.high + rhs.high;
1570 if (result.low < lhs.low)
1571 result.high++;
Diego Novillo6de9cd92004-05-13 02:41:07 -04001572 result.unsignedp = lhs.unsignedp || rhs.unsignedp;
1573 result.overflow = false;
Neil Booth91318902002-05-26 18:42:21 +00001574
1575 result = num_trim (result, precision);
Diego Novillo6de9cd92004-05-13 02:41:07 -04001576 if (!result.unsignedp)
Neil Booth91318902002-05-26 18:42:21 +00001577 {
1578 bool lhsp = num_positive (lhs, precision);
1579 result.overflow = (lhsp == num_positive (rhs, precision)
1580 && lhsp != num_positive (result, precision));
1581 }
1582 return result;
1583
1584 /* Comma. */
1585 default: /* case CPP_COMMA: */
Joseph Myers32e8aa92004-02-11 23:50:45 +00001586 if (CPP_PEDANTIC (pfile) && (!CPP_OPTION (pfile, c99)
1587 || !pfile->state.skip_eval))
John David Anglin0527bc42003-11-01 22:56:54 +00001588 cpp_error (pfile, CPP_DL_PEDWARN,
Neil Booth91318902002-05-26 18:42:21 +00001589 "comma operator in operand of #if");
1590 lhs = rhs;
1591 break;
1592 }
1593
1594 return lhs;
1595}
1596
1597/* Multiplies two unsigned cpp_num_parts to give a cpp_num. This
1598 cannot overflow. */
1599static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001600num_part_mul (cpp_num_part lhs, cpp_num_part rhs)
Neil Booth91318902002-05-26 18:42:21 +00001601{
1602 cpp_num result;
1603 cpp_num_part middle[2], temp;
1604
1605 result.low = LOW_PART (lhs) * LOW_PART (rhs);
1606 result.high = HIGH_PART (lhs) * HIGH_PART (rhs);
1607
1608 middle[0] = LOW_PART (lhs) * HIGH_PART (rhs);
1609 middle[1] = HIGH_PART (lhs) * LOW_PART (rhs);
1610
1611 temp = result.low;
1612 result.low += LOW_PART (middle[0]) << (PART_PRECISION / 2);
1613 if (result.low < temp)
1614 result.high++;
1615
1616 temp = result.low;
1617 result.low += LOW_PART (middle[1]) << (PART_PRECISION / 2);
1618 if (result.low < temp)
1619 result.high++;
1620
1621 result.high += HIGH_PART (middle[0]);
1622 result.high += HIGH_PART (middle[1]);
Diego Novillo6de9cd92004-05-13 02:41:07 -04001623 result.unsignedp = true;
1624 result.overflow = false;
Neil Booth91318902002-05-26 18:42:21 +00001625
1626 return result;
1627}
1628
1629/* Multiply two preprocessing numbers. */
1630static cpp_num
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001631num_mul (cpp_reader *pfile, cpp_num lhs, cpp_num rhs)
Neil Booth91318902002-05-26 18:42:21 +00001632{
1633 cpp_num result, temp;
1634 bool unsignedp = lhs.unsignedp || rhs.unsignedp;
1635 bool overflow, negate = false;
1636 size_t precision = CPP_OPTION (pfile, precision);
1637
1638 /* Prepare for unsigned multiplication. */
1639 if (!unsignedp)
1640 {
1641 if (!num_positive (lhs, precision))
1642 negate = !negate, lhs = num_negate (lhs, precision);
1643 if (!num_positive (rhs, precision))
1644 negate = !negate, rhs = num_negate (rhs, precision);
1645 }
1646
1647 overflow = lhs.high && rhs.high;
1648 result = num_part_mul (lhs.low, rhs.low);
1649
1650 temp = num_part_mul (lhs.high, rhs.low);
1651 result.high += temp.low;
1652 if (temp.high)
1653 overflow = true;
1654
1655 temp = num_part_mul (lhs.low, rhs.high);
1656 result.high += temp.low;
1657 if (temp.high)
1658 overflow = true;
1659
1660 temp.low = result.low, temp.high = result.high;
1661 result = num_trim (result, precision);
1662 if (!num_eq (result, temp))
1663 overflow = true;
1664
1665 if (negate)
1666 result = num_negate (result, precision);
1667
1668 if (unsignedp)
1669 result.overflow = false;
1670 else
1671 result.overflow = overflow || (num_positive (result, precision) ^ !negate
1672 && !num_zerop (result));
1673 result.unsignedp = unsignedp;
1674
1675 return result;
1676}
1677
Manuel López-Ibáñezb506a5a2009-06-18 15:10:23 +00001678/* Divide two preprocessing numbers, LHS and RHS, returning the answer
1679 or the remainder depending upon OP. LOCATION is the source location
1680 of this operator (for diagnostics). */
1681
Neil Booth91318902002-05-26 18:42:21 +00001682static cpp_num
Manuel López-Ibáñezb506a5a2009-06-18 15:10:23 +00001683num_div_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op,
1684 source_location location)
Neil Booth91318902002-05-26 18:42:21 +00001685{
1686 cpp_num result, sub;
1687 cpp_num_part mask;
1688 bool unsignedp = lhs.unsignedp || rhs.unsignedp;
1689 bool negate = false, lhs_neg = false;
1690 size_t i, precision = CPP_OPTION (pfile, precision);
1691
1692 /* Prepare for unsigned division. */
1693 if (!unsignedp)
1694 {
1695 if (!num_positive (lhs, precision))
1696 negate = !negate, lhs_neg = true, lhs = num_negate (lhs, precision);
1697 if (!num_positive (rhs, precision))
1698 negate = !negate, rhs = num_negate (rhs, precision);
1699 }
1700
1701 /* Find the high bit. */
1702 if (rhs.high)
1703 {
1704 i = precision - 1;
Neil Booth359b0be2002-05-28 05:44:06 +00001705 mask = (cpp_num_part) 1 << (i - PART_PRECISION);
Neil Booth91318902002-05-26 18:42:21 +00001706 for (; ; i--, mask >>= 1)
1707 if (rhs.high & mask)
1708 break;
1709 }
1710 else if (rhs.low)
1711 {
1712 if (precision > PART_PRECISION)
1713 i = precision - PART_PRECISION - 1;
1714 else
1715 i = precision - 1;
Neil Booth359b0be2002-05-28 05:44:06 +00001716 mask = (cpp_num_part) 1 << i;
Neil Booth91318902002-05-26 18:42:21 +00001717 for (; ; i--, mask >>= 1)
1718 if (rhs.low & mask)
1719 break;
1720 }
1721 else
1722 {
Neil Booth75aef482002-07-19 19:24:43 +00001723 if (!pfile->state.skip_eval)
Manuel López-Ibáñezb506a5a2009-06-18 15:10:23 +00001724 cpp_error_with_line (pfile, CPP_DL_ERROR, location, 0,
1725 "division by zero in #if");
Neil Booth91318902002-05-26 18:42:21 +00001726 return lhs;
1727 }
1728
Kazu Hiratada7d8302002-09-22 02:03:17 +00001729 /* First nonzero bit of RHS is bit I. Do naive division by
Neil Booth91318902002-05-26 18:42:21 +00001730 shifting the RHS fully left, and subtracting from LHS if LHS is
1731 at least as big, and then repeating but with one less shift.
1732 This is not very efficient, but is easy to understand. */
1733
1734 rhs.unsignedp = true;
1735 lhs.unsignedp = true;
1736 i = precision - i - 1;
1737 sub = num_lshift (rhs, precision, i);
1738
1739 result.high = result.low = 0;
1740 for (;;)
1741 {
1742 if (num_greater_eq (lhs, sub, precision))
1743 {
1744 lhs = num_binary_op (pfile, lhs, sub, CPP_MINUS);
1745 if (i >= PART_PRECISION)
Neil Booth359b0be2002-05-28 05:44:06 +00001746 result.high |= (cpp_num_part) 1 << (i - PART_PRECISION);
Neil Booth91318902002-05-26 18:42:21 +00001747 else
Neil Booth359b0be2002-05-28 05:44:06 +00001748 result.low |= (cpp_num_part) 1 << i;
Neil Booth91318902002-05-26 18:42:21 +00001749 }
1750 if (i-- == 0)
1751 break;
1752 sub.low = (sub.low >> 1) | (sub.high << (PART_PRECISION - 1));
1753 sub.high >>= 1;
1754 }
1755
1756 /* We divide so that the remainder has the sign of the LHS. */
1757 if (op == CPP_DIV)
1758 {
1759 result.unsignedp = unsignedp;
Diego Novillo6de9cd92004-05-13 02:41:07 -04001760 result.overflow = false;
1761 if (!unsignedp)
Neil Booth91318902002-05-26 18:42:21 +00001762 {
1763 if (negate)
1764 result = num_negate (result, precision);
Eric Christopher22a8a522007-05-02 21:57:50 +00001765 result.overflow = (num_positive (result, precision) ^ !negate
1766 && !num_zerop (result));
Neil Booth91318902002-05-26 18:42:21 +00001767 }
1768
1769 return result;
1770 }
1771
1772 /* CPP_MOD. */
1773 lhs.unsignedp = unsignedp;
1774 lhs.overflow = false;
1775 if (lhs_neg)
1776 lhs = num_negate (lhs, precision);
1777
1778 return lhs;
1779}