]> gcc.gnu.org Git - gcc.git/blame - libcpp/expr.c
re PR fortran/36117 (Use MPFR for bessel function (optimization, rejects valid F2008))
[gcc.git] / libcpp / expr.c
CommitLineData
b0699dad 1/* Parse C expressions for cpplib.
5d8ebbd8 2 Copyright (C) 1987, 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2001,
ca2b05ba 3 2002, 2004 Free Software Foundation.
e38992e8 4 Contributed by Per Bothner, 1994.
7f2935c7
PB
5
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
8Free Software Foundation; either version 2, or (at your option) any
9later 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
17along with this program; if not, write to the Free Software
200031d1
KC
18Foundation, 51 Franklin Street, Fifth Floor,
19Boston, MA 02110-1301, USA. */
7f2935c7 20
7f2935c7 21#include "config.h"
b04cd507 22#include "system.h"
487a6e06 23#include "cpplib.h"
4f4e53dd 24#include "internal.h"
7f2935c7 25
91318908
NB
26#define PART_PRECISION (sizeof (cpp_num_part) * CHAR_BIT)
27#define HALF_MASK (~(cpp_num_part) 0 >> (PART_PRECISION / 2))
28#define LOW_PART(num_part) (num_part & HALF_MASK)
29#define HIGH_PART(num_part) (num_part >> (PART_PRECISION / 2))
30
cf00a885 31struct op
b0699dad 32{
68e65275 33 const cpp_token *token; /* The token forming op (for diagnostics). */
ad28cff7 34 cpp_num value; /* The value logically "right" of op. */
cf00a885 35 enum cpp_ttype op;
7f2935c7 36};
7f2935c7 37
91318908
NB
38/* 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)
6cf87ca4
ZW
41static 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);
45
46static 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);
55static cpp_num num_div_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype);
56static cpp_num num_lshift (cpp_num, size_t, size_t);
57static cpp_num num_rshift (cpp_num, size_t, size_t);
58
59static cpp_num append_digit (cpp_num, int, int, size_t);
60static cpp_num parse_defined (cpp_reader *);
61static cpp_num eval_token (cpp_reader *, const cpp_token *);
62static struct op *reduce (cpp_reader *, struct op *, enum cpp_ttype);
63static unsigned int interpret_float_suffix (const uchar *, size_t);
64static unsigned int interpret_int_suffix (const uchar *, size_t);
65static void check_promotion (cpp_reader *, const struct op *);
91318908 66
cd7ab83f 67/* Token type abuse to create unary plus and minus operators. */
c3f829c1
GDR
68#define CPP_UPLUS ((enum cpp_ttype) (CPP_LAST_CPP_OP + 1))
69#define CPP_UMINUS ((enum cpp_ttype) (CPP_LAST_CPP_OP + 2))
cf00a885 70
15dad1d9
ZW
71/* With -O2, gcc appears to produce nice code, moving the error
72 message load and subsequent jump completely out of the main path. */
15dad1d9 73#define SYNTAX_ERROR(msgid) \
0527bc4e 74 do { cpp_error (pfile, CPP_DL_ERROR, msgid); goto syntax_error; } while(0)
15dad1d9 75#define SYNTAX_ERROR2(msgid, arg) \
0527bc4e
JDA
76 do { cpp_error (pfile, CPP_DL_ERROR, msgid, arg); goto syntax_error; } \
77 while(0)
15dad1d9 78
cd7ab83f
NB
79/* Subroutine of cpp_classify_number. S points to a float suffix of
80 length LEN, possibly zero. Returns 0 for an invalid suffix, or a
81 flag vector describing the suffix. */
82static unsigned int
6cf87ca4 83interpret_float_suffix (const uchar *s, size_t len)
cf00a885 84{
c77cd3d1 85 size_t f, l, w, q, i, d;
ac6b1c67 86 size_t r, k, u, h;
c77cd3d1
UB
87
88 f = l = w = q = i = d = 0;
ac6b1c67 89 r = k = u = h = 0;
cf00a885 90
cd7ab83f
NB
91 while (len--)
92 switch (s[len])
93 {
ac6b1c67
CF
94 case 'r': case 'R': r++; break;
95 case 'k': case 'K': k++; break;
96 case 'u': case 'U': u++; break;
97 case 'h': case 'H': h++; break;
30e04921
JJ
98 case 'f': case 'F':
99 if (d > 0)
100 return 0;
101 f++;
102 break;
103 case 'l': case 'L':
104 if (d > 0)
ad6ed77e 105 return 0;
30e04921 106 l++;
ac6b1c67
CF
107 /* If there are two Ls, they must be adjacent and the same case. */
108 if (l == 2 && s[len] != s[len + 1])
109 return 0;
ad6ed77e 110 break;
c77cd3d1
UB
111 case 'w': case 'W':
112 if (d > 0)
113 return 0;
114 w++;
115 break;
116 case 'q': case 'Q':
117 if (d > 0)
118 return 0;
119 q++;
120 break;
30e04921
JJ
121 case 'i': case 'I':
122 case 'j': case 'J': i++; break;
123 case 'd': case 'D': d++; break;
cd7ab83f
NB
124 default:
125 return 0;
126 }
cf00a885 127
ac6b1c67
CF
128 if (r + k > 1 || h > 1 || l > 2 || u > 1)
129 return 0;
130
131 if (r == 1)
132 {
133 if (f || i || d || w || q)
134 return 0;
135
136 return (CPP_N_FRACT
137 | (u ? CPP_N_UNSIGNED : 0)
138 | (h ? CPP_N_SMALL :
139 l == 2 ? CPP_N_LARGE :
140 l == 1 ? CPP_N_MEDIUM : 0));
141 }
142
143 if (k == 1)
144 {
145 if (f || i || d || w || q)
146 return 0;
147
148 return (CPP_N_ACCUM
149 | (u ? CPP_N_UNSIGNED : 0)
150 | (h ? CPP_N_SMALL :
151 l == 2 ? CPP_N_LARGE :
152 l == 1 ? CPP_N_MEDIUM : 0));
153 }
154
155 if (f + l + w + q > 1 || i > 1 || h + u > 0)
cd7ab83f 156 return 0;
7f2935c7 157
ad6ed77e
JG
158 /* Allow dd, df, dl suffixes for decimal float constants. */
159 if (d && ((d + f + l != 2) || i))
160 return 0;
161
cd7ab83f
NB
162 return ((i ? CPP_N_IMAGINARY : 0)
163 | (f ? CPP_N_SMALL :
c77cd3d1
UB
164 l ? CPP_N_LARGE :
165 w ? CPP_N_MD_W :
166 q ? CPP_N_MD_Q : CPP_N_MEDIUM)
ad6ed77e 167 | (d ? CPP_N_DFLOAT : 0));
cd7ab83f
NB
168}
169
170/* Subroutine of cpp_classify_number. S points to an integer suffix
171 of length LEN, possibly zero. Returns 0 for an invalid suffix, or a
172 flag vector describing the suffix. */
173static unsigned int
6cf87ca4 174interpret_int_suffix (const uchar *s, size_t len)
cd7ab83f
NB
175{
176 size_t u, l, i;
177
178 u = l = i = 0;
179
180 while (len--)
181 switch (s[len])
182 {
183 case 'u': case 'U': u++; break;
184 case 'i': case 'I':
185 case 'j': case 'J': i++; break;
186 case 'l': case 'L': l++;
187 /* If there are two Ls, they must be adjacent and the same case. */
188 if (l == 2 && s[len] != s[len + 1])
189 return 0;
190 break;
191 default:
192 return 0;
193 }
194
195 if (l > 2 || u > 1 || i > 1)
196 return 0;
197
198 return ((i ? CPP_N_IMAGINARY : 0)
199 | (u ? CPP_N_UNSIGNED : 0)
200 | ((l == 0) ? CPP_N_SMALL
201 : (l == 1) ? CPP_N_MEDIUM : CPP_N_LARGE));
202}
203
204/* Categorize numeric constants according to their field (integer,
205 floating point, or invalid), radix (decimal, octal, hexadecimal),
206 and type suffixes. */
207unsigned int
6cf87ca4 208cpp_classify_number (cpp_reader *pfile, const cpp_token *token)
cd7ab83f
NB
209{
210 const uchar *str = token->val.str.text;
211 const uchar *limit;
212 unsigned int max_digit, result, radix;
213 enum {NOT_FLOAT = 0, AFTER_POINT, AFTER_EXPON} float_flag;
214
215 /* If the lexer has done its job, length one can only be a single
216 digit. Fast-path this very common case. */
217 if (token->val.str.len == 1)
218 return CPP_N_INTEGER | CPP_N_SMALL | CPP_N_DECIMAL;
219
220 limit = str + token->val.str.len;
221 float_flag = NOT_FLOAT;
222 max_digit = 0;
223 radix = 10;
224
225 /* First, interpret the radix. */
226 if (*str == '0')
227 {
228 radix = 8;
229 str++;
230
231 /* Require at least one hex digit to classify it as hex. */
7f1fc38e
MM
232 if ((*str == 'x' || *str == 'X')
233 && (str[1] == '.' || ISXDIGIT (str[1])))
cd7ab83f
NB
234 {
235 radix = 16;
236 str++;
237 }
f7fd775f
JW
238 else if ((*str == 'b' || *str == 'B') && (str[1] == '0' || str[1] == '1'))
239 {
240 radix = 2;
241 str++;
242 }
cd7ab83f
NB
243 }
244
245 /* Now scan for a well-formed integer or float. */
246 for (;;)
247 {
248 unsigned int c = *str++;
249
250 if (ISDIGIT (c) || (ISXDIGIT (c) && radix == 16))
251 {
252 c = hex_value (c);
253 if (c > max_digit)
254 max_digit = c;
255 }
256 else if (c == '.')
257 {
258 if (float_flag == NOT_FLOAT)
259 float_flag = AFTER_POINT;
260 else
261 SYNTAX_ERROR ("too many decimal points in number");
262 }
263 else if ((radix <= 10 && (c == 'e' || c == 'E'))
264 || (radix == 16 && (c == 'p' || c == 'P')))
265 {
266 float_flag = AFTER_EXPON;
267 break;
268 }
269 else
270 {
271 /* Start of suffix. */
272 str--;
273 break;
274 }
275 }
276
ac6b1c67
CF
277 /* The suffix may be for decimal fixed-point constants without exponent. */
278 if (radix != 16 && float_flag == NOT_FLOAT)
279 {
280 result = interpret_float_suffix (str, limit - str);
281 if ((result & CPP_N_FRACT) || (result & CPP_N_ACCUM))
282 {
283 result |= CPP_N_FLOATING;
284 /* We need to restore the radix to 10, if the radix is 8. */
285 if (radix == 8)
286 radix = 10;
287
288 if (CPP_PEDANTIC (pfile))
289 cpp_error (pfile, CPP_DL_PEDWARN,
290 "fixed-point constants are a GCC extension");
291 goto syntax_ok;
292 }
293 else
294 result = 0;
295 }
296
cd7ab83f
NB
297 if (float_flag != NOT_FLOAT && radix == 8)
298 radix = 10;
299
300 if (max_digit >= radix)
f7fd775f
JW
301 {
302 if (radix == 2)
303 SYNTAX_ERROR2 ("invalid digit \"%c\" in binary constant", '0' + max_digit);
304 else
305 SYNTAX_ERROR2 ("invalid digit \"%c\" in octal constant", '0' + max_digit);
306 }
cd7ab83f
NB
307
308 if (float_flag != NOT_FLOAT)
309 {
f7fd775f
JW
310 if (radix == 2)
311 {
312 cpp_error (pfile, CPP_DL_ERROR,
313 "invalid prefix \"0b\" for floating constant");
314 return CPP_N_INVALID;
315 }
316
cd7ab83f 317 if (radix == 16 && CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, c99))
0527bc4e 318 cpp_error (pfile, CPP_DL_PEDWARN,
cd7ab83f
NB
319 "use of C99 hexadecimal floating constant");
320
321 if (float_flag == AFTER_EXPON)
322 {
323 if (*str == '+' || *str == '-')
324 str++;
325
326 /* Exponent is decimal, even if string is a hex float. */
327 if (!ISDIGIT (*str))
328 SYNTAX_ERROR ("exponent has no digits");
329
330 do
331 str++;
332 while (ISDIGIT (*str));
333 }
334 else if (radix == 16)
335 SYNTAX_ERROR ("hexadecimal floating constants require an exponent");
336
337 result = interpret_float_suffix (str, limit - str);
338 if (result == 0)
339 {
0527bc4e 340 cpp_error (pfile, CPP_DL_ERROR,
cd7ab83f 341 "invalid suffix \"%.*s\" on floating constant",
91b12472 342 (int) (limit - str), str);
cd7ab83f
NB
343 return CPP_N_INVALID;
344 }
345
346 /* Traditional C didn't accept any floating suffixes. */
347 if (limit != str
348 && CPP_WTRADITIONAL (pfile)
349 && ! cpp_sys_macro_p (pfile))
0527bc4e 350 cpp_error (pfile, CPP_DL_WARNING,
cd7ab83f 351 "traditional C rejects the \"%.*s\" suffix",
91b12472 352 (int) (limit - str), str);
cd7ab83f 353
ad6ed77e
JG
354 /* Radix must be 10 for decimal floats. */
355 if ((result & CPP_N_DFLOAT) && radix != 10)
356 {
357 cpp_error (pfile, CPP_DL_ERROR,
358 "invalid suffix \"%.*s\" with hexadecimal floating constant",
359 (int) (limit - str), str);
360 return CPP_N_INVALID;
361 }
362
ac6b1c67
CF
363 if ((result & (CPP_N_FRACT | CPP_N_ACCUM)) && CPP_PEDANTIC (pfile))
364 cpp_error (pfile, CPP_DL_PEDWARN,
365 "fixed-point constants are a GCC extension");
366
5a6bb57e
JJ
367 if ((result & CPP_N_DFLOAT) && CPP_PEDANTIC (pfile))
368 cpp_error (pfile, CPP_DL_PEDWARN,
369 "decimal float constants are a GCC extension");
370
cd7ab83f
NB
371 result |= CPP_N_FLOATING;
372 }
373 else
374 {
375 result = interpret_int_suffix (str, limit - str);
376 if (result == 0)
377 {
0527bc4e 378 cpp_error (pfile, CPP_DL_ERROR,
cd7ab83f 379 "invalid suffix \"%.*s\" on integer constant",
91b12472 380 (int) (limit - str), str);
cd7ab83f
NB
381 return CPP_N_INVALID;
382 }
383
56da7207
ZW
384 /* Traditional C only accepted the 'L' suffix.
385 Suppress warning about 'LL' with -Wno-long-long. */
386 if (CPP_WTRADITIONAL (pfile) && ! cpp_sys_macro_p (pfile))
387 {
388 int u_or_i = (result & (CPP_N_UNSIGNED|CPP_N_IMAGINARY));
389 int large = (result & CPP_N_WIDTH) == CPP_N_LARGE;
390
391 if (u_or_i || (large && CPP_OPTION (pfile, warn_long_long)))
0527bc4e 392 cpp_error (pfile, CPP_DL_WARNING,
56da7207
ZW
393 "traditional C rejects the \"%.*s\" suffix",
394 (int) (limit - str), str);
395 }
cd7ab83f
NB
396
397 if ((result & CPP_N_WIDTH) == CPP_N_LARGE
398 && ! CPP_OPTION (pfile, c99)
399 && CPP_OPTION (pfile, warn_long_long))
0527bc4e
JDA
400 cpp_error (pfile, CPP_DL_PEDWARN,
401 "use of C99 long long integer constant");
cd7ab83f
NB
402
403 result |= CPP_N_INTEGER;
404 }
405
ac6b1c67 406 syntax_ok:
cd7ab83f 407 if ((result & CPP_N_IMAGINARY) && CPP_PEDANTIC (pfile))
0527bc4e
JDA
408 cpp_error (pfile, CPP_DL_PEDWARN,
409 "imaginary constants are a GCC extension");
f7fd775f
JW
410 if (radix == 2 && CPP_PEDANTIC (pfile))
411 cpp_error (pfile, CPP_DL_PEDWARN,
412 "binary constants are a GCC extension");
cd7ab83f
NB
413
414 if (radix == 10)
415 result |= CPP_N_DECIMAL;
416 else if (radix == 16)
417 result |= CPP_N_HEX;
f7fd775f
JW
418 else if (radix == 2)
419 result |= CPP_N_BINARY;
cd7ab83f
NB
420 else
421 result |= CPP_N_OCTAL;
422
423 return result;
424
425 syntax_error:
426 return CPP_N_INVALID;
427}
428
429/* cpp_interpret_integer converts an integer constant into a cpp_num,
430 of precision options->precision.
431
432 We do not provide any interface for decimal->float conversion,
6cf87ca4
ZW
433 because the preprocessor doesn't need it and we don't want to
434 drag in GCC's floating point emulator. */
cd7ab83f 435cpp_num
6cf87ca4
ZW
436cpp_interpret_integer (cpp_reader *pfile, const cpp_token *token,
437 unsigned int type)
cd7ab83f
NB
438{
439 const uchar *p, *end;
440 cpp_num result;
441
442 result.low = 0;
443 result.high = 0;
23ff0223
NB
444 result.unsignedp = !!(type & CPP_N_UNSIGNED);
445 result.overflow = false;
cd7ab83f
NB
446
447 p = token->val.str.text;
448 end = p + token->val.str.len;
449
450 /* Common case of a single digit. */
451 if (token->val.str.len == 1)
452 result.low = p[0] - '0';
453 else
454 {
455 cpp_num_part max;
456 size_t precision = CPP_OPTION (pfile, precision);
457 unsigned int base = 10, c = 0;
458 bool overflow = false;
459
460 if ((type & CPP_N_RADIX) == CPP_N_OCTAL)
461 {
462 base = 8;
463 p++;
464 }
465 else if ((type & CPP_N_RADIX) == CPP_N_HEX)
466 {
467 base = 16;
468 p += 2;
469 }
f7fd775f
JW
470 else if ((type & CPP_N_RADIX) == CPP_N_BINARY)
471 {
472 base = 2;
473 p += 2;
474 }
cd7ab83f
NB
475
476 /* We can add a digit to numbers strictly less than this without
477 needing the precision and slowness of double integers. */
478 max = ~(cpp_num_part) 0;
479 if (precision < PART_PRECISION)
480 max >>= PART_PRECISION - precision;
481 max = (max - base + 1) / base + 1;
482
483 for (; p < end; p++)
484 {
485 c = *p;
486
487 if (ISDIGIT (c) || (base == 16 && ISXDIGIT (c)))
488 c = hex_value (c);
489 else
490 break;
491
492 /* Strict inequality for when max is set to zero. */
493 if (result.low < max)
494 result.low = result.low * base + c;
495 else
496 {
497 result = append_digit (result, c, base, precision);
498 overflow |= result.overflow;
499 max = 0;
500 }
501 }
502
503 if (overflow)
0527bc4e 504 cpp_error (pfile, CPP_DL_PEDWARN,
cd7ab83f 505 "integer constant is too large for its type");
017acb41
NB
506 /* If too big to be signed, consider it unsigned. Only warn for
507 decimal numbers. Traditional numbers were always signed (but
8d9afc4e 508 we still honor an explicit U suffix); but we only have
cd98faa1 509 traditional semantics in directives. */
017acb41 510 else if (!result.unsignedp
cd98faa1
NB
511 && !(CPP_OPTION (pfile, traditional)
512 && pfile->state.in_directive)
017acb41 513 && !num_positive (result, precision))
cd7ab83f 514 {
cd7ab83f 515 if (base == 10)
0527bc4e 516 cpp_error (pfile, CPP_DL_WARNING,
cd7ab83f 517 "integer constant is so large that it is unsigned");
23ff0223 518 result.unsignedp = true;
cd7ab83f
NB
519 }
520 }
521
522 return result;
523}
cf00a885 524
6cf87ca4 525/* Append DIGIT to NUM, a number of PRECISION bits being read in base BASE. */
91318908 526static cpp_num
6cf87ca4 527append_digit (cpp_num num, int digit, int base, size_t precision)
91318908
NB
528{
529 cpp_num result;
f7fd775f 530 unsigned int shift;
91318908
NB
531 bool overflow;
532 cpp_num_part add_high, add_low;
533
f7fd775f 534 /* Multiply by 2, 8 or 16. Catching this overflow here means we don't
91318908 535 need to worry about add_high overflowing. */
f7fd775f
JW
536 switch (base)
537 {
538 case 2:
539 shift = 1;
540 break;
541
542 case 16:
543 shift = 4;
544 break;
545
546 default:
547 shift = 3;
548 }
23ff0223 549 overflow = !!(num.high >> (PART_PRECISION - shift));
91318908
NB
550 result.high = num.high << shift;
551 result.low = num.low << shift;
552 result.high |= num.low >> (PART_PRECISION - shift);
6de9cd9a 553 result.unsignedp = num.unsignedp;
91318908
NB
554
555 if (base == 10)
556 {
557 add_low = num.low << 1;
558 add_high = (num.high << 1) + (num.low >> (PART_PRECISION - 1));
559 }
560 else
561 add_high = add_low = 0;
562
563 if (add_low + digit < add_low)
564 add_high++;
565 add_low += digit;
22a8a52d 566
91318908
NB
567 if (result.low + add_low < result.low)
568 add_high++;
569 if (result.high + add_high < result.high)
570 overflow = true;
571
572 result.low += add_low;
573 result.high += add_high;
6de9cd9a 574 result.overflow = overflow;
91318908
NB
575
576 /* The above code catches overflow of a cpp_num type. This catches
577 overflow of the (possibly shorter) target precision. */
578 num.low = result.low;
579 num.high = result.high;
580 result = num_trim (result, precision);
581 if (!num_eq (result, num))
6de9cd9a 582 result.overflow = true;
91318908 583
91318908
NB
584 return result;
585}
586
5d8ebbd8 587/* Handle meeting "defined" in a preprocessor expression. */
91318908 588static cpp_num
6cf87ca4 589parse_defined (cpp_reader *pfile)
ba412f14 590{
91318908 591 cpp_num result;
93c80368
NB
592 int paren = 0;
593 cpp_hashnode *node = 0;
4ed5bcfb 594 const cpp_token *token;
63d75005 595 cpp_context *initial_context = pfile->context;
ba412f14 596
93c80368
NB
597 /* Don't expand macros. */
598 pfile->state.prevent_expansion++;
599
4ed5bcfb
NB
600 token = cpp_get_token (pfile);
601 if (token->type == CPP_OPEN_PAREN)
ba412f14 602 {
cf00a885 603 paren = 1;
4ed5bcfb 604 token = cpp_get_token (pfile);
ba412f14
ZW
605 }
606
4ed5bcfb 607 if (token->type == CPP_NAME)
93c80368 608 {
4ed5bcfb
NB
609 node = token->val.node;
610 if (paren && cpp_get_token (pfile)->type != CPP_CLOSE_PAREN)
93c80368 611 {
0527bc4e 612 cpp_error (pfile, CPP_DL_ERROR, "missing ')' after \"defined\"");
4ed5bcfb 613 node = 0;
93c80368
NB
614 }
615 }
616 else
3c8465d0 617 {
0527bc4e 618 cpp_error (pfile, CPP_DL_ERROR,
ebef4e8c 619 "operator \"defined\" requires an identifier");
4ed5bcfb 620 if (token->flags & NAMED_OP)
3c8465d0
NB
621 {
622 cpp_token op;
623
624 op.flags = 0;
4ed5bcfb 625 op.type = token->type;
0527bc4e 626 cpp_error (pfile, CPP_DL_ERROR,
3c8465d0 627 "(\"%s\" is an alternative token for \"%s\" in C++)",
4ed5bcfb 628 cpp_token_as_text (pfile, token),
3c8465d0
NB
629 cpp_token_as_text (pfile, &op));
630 }
631 }
15dad1d9 632
91318908 633 if (node)
15dad1d9 634 {
335d03ec 635 if (pfile->context != initial_context && CPP_PEDANTIC (pfile))
0527bc4e 636 cpp_error (pfile, CPP_DL_WARNING,
ebef4e8c 637 "this use of \"defined\" may not be portable");
63d75005 638
a69cbaac 639 _cpp_mark_macro_used (node);
93d45d9e
JM
640 if (!(node->flags & NODE_USED))
641 {
642 node->flags |= NODE_USED;
643 if (node->type == NT_MACRO)
644 {
645 if (pfile->cb.used_define)
646 pfile->cb.used_define (pfile, pfile->directive_line, node);
647 }
648 else
649 {
650 if (pfile->cb.used_undef)
651 pfile->cb.used_undef (pfile, pfile->directive_line, node);
652 }
653 }
a69cbaac 654
6d18adbc
NB
655 /* A possible controlling macro of the form #if !defined ().
656 _cpp_parse_expr checks there was no other junk on the line. */
657 pfile->mi_ind_cmacro = node;
15dad1d9 658 }
93c80368
NB
659
660 pfile->state.prevent_expansion--;
91318908 661
23ff0223 662 result.unsignedp = false;
91318908 663 result.high = 0;
23ff0223 664 result.overflow = false;
91318908
NB
665 result.low = node && node->type == NT_MACRO;
666 return result;
15dad1d9
ZW
667}
668
60284a59
NB
669/* Convert a token into a CPP_NUMBER (an interpreted preprocessing
670 number or character constant, or the result of the "defined" or "#"
cd7ab83f 671 operators). */
91318908 672static cpp_num
6cf87ca4 673eval_token (cpp_reader *pfile, const cpp_token *token)
7f2935c7 674{
91318908 675 cpp_num result;
60284a59 676 unsigned int temp;
4268e8bb 677 int unsignedp = 0;
041c3194 678
6de9cd9a
DN
679 result.unsignedp = false;
680 result.overflow = false;
681
93c80368 682 switch (token->type)
ba412f14 683 {
7f2935c7 684 case CPP_NUMBER:
cd7ab83f
NB
685 temp = cpp_classify_number (pfile, token);
686 switch (temp & CPP_N_CATEGORY)
687 {
688 case CPP_N_FLOATING:
0527bc4e 689 cpp_error (pfile, CPP_DL_ERROR,
cd7ab83f
NB
690 "floating constant in preprocessor expression");
691 break;
692 case CPP_N_INTEGER:
693 if (!(temp & CPP_N_IMAGINARY))
694 return cpp_interpret_integer (pfile, token, temp);
0527bc4e 695 cpp_error (pfile, CPP_DL_ERROR,
cd7ab83f
NB
696 "imaginary number in preprocessor expression");
697 break;
698
699 case CPP_N_INVALID:
700 /* Error already issued. */
701 break;
702 }
703 result.high = result.low = 0;
704 break;
7f2f1a66 705
cf00a885 706 case CPP_WCHAR:
4268e8bb 707 case CPP_CHAR:
b6baa67d
KVH
708 case CPP_CHAR16:
709 case CPP_CHAR32:
a5a49440 710 {
91318908
NB
711 cppchar_t cc = cpp_interpret_charconst (pfile, token,
712 &temp, &unsignedp);
713
714 result.high = 0;
715 result.low = cc;
a5a49440 716 /* Sign-extend the result if necessary. */
91318908
NB
717 if (!unsignedp && (cppchar_signed_t) cc < 0)
718 {
719 if (PART_PRECISION > BITS_PER_CPPCHAR_T)
720 result.low |= ~(~(cpp_num_part) 0
721 >> (PART_PRECISION - BITS_PER_CPPCHAR_T));
722 result.high = ~(cpp_num_part) 0;
723 result = num_trim (result, CPP_OPTION (pfile, precision));
724 }
a5a49440 725 }
60284a59 726 break;
ba412f14 727
92936ecf 728 case CPP_NAME:
93c80368 729 if (token->val.node == pfile->spec_nodes.n_defined)
63d75005 730 return parse_defined (pfile);
7d4918a2
ZW
731 else if (CPP_OPTION (pfile, cplusplus)
732 && (token->val.node == pfile->spec_nodes.n_true
733 || token->val.node == pfile->spec_nodes.n_false))
734 {
91318908
NB
735 result.high = 0;
736 result.low = (token->val.node == pfile->spec_nodes.n_true);
7d4918a2
ZW
737 }
738 else
739 {
91318908
NB
740 result.high = 0;
741 result.low = 0;
87ed109f 742 if (CPP_OPTION (pfile, warn_undef) && !pfile->state.skip_eval)
0527bc4e 743 cpp_error (pfile, CPP_DL_WARNING, "\"%s\" is not defined",
ebef4e8c 744 NODE_NAME (token->val.node));
7f2935c7 745 }
60284a59 746 break;
7f2935c7 747
60284a59 748 default: /* CPP_HASH */
91318908
NB
749 _cpp_test_assertion (pfile, &temp);
750 result.high = 0;
751 result.low = temp;
93c80368 752 }
7c3bb1de 753
23ff0223 754 result.unsignedp = !!unsignedp;
91318908 755 return result;
7f2935c7
PB
756}
757\f
4063b943 758/* Operator precedence and flags table.
dbac4aff
NB
759
760After an operator is returned from the lexer, if it has priority less
87ed109f
NB
761than the operator on the top of the stack, we reduce the stack by one
762operator and repeat the test. Since equal priorities do not reduce,
763this is naturally right-associative.
764
765We handle left-associative operators by decrementing the priority of
766just-lexed operators by one, but retaining the priority of operators
767already on the stack.
dbac4aff
NB
768
769The remaining cases are '(' and ')'. We handle '(' by skipping the
770reduction phase completely. ')' is given lower priority than
771everything else, including '(', effectively forcing a reduction of the
272d0bee 772parenthesized expression. If there is a matching '(', the routine
87ed109f
NB
773reduce() exits immediately. If the normal exit route sees a ')', then
774there cannot have been a matching '(' and an error message is output.
4063b943 775
f8b954fc
NB
776The parser assumes all shifted operators require a left operand unless
777the flag NO_L_OPERAND is set. These semantics are automatic; any
778extra semantics need to be handled with operator-specific code. */
4063b943 779
68e65275
NB
780/* Flags. If CHECK_PROMOTION, we warn if the effective sign of an
781 operand changes because of integer promotions. */
87ed109f
NB
782#define NO_L_OPERAND (1 << 0)
783#define LEFT_ASSOC (1 << 1)
68e65275 784#define CHECK_PROMOTION (1 << 2)
eba30526 785
cf00a885
ZW
786/* Operator to priority map. Must be in the same order as the first
787 N entries of enum cpp_ttype. */
c3f829c1 788static const struct cpp_operator
87ed109f 789{
60284a59 790 uchar prio;
87ed109f
NB
791 uchar flags;
792} optab[] =
cf00a885 793{
ad28cff7
NB
794 /* EQ */ {0, 0}, /* Shouldn't happen. */
795 /* NOT */ {16, NO_L_OPERAND},
68e65275
NB
796 /* GREATER */ {12, LEFT_ASSOC | CHECK_PROMOTION},
797 /* LESS */ {12, LEFT_ASSOC | CHECK_PROMOTION},
798 /* PLUS */ {14, LEFT_ASSOC | CHECK_PROMOTION},
799 /* MINUS */ {14, LEFT_ASSOC | CHECK_PROMOTION},
800 /* MULT */ {15, LEFT_ASSOC | CHECK_PROMOTION},
801 /* DIV */ {15, LEFT_ASSOC | CHECK_PROMOTION},
802 /* MOD */ {15, LEFT_ASSOC | CHECK_PROMOTION},
803 /* AND */ {9, LEFT_ASSOC | CHECK_PROMOTION},
804 /* OR */ {7, LEFT_ASSOC | CHECK_PROMOTION},
805 /* XOR */ {8, LEFT_ASSOC | CHECK_PROMOTION},
ad28cff7
NB
806 /* RSHIFT */ {13, LEFT_ASSOC},
807 /* LSHIFT */ {13, LEFT_ASSOC},
808
ad28cff7 809 /* COMPL */ {16, NO_L_OPERAND},
75aef48a
NB
810 /* AND_AND */ {6, LEFT_ASSOC},
811 /* OR_OR */ {5, LEFT_ASSOC},
812 /* QUERY */ {3, 0},
68e65275 813 /* COLON */ {4, LEFT_ASSOC | CHECK_PROMOTION},
ad28cff7 814 /* COMMA */ {2, LEFT_ASSOC},
75aef48a 815 /* OPEN_PAREN */ {1, NO_L_OPERAND},
ad28cff7
NB
816 /* CLOSE_PAREN */ {0, 0},
817 /* EOF */ {0, 0},
818 /* EQ_EQ */ {11, LEFT_ASSOC},
819 /* NOT_EQ */ {11, LEFT_ASSOC},
68e65275
NB
820 /* GREATER_EQ */ {12, LEFT_ASSOC | CHECK_PROMOTION},
821 /* LESS_EQ */ {12, LEFT_ASSOC | CHECK_PROMOTION},
ad28cff7
NB
822 /* UPLUS */ {16, NO_L_OPERAND},
823 /* UMINUS */ {16, NO_L_OPERAND}
cf00a885
ZW
824};
825
7f2935c7 826/* Parse and evaluate a C expression, reading from PFILE.
df383483 827 Returns the truth value of the expression.
87ed109f
NB
828
829 The implementation is an operator precedence parser, i.e. a
830 bottom-up parser, using a stack for not-yet-reduced tokens.
831
832 The stack base is op_stack, and the current stack pointer is 'top'.
833 There is a stack element for each operator (only), and the most
834 recently pushed operator is 'top->op'. An operand (value) is
835 stored in the 'value' field of the stack element of the operator
836 that precedes it. */
837bool
6cf87ca4 838_cpp_parse_expr (cpp_reader *pfile)
7f2935c7 839{
87ed109f
NB
840 struct op *top = pfile->op_stack;
841 unsigned int lex_count;
842 bool saw_leading_not, want_value = true;
843
844 pfile->state.skip_eval = 0;
7f2935c7 845
93c80368 846 /* Set up detection of #if ! defined(). */
6d18adbc 847 pfile->mi_ind_cmacro = 0;
87ed109f 848 saw_leading_not = false;
6d18adbc 849 lex_count = 0;
93c80368 850
87ed109f 851 /* Lowest priority operator prevents further reductions. */
cf00a885 852 top->op = CPP_EOF;
4063b943 853
7f2935c7
PB
854 for (;;)
855 {
cf00a885 856 struct op op;
7f2935c7 857
6d18adbc 858 lex_count++;
68e65275
NB
859 op.token = cpp_get_token (pfile);
860 op.op = op.token->type;
7f2935c7 861
7f2935c7
PB
862 switch (op.op)
863 {
60284a59 864 /* These tokens convert into values. */
c60e94a7 865 case CPP_NUMBER:
60284a59
NB
866 case CPP_CHAR:
867 case CPP_WCHAR:
b6baa67d
KVH
868 case CPP_CHAR16:
869 case CPP_CHAR32:
60284a59
NB
870 case CPP_NAME:
871 case CPP_HASH:
f8b954fc 872 if (!want_value)
60284a59 873 SYNTAX_ERROR2 ("missing binary operator before token \"%s\"",
68e65275 874 cpp_token_as_text (pfile, op.token));
f8b954fc 875 want_value = false;
68e65275 876 top->value = eval_token (pfile, op.token);
9ee70313
NB
877 continue;
878
6d18adbc
NB
879 case CPP_NOT:
880 saw_leading_not = lex_count == 1;
6d18adbc 881 break;
cf00a885 882 case CPP_PLUS:
f8b954fc
NB
883 if (want_value)
884 op.op = CPP_UPLUS;
885 break;
886 case CPP_MINUS:
887 if (want_value)
888 op.op = CPP_UMINUS;
889 break;
60284a59 890
f8b954fc 891 default:
60284a59 892 if ((int) op.op <= (int) CPP_EQ || (int) op.op >= (int) CPP_PLUS_EQ)
cd7ab83f 893 SYNTAX_ERROR2 ("token \"%s\" is not valid in preprocessor expressions",
68e65275 894 cpp_token_as_text (pfile, op.token));
f8b954fc 895 break;
7f2935c7 896 }
7f2935c7 897
87ed109f
NB
898 /* Check we have a value or operator as appropriate. */
899 if (optab[op.op].flags & NO_L_OPERAND)
7f2935c7 900 {
87ed109f 901 if (!want_value)
60284a59 902 SYNTAX_ERROR2 ("missing binary operator before token \"%s\"",
68e65275 903 cpp_token_as_text (pfile, op.token));
87ed109f
NB
904 }
905 else if (want_value)
906 {
a09d4744
NB
907 /* We want a number (or expression) and haven't got one.
908 Try to emit a specific diagnostic. */
909 if (op.op == CPP_CLOSE_PAREN && top->op == CPP_OPEN_PAREN)
910 SYNTAX_ERROR ("missing expression between '(' and ')'");
911
912 if (op.op == CPP_EOF && top->op == CPP_EOF)
913 SYNTAX_ERROR ("#if with no expression");
914
915 if (top->op != CPP_EOF && top->op != CPP_OPEN_PAREN)
916 SYNTAX_ERROR2 ("operator '%s' has no right operand",
917 cpp_token_as_text (pfile, top->token));
918 else if (op.op == CPP_CLOSE_PAREN || op.op == CPP_EOF)
919 /* Complain about missing paren during reduction. */;
920 else
921 SYNTAX_ERROR2 ("operator '%s' has no left operand",
922 cpp_token_as_text (pfile, op.token));
7f2935c7 923 }
9ee70313 924
87ed109f
NB
925 top = reduce (pfile, top, op.op);
926 if (!top)
927 goto syntax_error;
9ee70313 928
60284a59
NB
929 if (op.op == CPP_EOF)
930 break;
931
87ed109f 932 switch (op.op)
b22ef131 933 {
87ed109f
NB
934 case CPP_CLOSE_PAREN:
935 continue;
87ed109f 936 case CPP_OR_OR:
91318908 937 if (!num_zerop (top->value))
87ed109f
NB
938 pfile->state.skip_eval++;
939 break;
940 case CPP_AND_AND:
941 case CPP_QUERY:
91318908 942 if (num_zerop (top->value))
87ed109f
NB
943 pfile->state.skip_eval++;
944 break;
945 case CPP_COLON:
60284a59
NB
946 if (top->op != CPP_QUERY)
947 SYNTAX_ERROR (" ':' without preceding '?'");
91318908 948 if (!num_zerop (top[-1].value)) /* Was '?' condition true? */
87ed109f
NB
949 pfile->state.skip_eval++;
950 else
951 pfile->state.skip_eval--;
952 default:
953 break;
4063b943 954 }
87ed109f 955
f8b954fc 956 want_value = true;
4063b943 957
0f41302f 958 /* Check for and handle stack overflow. */
87ed109f
NB
959 if (++top == pfile->op_limit)
960 top = _cpp_expand_op_stack (pfile);
df383483 961
7f2935c7 962 top->op = op.op;
68e65275 963 top->token = op.token;
7f2935c7 964 }
9ee70313 965
6d18adbc
NB
966 /* The controlling macro expression is only valid if we called lex 3
967 times: <!> <defined expression> and <EOF>. push_conditional ()
968 checks that we are at top-of-file. */
969 if (pfile->mi_ind_cmacro && !(saw_leading_not && lex_count == 3))
970 pfile->mi_ind_cmacro = 0;
971
87ed109f 972 if (top != pfile->op_stack)
ebef4e8c 973 {
0527bc4e 974 cpp_error (pfile, CPP_DL_ICE, "unbalanced stack in #if");
4063b943 975 syntax_error:
87ed109f 976 return false; /* Return false on syntax error. */
4063b943 977 }
9ee70313 978
91318908 979 return !num_zerop (top->value);
87ed109f
NB
980}
981
982/* Reduce the operator / value stack if possible, in preparation for
983 pushing operator OP. Returns NULL on error, otherwise the top of
984 the stack. */
985static struct op *
6cf87ca4 986reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op)
87ed109f
NB
987{
988 unsigned int prio;
989
91318908
NB
990 if (top->op <= CPP_EQ || top->op > CPP_LAST_CPP_OP + 2)
991 {
992 bad_op:
0527bc4e 993 cpp_error (pfile, CPP_DL_ICE, "impossible operator '%u'", top->op);
91318908
NB
994 return 0;
995 }
996
87ed109f
NB
997 if (op == CPP_OPEN_PAREN)
998 return top;
999
1000 /* Decrement the priority of left-associative operators to force a
1001 reduction with operators of otherwise equal priority. */
1002 prio = optab[op].prio - ((optab[op].flags & LEFT_ASSOC) != 0);
1003 while (prio < optab[top->op].prio)
1004 {
68e65275
NB
1005 if (CPP_OPTION (pfile, warn_num_sign_change)
1006 && optab[top->op].flags & CHECK_PROMOTION)
1007 check_promotion (pfile, top);
1008
75aef48a
NB
1009 switch (top->op)
1010 {
1011 case CPP_UPLUS:
1012 case CPP_UMINUS:
1013 case CPP_NOT:
1014 case CPP_COMPL:
1015 top[-1].value = num_unary_op (pfile, top->value, top->op);
1016 break;
87ed109f 1017
75aef48a
NB
1018 case CPP_PLUS:
1019 case CPP_MINUS:
1020 case CPP_RSHIFT:
1021 case CPP_LSHIFT:
75aef48a
NB
1022 case CPP_COMMA:
1023 top[-1].value = num_binary_op (pfile, top[-1].value,
1024 top->value, top->op);
1025 break;
91318908 1026
75aef48a
NB
1027 case CPP_GREATER:
1028 case CPP_LESS:
1029 case CPP_GREATER_EQ:
1030 case CPP_LESS_EQ:
1031 top[-1].value
1032 = num_inequality_op (pfile, top[-1].value, top->value, top->op);
1033 break;
91318908 1034
75aef48a
NB
1035 case CPP_EQ_EQ:
1036 case CPP_NOT_EQ:
1037 top[-1].value
1038 = num_equality_op (pfile, top[-1].value, top->value, top->op);
1039 break;
87ed109f 1040
75aef48a
NB
1041 case CPP_AND:
1042 case CPP_OR:
1043 case CPP_XOR:
1044 top[-1].value
1045 = num_bitwise_op (pfile, top[-1].value, top->value, top->op);
1046 break;
91318908 1047
75aef48a
NB
1048 case CPP_MULT:
1049 top[-1].value = num_mul (pfile, top[-1].value, top->value);
1050 break;
ad28cff7 1051
75aef48a
NB
1052 case CPP_DIV:
1053 case CPP_MOD:
1054 top[-1].value = num_div_op (pfile, top[-1].value,
1055 top->value, top->op);
1056 break;
ad28cff7 1057
75aef48a
NB
1058 case CPP_OR_OR:
1059 top--;
1060 if (!num_zerop (top->value))
1061 pfile->state.skip_eval--;
1062 top->value.low = (!num_zerop (top->value)
1063 || !num_zerop (top[1].value));
1064 top->value.high = 0;
1065 top->value.unsignedp = false;
1066 top->value.overflow = false;
1067 continue;
1068
1069 case CPP_AND_AND:
1070 top--;
1071 if (num_zerop (top->value))
1072 pfile->state.skip_eval--;
1073 top->value.low = (!num_zerop (top->value)
1074 && !num_zerop (top[1].value));
1075 top->value.high = 0;
1076 top->value.unsignedp = false;
1077 top->value.overflow = false;
1078 continue;
1079
1080 case CPP_OPEN_PAREN:
1081 if (op != CPP_CLOSE_PAREN)
1082 {
0527bc4e 1083 cpp_error (pfile, CPP_DL_ERROR, "missing ')' in expression");
75aef48a
NB
1084 return 0;
1085 }
1086 top--;
1087 top->value = top[1].value;
1088 return top;
1089
1090 case CPP_COLON:
1091 top -= 2;
1092 if (!num_zerop (top->value))
1093 {
ad28cff7 1094 pfile->state.skip_eval--;
75aef48a
NB
1095 top->value = top[1].value;
1096 }
1097 else
1098 top->value = top[2].value;
1099 top->value.unsignedp = (top[1].value.unsignedp
1100 || top[2].value.unsignedp);
1101 continue;
1102
1103 case CPP_QUERY:
0527bc4e 1104 cpp_error (pfile, CPP_DL_ERROR, "'?' without following ':'");
75aef48a
NB
1105 return 0;
1106
1107 default:
1108 goto bad_op;
1109 }
91318908 1110
ad28cff7 1111 top--;
91318908 1112 if (top->value.overflow && !pfile->state.skip_eval)
0527bc4e 1113 cpp_error (pfile, CPP_DL_PEDWARN,
91318908 1114 "integer overflow in preprocessor expression");
87ed109f
NB
1115 }
1116
1117 if (op == CPP_CLOSE_PAREN)
1118 {
0527bc4e 1119 cpp_error (pfile, CPP_DL_ERROR, "missing '(' in expression");
87ed109f
NB
1120 return 0;
1121 }
1122
1123 return top;
1124}
1125
1126/* Returns the position of the old top of stack after expansion. */
1127struct op *
6cf87ca4 1128_cpp_expand_op_stack (cpp_reader *pfile)
87ed109f 1129{
32fa4565
NB
1130 size_t old_size = (size_t) (pfile->op_limit - pfile->op_stack);
1131 size_t new_size = old_size * 2 + 20;
87ed109f 1132
c3f829c1 1133 pfile->op_stack = XRESIZEVEC (struct op, pfile->op_stack, new_size);
32fa4565 1134 pfile->op_limit = pfile->op_stack + new_size;
87ed109f 1135
32fa4565 1136 return pfile->op_stack + old_size;
7f2935c7 1137}
91318908 1138
68e65275
NB
1139/* Emits a warning if the effective sign of either operand of OP
1140 changes because of integer promotions. */
1141static void
6cf87ca4 1142check_promotion (cpp_reader *pfile, const struct op *op)
68e65275
NB
1143{
1144 if (op->value.unsignedp == op[-1].value.unsignedp)
1145 return;
1146
1147 if (op->value.unsignedp)
1148 {
1149 if (!num_positive (op[-1].value, CPP_OPTION (pfile, precision)))
0527bc4e 1150 cpp_error (pfile, CPP_DL_WARNING,
68e65275
NB
1151 "the left operand of \"%s\" changes sign when promoted",
1152 cpp_token_as_text (pfile, op->token));
1153 }
1154 else if (!num_positive (op->value, CPP_OPTION (pfile, precision)))
0527bc4e 1155 cpp_error (pfile, CPP_DL_WARNING,
68e65275
NB
1156 "the right operand of \"%s\" changes sign when promoted",
1157 cpp_token_as_text (pfile, op->token));
1158}
1159
91318908
NB
1160/* Clears the unused high order bits of the number pointed to by PNUM. */
1161static cpp_num
6cf87ca4 1162num_trim (cpp_num num, size_t precision)
91318908
NB
1163{
1164 if (precision > PART_PRECISION)
1165 {
1166 precision -= PART_PRECISION;
1167 if (precision < PART_PRECISION)
359b0bec 1168 num.high &= ((cpp_num_part) 1 << precision) - 1;
91318908
NB
1169 }
1170 else
1171 {
1172 if (precision < PART_PRECISION)
359b0bec 1173 num.low &= ((cpp_num_part) 1 << precision) - 1;
91318908
NB
1174 num.high = 0;
1175 }
1176
1177 return num;
1178}
1179
1180/* True iff A (presumed signed) >= 0. */
1181static bool
6cf87ca4 1182num_positive (cpp_num num, size_t precision)
91318908
NB
1183{
1184 if (precision > PART_PRECISION)
1185 {
1186 precision -= PART_PRECISION;
359b0bec 1187 return (num.high & (cpp_num_part) 1 << (precision - 1)) == 0;
91318908
NB
1188 }
1189
359b0bec 1190 return (num.low & (cpp_num_part) 1 << (precision - 1)) == 0;
91318908
NB
1191}
1192
ceeedfc1
NB
1193/* Sign extend a number, with PRECISION significant bits and all
1194 others assumed clear, to fill out a cpp_num structure. */
1195cpp_num
6cf87ca4 1196cpp_num_sign_extend (cpp_num num, size_t precision)
ceeedfc1
NB
1197{
1198 if (!num.unsignedp)
1199 {
1200 if (precision > PART_PRECISION)
1201 {
1202 precision -= PART_PRECISION;
1203 if (precision < PART_PRECISION
1204 && (num.high & (cpp_num_part) 1 << (precision - 1)))
1205 num.high |= ~(~(cpp_num_part) 0 >> (PART_PRECISION - precision));
1206 }
1207 else if (num.low & (cpp_num_part) 1 << (precision - 1))
1208 {
1209 if (precision < PART_PRECISION)
1210 num.low |= ~(~(cpp_num_part) 0 >> (PART_PRECISION - precision));
1211 num.high = ~(cpp_num_part) 0;
1212 }
1213 }
1214
1215 return num;
1216}
1217
91318908
NB
1218/* Returns the negative of NUM. */
1219static cpp_num
6cf87ca4 1220num_negate (cpp_num num, size_t precision)
91318908
NB
1221{
1222 cpp_num copy;
1223
1224 copy = num;
1225 num.high = ~num.high;
1226 num.low = ~num.low;
1227 if (++num.low == 0)
1228 num.high++;
1229 num = num_trim (num, precision);
1230 num.overflow = (!num.unsignedp && num_eq (num, copy) && !num_zerop (num));
1231
1232 return num;
1233}
1234
1235/* Returns true if A >= B. */
1236static bool
6cf87ca4 1237num_greater_eq (cpp_num pa, cpp_num pb, size_t precision)
91318908
NB
1238{
1239 bool unsignedp;
1240
1241 unsignedp = pa.unsignedp || pb.unsignedp;
1242
1243 if (!unsignedp)
1244 {
1245 /* Both numbers have signed type. If they are of different
1246 sign, the answer is the sign of A. */
1247 unsignedp = num_positive (pa, precision);
1248
1249 if (unsignedp != num_positive (pb, precision))
1250 return unsignedp;
1251
1252 /* Otherwise we can do an unsigned comparison. */
1253 }
1254
1255 return (pa.high > pb.high) || (pa.high == pb.high && pa.low >= pb.low);
1256}
1257
1258/* Returns LHS OP RHS, where OP is a bit-wise operation. */
1259static cpp_num
6cf87ca4
ZW
1260num_bitwise_op (cpp_reader *pfile ATTRIBUTE_UNUSED,
1261 cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
91318908
NB
1262{
1263 lhs.overflow = false;
1264 lhs.unsignedp = lhs.unsignedp || rhs.unsignedp;
1265
1266 /* As excess precision is zeroed, there is no need to num_trim () as
1267 these operations cannot introduce a set bit there. */
1268 if (op == CPP_AND)
1269 {
1270 lhs.low &= rhs.low;
1271 lhs.high &= rhs.high;
1272 }
1273 else if (op == CPP_OR)
1274 {
1275 lhs.low |= rhs.low;
1276 lhs.high |= rhs.high;
1277 }
1278 else
1279 {
1280 lhs.low ^= rhs.low;
1281 lhs.high ^= rhs.high;
1282 }
1283
1284 return lhs;
1285}
1286
1287/* Returns LHS OP RHS, where OP is an inequality. */
1288static cpp_num
6cf87ca4
ZW
1289num_inequality_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs,
1290 enum cpp_ttype op)
91318908
NB
1291{
1292 bool gte = num_greater_eq (lhs, rhs, CPP_OPTION (pfile, precision));
1293
1294 if (op == CPP_GREATER_EQ)
1295 lhs.low = gte;
1296 else if (op == CPP_LESS)
1297 lhs.low = !gte;
1298 else if (op == CPP_GREATER)
1299 lhs.low = gte && !num_eq (lhs, rhs);
1300 else /* CPP_LESS_EQ. */
1301 lhs.low = !gte || num_eq (lhs, rhs);
1302
1303 lhs.high = 0;
1304 lhs.overflow = false;
1305 lhs.unsignedp = false;
1306 return lhs;
1307}
1308
1309/* Returns LHS OP RHS, where OP is == or !=. */
1310static cpp_num
6cf87ca4
ZW
1311num_equality_op (cpp_reader *pfile ATTRIBUTE_UNUSED,
1312 cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
91318908 1313{
97459791
JM
1314 /* Work around a 3.0.4 bug; see PR 6950. */
1315 bool eq = num_eq (lhs, rhs);
91318908 1316 if (op == CPP_NOT_EQ)
97459791
JM
1317 eq = !eq;
1318 lhs.low = eq;
91318908
NB
1319 lhs.high = 0;
1320 lhs.overflow = false;
1321 lhs.unsignedp = false;
1322 return lhs;
1323}
1324
1325/* Shift NUM, of width PRECISION, right by N bits. */
1326static cpp_num
6cf87ca4 1327num_rshift (cpp_num num, size_t precision, size_t n)
91318908
NB
1328{
1329 cpp_num_part sign_mask;
6de9cd9a 1330 bool x = num_positive (num, precision);
91318908 1331
6de9cd9a 1332 if (num.unsignedp || x)
91318908
NB
1333 sign_mask = 0;
1334 else
1335 sign_mask = ~(cpp_num_part) 0;
1336
1337 if (n >= precision)
1338 num.high = num.low = sign_mask;
1339 else
1340 {
1341 /* Sign-extend. */
1342 if (precision < PART_PRECISION)
1343 num.high = sign_mask, num.low |= sign_mask << precision;
1344 else if (precision < 2 * PART_PRECISION)
1345 num.high |= sign_mask << (precision - PART_PRECISION);
1346
1347 if (n >= PART_PRECISION)
1348 {
1349 n -= PART_PRECISION;
1350 num.low = num.high;
1351 num.high = sign_mask;
1352 }
1353
1354 if (n)
1355 {
1356 num.low = (num.low >> n) | (num.high << (PART_PRECISION - n));
1357 num.high = (num.high >> n) | (sign_mask << (PART_PRECISION - n));
1358 }
1359 }
1360
1361 num = num_trim (num, precision);
1362 num.overflow = false;
1363 return num;
1364}
1365
1366/* Shift NUM, of width PRECISION, left by N bits. */
1367static cpp_num
6cf87ca4 1368num_lshift (cpp_num num, size_t precision, size_t n)
91318908
NB
1369{
1370 if (n >= precision)
1371 {
1372 num.overflow = !num.unsignedp && !num_zerop (num);
1373 num.high = num.low = 0;
1374 }
1375 else
1376 {
1377 cpp_num orig, maybe_orig;
1378 size_t m = n;
1379
1380 orig = num;
1381 if (m >= PART_PRECISION)
1382 {
1383 m -= PART_PRECISION;
1384 num.high = num.low;
1385 num.low = 0;
1386 }
1387 if (m)
1388 {
1389 num.high = (num.high << m) | (num.low >> (PART_PRECISION - m));
1390 num.low <<= m;
1391 }
1392 num = num_trim (num, precision);
1393
1394 if (num.unsignedp)
1395 num.overflow = false;
1396 else
1397 {
1398 maybe_orig = num_rshift (num, precision, n);
1399 num.overflow = !num_eq (orig, maybe_orig);
1400 }
1401 }
1402
1403 return num;
1404}
1405
1406/* The four unary operators: +, -, ! and ~. */
1407static cpp_num
6cf87ca4 1408num_unary_op (cpp_reader *pfile, cpp_num num, enum cpp_ttype op)
91318908
NB
1409{
1410 switch (op)
1411 {
1412 case CPP_UPLUS:
75aef48a 1413 if (CPP_WTRADITIONAL (pfile) && !pfile->state.skip_eval)
0527bc4e 1414 cpp_error (pfile, CPP_DL_WARNING,
91318908
NB
1415 "traditional C rejects the unary plus operator");
1416 num.overflow = false;
1417 break;
1418
1419 case CPP_UMINUS:
1420 num = num_negate (num, CPP_OPTION (pfile, precision));
1421 break;
1422
1423 case CPP_COMPL:
1424 num.high = ~num.high;
1425 num.low = ~num.low;
1426 num = num_trim (num, CPP_OPTION (pfile, precision));
1427 num.overflow = false;
1428 break;
1429
1430 default: /* case CPP_NOT: */
1431 num.low = num_zerop (num);
1432 num.high = 0;
1433 num.overflow = false;
1434 num.unsignedp = false;
1435 break;
1436 }
1437
1438 return num;
1439}
1440
1441/* The various binary operators. */
1442static cpp_num
6cf87ca4 1443num_binary_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
91318908
NB
1444{
1445 cpp_num result;
1446 size_t precision = CPP_OPTION (pfile, precision);
91318908
NB
1447 size_t n;
1448
1449 switch (op)
1450 {
1451 /* Shifts. */
1452 case CPP_LSHIFT:
1453 case CPP_RSHIFT:
1454 if (!rhs.unsignedp && !num_positive (rhs, precision))
1455 {
1456 /* A negative shift is a positive shift the other way. */
1457 if (op == CPP_LSHIFT)
1458 op = CPP_RSHIFT;
1459 else
1460 op = CPP_LSHIFT;
1461 rhs = num_negate (rhs, precision);
1462 }
1463 if (rhs.high)
1464 n = ~0; /* Maximal. */
1465 else
1466 n = rhs.low;
1467 if (op == CPP_LSHIFT)
1468 lhs = num_lshift (lhs, precision, n);
1469 else
1470 lhs = num_rshift (lhs, precision, n);
1471 break;
1472
91318908
NB
1473 /* Arithmetic. */
1474 case CPP_MINUS:
1475 rhs = num_negate (rhs, precision);
1476 case CPP_PLUS:
1477 result.low = lhs.low + rhs.low;
1478 result.high = lhs.high + rhs.high;
1479 if (result.low < lhs.low)
1480 result.high++;
6de9cd9a
DN
1481 result.unsignedp = lhs.unsignedp || rhs.unsignedp;
1482 result.overflow = false;
91318908
NB
1483
1484 result = num_trim (result, precision);
6de9cd9a 1485 if (!result.unsignedp)
91318908
NB
1486 {
1487 bool lhsp = num_positive (lhs, precision);
1488 result.overflow = (lhsp == num_positive (rhs, precision)
1489 && lhsp != num_positive (result, precision));
1490 }
1491 return result;
1492
1493 /* Comma. */
1494 default: /* case CPP_COMMA: */
32e8aa9a
JM
1495 if (CPP_PEDANTIC (pfile) && (!CPP_OPTION (pfile, c99)
1496 || !pfile->state.skip_eval))
0527bc4e 1497 cpp_error (pfile, CPP_DL_PEDWARN,
91318908
NB
1498 "comma operator in operand of #if");
1499 lhs = rhs;
1500 break;
1501 }
1502
1503 return lhs;
1504}
1505
1506/* Multiplies two unsigned cpp_num_parts to give a cpp_num. This
1507 cannot overflow. */
1508static cpp_num
6cf87ca4 1509num_part_mul (cpp_num_part lhs, cpp_num_part rhs)
91318908
NB
1510{
1511 cpp_num result;
1512 cpp_num_part middle[2], temp;
1513
1514 result.low = LOW_PART (lhs) * LOW_PART (rhs);
1515 result.high = HIGH_PART (lhs) * HIGH_PART (rhs);
1516
1517 middle[0] = LOW_PART (lhs) * HIGH_PART (rhs);
1518 middle[1] = HIGH_PART (lhs) * LOW_PART (rhs);
1519
1520 temp = result.low;
1521 result.low += LOW_PART (middle[0]) << (PART_PRECISION / 2);
1522 if (result.low < temp)
1523 result.high++;
1524
1525 temp = result.low;
1526 result.low += LOW_PART (middle[1]) << (PART_PRECISION / 2);
1527 if (result.low < temp)
1528 result.high++;
1529
1530 result.high += HIGH_PART (middle[0]);
1531 result.high += HIGH_PART (middle[1]);
6de9cd9a
DN
1532 result.unsignedp = true;
1533 result.overflow = false;
91318908
NB
1534
1535 return result;
1536}
1537
1538/* Multiply two preprocessing numbers. */
1539static cpp_num
6cf87ca4 1540num_mul (cpp_reader *pfile, cpp_num lhs, cpp_num rhs)
91318908
NB
1541{
1542 cpp_num result, temp;
1543 bool unsignedp = lhs.unsignedp || rhs.unsignedp;
1544 bool overflow, negate = false;
1545 size_t precision = CPP_OPTION (pfile, precision);
1546
1547 /* Prepare for unsigned multiplication. */
1548 if (!unsignedp)
1549 {
1550 if (!num_positive (lhs, precision))
1551 negate = !negate, lhs = num_negate (lhs, precision);
1552 if (!num_positive (rhs, precision))
1553 negate = !negate, rhs = num_negate (rhs, precision);
1554 }
1555
1556 overflow = lhs.high && rhs.high;
1557 result = num_part_mul (lhs.low, rhs.low);
1558
1559 temp = num_part_mul (lhs.high, rhs.low);
1560 result.high += temp.low;
1561 if (temp.high)
1562 overflow = true;
1563
1564 temp = num_part_mul (lhs.low, rhs.high);
1565 result.high += temp.low;
1566 if (temp.high)
1567 overflow = true;
1568
1569 temp.low = result.low, temp.high = result.high;
1570 result = num_trim (result, precision);
1571 if (!num_eq (result, temp))
1572 overflow = true;
1573
1574 if (negate)
1575 result = num_negate (result, precision);
1576
1577 if (unsignedp)
1578 result.overflow = false;
1579 else
1580 result.overflow = overflow || (num_positive (result, precision) ^ !negate
1581 && !num_zerop (result));
1582 result.unsignedp = unsignedp;
1583
1584 return result;
1585}
1586
1587/* Divide two preprocessing numbers, returning the answer or the
1588 remainder depending upon OP. */
1589static cpp_num
6cf87ca4 1590num_div_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
91318908
NB
1591{
1592 cpp_num result, sub;
1593 cpp_num_part mask;
1594 bool unsignedp = lhs.unsignedp || rhs.unsignedp;
1595 bool negate = false, lhs_neg = false;
1596 size_t i, precision = CPP_OPTION (pfile, precision);
1597
1598 /* Prepare for unsigned division. */
1599 if (!unsignedp)
1600 {
1601 if (!num_positive (lhs, precision))
1602 negate = !negate, lhs_neg = true, lhs = num_negate (lhs, precision);
1603 if (!num_positive (rhs, precision))
1604 negate = !negate, rhs = num_negate (rhs, precision);
1605 }
1606
1607 /* Find the high bit. */
1608 if (rhs.high)
1609 {
1610 i = precision - 1;
359b0bec 1611 mask = (cpp_num_part) 1 << (i - PART_PRECISION);
91318908
NB
1612 for (; ; i--, mask >>= 1)
1613 if (rhs.high & mask)
1614 break;
1615 }
1616 else if (rhs.low)
1617 {
1618 if (precision > PART_PRECISION)
1619 i = precision - PART_PRECISION - 1;
1620 else
1621 i = precision - 1;
359b0bec 1622 mask = (cpp_num_part) 1 << i;
91318908
NB
1623 for (; ; i--, mask >>= 1)
1624 if (rhs.low & mask)
1625 break;
1626 }
1627 else
1628 {
75aef48a 1629 if (!pfile->state.skip_eval)
0527bc4e 1630 cpp_error (pfile, CPP_DL_ERROR, "division by zero in #if");
91318908
NB
1631 return lhs;
1632 }
1633
da7d8304 1634 /* First nonzero bit of RHS is bit I. Do naive division by
91318908
NB
1635 shifting the RHS fully left, and subtracting from LHS if LHS is
1636 at least as big, and then repeating but with one less shift.
1637 This is not very efficient, but is easy to understand. */
1638
1639 rhs.unsignedp = true;
1640 lhs.unsignedp = true;
1641 i = precision - i - 1;
1642 sub = num_lshift (rhs, precision, i);
1643
1644 result.high = result.low = 0;
1645 for (;;)
1646 {
1647 if (num_greater_eq (lhs, sub, precision))
1648 {
1649 lhs = num_binary_op (pfile, lhs, sub, CPP_MINUS);
1650 if (i >= PART_PRECISION)
359b0bec 1651 result.high |= (cpp_num_part) 1 << (i - PART_PRECISION);
91318908 1652 else
359b0bec 1653 result.low |= (cpp_num_part) 1 << i;
91318908
NB
1654 }
1655 if (i-- == 0)
1656 break;
1657 sub.low = (sub.low >> 1) | (sub.high << (PART_PRECISION - 1));
1658 sub.high >>= 1;
1659 }
1660
1661 /* We divide so that the remainder has the sign of the LHS. */
1662 if (op == CPP_DIV)
1663 {
1664 result.unsignedp = unsignedp;
6de9cd9a
DN
1665 result.overflow = false;
1666 if (!unsignedp)
91318908
NB
1667 {
1668 if (negate)
1669 result = num_negate (result, precision);
22a8a52d
EC
1670 result.overflow = (num_positive (result, precision) ^ !negate
1671 && !num_zerop (result));
91318908
NB
1672 }
1673
1674 return result;
1675 }
1676
1677 /* CPP_MOD. */
1678 lhs.unsignedp = unsignedp;
1679 lhs.overflow = false;
1680 if (lhs_neg)
1681 lhs = num_negate (lhs, precision);
1682
1683 return lhs;
1684}
This page took 8.200335 seconds and 5 git commands to generate.