2008-05-08 Kai Tietz <kai.tietz@onevision.com>
[official-gcc.git] / libcpp / expr.c
blobaf0e2590ee4965346959fb192680979636fa99bf
1 /* Parse C expressions for cpplib.
2 Copyright (C) 1987, 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2001,
3 2002, 2004, 2008 Free Software Foundation.
4 Contributed by Per Bothner, 1994.
6 This program is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, USA. */
21 #include "config.h"
22 #include "system.h"
23 #include "cpplib.h"
24 #include "internal.h"
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))
31 struct op
33 const cpp_token *token; /* The token forming op (for diagnostics). */
34 cpp_num value; /* The value logically "right" of op. */
35 enum cpp_ttype op;
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)
41 static bool num_positive (cpp_num, size_t);
42 static bool num_greater_eq (cpp_num, cpp_num, size_t);
43 static cpp_num num_trim (cpp_num, size_t);
44 static cpp_num num_part_mul (cpp_num_part, cpp_num_part);
46 static cpp_num num_unary_op (cpp_reader *, cpp_num, enum cpp_ttype);
47 static cpp_num num_binary_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype);
48 static cpp_num num_negate (cpp_num, size_t);
49 static cpp_num num_bitwise_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype);
50 static cpp_num num_inequality_op (cpp_reader *, cpp_num, cpp_num,
51 enum cpp_ttype);
52 static cpp_num num_equality_op (cpp_reader *, cpp_num, cpp_num,
53 enum cpp_ttype);
54 static cpp_num num_mul (cpp_reader *, cpp_num, cpp_num);
55 static cpp_num num_div_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype);
56 static cpp_num num_lshift (cpp_num, size_t, size_t);
57 static cpp_num num_rshift (cpp_num, size_t, size_t);
59 static cpp_num append_digit (cpp_num, int, int, size_t);
60 static cpp_num parse_defined (cpp_reader *);
61 static cpp_num eval_token (cpp_reader *, const cpp_token *);
62 static struct op *reduce (cpp_reader *, struct op *, enum cpp_ttype);
63 static unsigned int interpret_float_suffix (const uchar *, size_t);
64 static unsigned int interpret_int_suffix (const uchar *, size_t);
65 static void check_promotion (cpp_reader *, const struct op *);
67 /* Token type abuse to create unary plus and minus operators. */
68 #define CPP_UPLUS ((enum cpp_ttype) (CPP_LAST_CPP_OP + 1))
69 #define CPP_UMINUS ((enum cpp_ttype) (CPP_LAST_CPP_OP + 2))
71 /* With -O2, gcc appears to produce nice code, moving the error
72 message load and subsequent jump completely out of the main path. */
73 #define SYNTAX_ERROR(msgid) \
74 do { cpp_error (pfile, CPP_DL_ERROR, msgid); goto syntax_error; } while(0)
75 #define SYNTAX_ERROR2(msgid, arg) \
76 do { cpp_error (pfile, CPP_DL_ERROR, msgid, arg); goto syntax_error; } \
77 while(0)
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. */
82 static unsigned int
83 interpret_float_suffix (const uchar *s, size_t len)
85 size_t f, l, w, q, i, d;
86 size_t r, k, u, h;
88 f = l = w = q = i = d = 0;
89 r = k = u = h = 0;
91 while (len--)
92 switch (s[len])
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;
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)
105 return 0;
106 l++;
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;
110 break;
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;
121 case 'i': case 'I':
122 case 'j': case 'J': i++; break;
123 case 'd': case 'D': d++; break;
124 default:
125 return 0;
128 if (r + k > 1 || h > 1 || l > 2 || u > 1)
129 return 0;
131 if (r == 1)
133 if (f || i || d || w || q)
134 return 0;
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));
143 if (k == 1)
145 if (f || i || d || w || q)
146 return 0;
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));
155 if (f + l + w + q > 1 || i > 1 || h + u > 0)
156 return 0;
158 /* Allow dd, df, dl suffixes for decimal float constants. */
159 if (d && ((d + f + l != 2) || i))
160 return 0;
162 return ((i ? CPP_N_IMAGINARY : 0)
163 | (f ? CPP_N_SMALL :
164 l ? CPP_N_LARGE :
165 w ? CPP_N_MD_W :
166 q ? CPP_N_MD_Q : CPP_N_MEDIUM)
167 | (d ? CPP_N_DFLOAT : 0));
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. */
173 static unsigned int
174 interpret_int_suffix (const uchar *s, size_t len)
176 size_t u, l, i;
178 u = l = i = 0;
180 while (len--)
181 switch (s[len])
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;
195 if (l > 2 || u > 1 || i > 1)
196 return 0;
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));
204 /* Categorize numeric constants according to their field (integer,
205 floating point, or invalid), radix (decimal, octal, hexadecimal),
206 and type suffixes. */
207 unsigned int
208 cpp_classify_number (cpp_reader *pfile, const cpp_token *token)
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;
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;
220 limit = str + token->val.str.len;
221 float_flag = NOT_FLOAT;
222 max_digit = 0;
223 radix = 10;
225 /* First, interpret the radix. */
226 if (*str == '0')
228 radix = 8;
229 str++;
231 /* Require at least one hex digit to classify it as hex. */
232 if ((*str == 'x' || *str == 'X')
233 && (str[1] == '.' || ISXDIGIT (str[1])))
235 radix = 16;
236 str++;
238 else if ((*str == 'b' || *str == 'B') && (str[1] == '0' || str[1] == '1'))
240 radix = 2;
241 str++;
245 /* Now scan for a well-formed integer or float. */
246 for (;;)
248 unsigned int c = *str++;
250 if (ISDIGIT (c) || (ISXDIGIT (c) && radix == 16))
252 c = hex_value (c);
253 if (c > max_digit)
254 max_digit = c;
256 else if (c == '.')
258 if (float_flag == NOT_FLOAT)
259 float_flag = AFTER_POINT;
260 else
261 SYNTAX_ERROR ("too many decimal points in number");
263 else if ((radix <= 10 && (c == 'e' || c == 'E'))
264 || (radix == 16 && (c == 'p' || c == 'P')))
266 float_flag = AFTER_EXPON;
267 break;
269 else
271 /* Start of suffix. */
272 str--;
273 break;
277 /* The suffix may be for decimal fixed-point constants without exponent. */
278 if (radix != 16 && float_flag == NOT_FLOAT)
280 result = interpret_float_suffix (str, limit - str);
281 if ((result & CPP_N_FRACT) || (result & CPP_N_ACCUM))
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;
288 if (CPP_PEDANTIC (pfile))
289 cpp_error (pfile, CPP_DL_PEDWARN,
290 "fixed-point constants are a GCC extension");
291 goto syntax_ok;
293 else
294 result = 0;
297 if (float_flag != NOT_FLOAT && radix == 8)
298 radix = 10;
300 if (max_digit >= radix)
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);
308 if (float_flag != NOT_FLOAT)
310 if (radix == 2)
312 cpp_error (pfile, CPP_DL_ERROR,
313 "invalid prefix \"0b\" for floating constant");
314 return CPP_N_INVALID;
317 if (radix == 16 && CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, c99))
318 cpp_error (pfile, CPP_DL_PEDWARN,
319 "use of C99 hexadecimal floating constant");
321 if (float_flag == AFTER_EXPON)
323 if (*str == '+' || *str == '-')
324 str++;
326 /* Exponent is decimal, even if string is a hex float. */
327 if (!ISDIGIT (*str))
328 SYNTAX_ERROR ("exponent has no digits");
331 str++;
332 while (ISDIGIT (*str));
334 else if (radix == 16)
335 SYNTAX_ERROR ("hexadecimal floating constants require an exponent");
337 result = interpret_float_suffix (str, limit - str);
338 if (result == 0)
340 cpp_error (pfile, CPP_DL_ERROR,
341 "invalid suffix \"%.*s\" on floating constant",
342 (int) (limit - str), str);
343 return CPP_N_INVALID;
346 /* Traditional C didn't accept any floating suffixes. */
347 if (limit != str
348 && CPP_WTRADITIONAL (pfile)
349 && ! cpp_sys_macro_p (pfile))
350 cpp_error (pfile, CPP_DL_WARNING,
351 "traditional C rejects the \"%.*s\" suffix",
352 (int) (limit - str), str);
354 /* Radix must be 10 for decimal floats. */
355 if ((result & CPP_N_DFLOAT) && radix != 10)
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;
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");
367 if ((result & CPP_N_DFLOAT) && CPP_PEDANTIC (pfile))
368 cpp_error (pfile, CPP_DL_PEDWARN,
369 "decimal float constants are a GCC extension");
371 result |= CPP_N_FLOATING;
373 else
375 result = interpret_int_suffix (str, limit - str);
376 if (result == 0)
378 cpp_error (pfile, CPP_DL_ERROR,
379 "invalid suffix \"%.*s\" on integer constant",
380 (int) (limit - str), str);
381 return CPP_N_INVALID;
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))
388 int u_or_i = (result & (CPP_N_UNSIGNED|CPP_N_IMAGINARY));
389 int large = (result & CPP_N_WIDTH) == CPP_N_LARGE;
391 if (u_or_i || (large && CPP_OPTION (pfile, warn_long_long)))
392 cpp_error (pfile, CPP_DL_WARNING,
393 "traditional C rejects the \"%.*s\" suffix",
394 (int) (limit - str), str);
397 if ((result & CPP_N_WIDTH) == CPP_N_LARGE
398 && ! CPP_OPTION (pfile, c99)
399 && CPP_OPTION (pfile, warn_long_long))
400 cpp_error (pfile, CPP_DL_PEDWARN,
401 "use of C99 long long integer constant");
403 result |= CPP_N_INTEGER;
406 syntax_ok:
407 if ((result & CPP_N_IMAGINARY) && CPP_PEDANTIC (pfile))
408 cpp_error (pfile, CPP_DL_PEDWARN,
409 "imaginary constants are a GCC extension");
410 if (radix == 2 && CPP_PEDANTIC (pfile))
411 cpp_error (pfile, CPP_DL_PEDWARN,
412 "binary constants are a GCC extension");
414 if (radix == 10)
415 result |= CPP_N_DECIMAL;
416 else if (radix == 16)
417 result |= CPP_N_HEX;
418 else if (radix == 2)
419 result |= CPP_N_BINARY;
420 else
421 result |= CPP_N_OCTAL;
423 return result;
425 syntax_error:
426 return CPP_N_INVALID;
429 /* cpp_interpret_integer converts an integer constant into a cpp_num,
430 of precision options->precision.
432 We do not provide any interface for decimal->float conversion,
433 because the preprocessor doesn't need it and we don't want to
434 drag in GCC's floating point emulator. */
435 cpp_num
436 cpp_interpret_integer (cpp_reader *pfile, const cpp_token *token,
437 unsigned int type)
439 const uchar *p, *end;
440 cpp_num result;
442 result.low = 0;
443 result.high = 0;
444 result.unsignedp = !!(type & CPP_N_UNSIGNED);
445 result.overflow = false;
447 p = token->val.str.text;
448 end = p + token->val.str.len;
450 /* Common case of a single digit. */
451 if (token->val.str.len == 1)
452 result.low = p[0] - '0';
453 else
455 cpp_num_part max;
456 size_t precision = CPP_OPTION (pfile, precision);
457 unsigned int base = 10, c = 0;
458 bool overflow = false;
460 if ((type & CPP_N_RADIX) == CPP_N_OCTAL)
462 base = 8;
463 p++;
465 else if ((type & CPP_N_RADIX) == CPP_N_HEX)
467 base = 16;
468 p += 2;
470 else if ((type & CPP_N_RADIX) == CPP_N_BINARY)
472 base = 2;
473 p += 2;
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;
483 for (; p < end; p++)
485 c = *p;
487 if (ISDIGIT (c) || (base == 16 && ISXDIGIT (c)))
488 c = hex_value (c);
489 else
490 break;
492 /* Strict inequality for when max is set to zero. */
493 if (result.low < max)
494 result.low = result.low * base + c;
495 else
497 result = append_digit (result, c, base, precision);
498 overflow |= result.overflow;
499 max = 0;
503 if (overflow)
504 cpp_error (pfile, CPP_DL_PEDWARN,
505 "integer constant is too large for its type");
506 /* If too big to be signed, consider it unsigned. Only warn for
507 decimal numbers. Traditional numbers were always signed (but
508 we still honor an explicit U suffix); but we only have
509 traditional semantics in directives. */
510 else if (!result.unsignedp
511 && !(CPP_OPTION (pfile, traditional)
512 && pfile->state.in_directive)
513 && !num_positive (result, precision))
515 if (base == 10)
516 cpp_error (pfile, CPP_DL_WARNING,
517 "integer constant is so large that it is unsigned");
518 result.unsignedp = true;
522 return result;
525 /* Append DIGIT to NUM, a number of PRECISION bits being read in base BASE. */
526 static cpp_num
527 append_digit (cpp_num num, int digit, int base, size_t precision)
529 cpp_num result;
530 unsigned int shift;
531 bool overflow;
532 cpp_num_part add_high, add_low;
534 /* Multiply by 2, 8 or 16. Catching this overflow here means we don't
535 need to worry about add_high overflowing. */
536 switch (base)
538 case 2:
539 shift = 1;
540 break;
542 case 16:
543 shift = 4;
544 break;
546 default:
547 shift = 3;
549 overflow = !!(num.high >> (PART_PRECISION - shift));
550 result.high = num.high << shift;
551 result.low = num.low << shift;
552 result.high |= num.low >> (PART_PRECISION - shift);
553 result.unsignedp = num.unsignedp;
555 if (base == 10)
557 add_low = num.low << 1;
558 add_high = (num.high << 1) + (num.low >> (PART_PRECISION - 1));
560 else
561 add_high = add_low = 0;
563 if (add_low + digit < add_low)
564 add_high++;
565 add_low += digit;
567 if (result.low + add_low < result.low)
568 add_high++;
569 if (result.high + add_high < result.high)
570 overflow = true;
572 result.low += add_low;
573 result.high += add_high;
574 result.overflow = overflow;
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))
582 result.overflow = true;
584 return result;
587 /* Handle meeting "defined" in a preprocessor expression. */
588 static cpp_num
589 parse_defined (cpp_reader *pfile)
591 cpp_num result;
592 int paren = 0;
593 cpp_hashnode *node = 0;
594 const cpp_token *token;
595 cpp_context *initial_context = pfile->context;
597 /* Don't expand macros. */
598 pfile->state.prevent_expansion++;
600 token = cpp_get_token (pfile);
601 if (token->type == CPP_OPEN_PAREN)
603 paren = 1;
604 token = cpp_get_token (pfile);
607 if (token->type == CPP_NAME)
609 node = token->val.node;
610 if (paren && cpp_get_token (pfile)->type != CPP_CLOSE_PAREN)
612 cpp_error (pfile, CPP_DL_ERROR, "missing ')' after \"defined\"");
613 node = 0;
616 else
618 cpp_error (pfile, CPP_DL_ERROR,
619 "operator \"defined\" requires an identifier");
620 if (token->flags & NAMED_OP)
622 cpp_token op;
624 op.flags = 0;
625 op.type = token->type;
626 cpp_error (pfile, CPP_DL_ERROR,
627 "(\"%s\" is an alternative token for \"%s\" in C++)",
628 cpp_token_as_text (pfile, token),
629 cpp_token_as_text (pfile, &op));
633 if (node)
635 if (pfile->context != initial_context && CPP_PEDANTIC (pfile))
636 cpp_error (pfile, CPP_DL_WARNING,
637 "this use of \"defined\" may not be portable");
639 _cpp_mark_macro_used (node);
640 if (!(node->flags & NODE_USED))
642 node->flags |= NODE_USED;
643 if (node->type == NT_MACRO)
645 if (pfile->cb.used_define)
646 pfile->cb.used_define (pfile, pfile->directive_line, node);
648 else
650 if (pfile->cb.used_undef)
651 pfile->cb.used_undef (pfile, pfile->directive_line, node);
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;
660 pfile->state.prevent_expansion--;
662 result.unsignedp = false;
663 result.high = 0;
664 result.overflow = false;
665 result.low = node && node->type == NT_MACRO;
666 return result;
669 /* Convert a token into a CPP_NUMBER (an interpreted preprocessing
670 number or character constant, or the result of the "defined" or "#"
671 operators). */
672 static cpp_num
673 eval_token (cpp_reader *pfile, const cpp_token *token)
675 cpp_num result;
676 unsigned int temp;
677 int unsignedp = 0;
679 result.unsignedp = false;
680 result.overflow = false;
682 switch (token->type)
684 case CPP_NUMBER:
685 temp = cpp_classify_number (pfile, token);
686 switch (temp & CPP_N_CATEGORY)
688 case CPP_N_FLOATING:
689 cpp_error (pfile, CPP_DL_ERROR,
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);
695 cpp_error (pfile, CPP_DL_ERROR,
696 "imaginary number in preprocessor expression");
697 break;
699 case CPP_N_INVALID:
700 /* Error already issued. */
701 break;
703 result.high = result.low = 0;
704 break;
706 case CPP_WCHAR:
707 case CPP_CHAR:
708 case CPP_CHAR16:
709 case CPP_CHAR32:
711 cppchar_t cc = cpp_interpret_charconst (pfile, token,
712 &temp, &unsignedp);
714 result.high = 0;
715 result.low = cc;
716 /* Sign-extend the result if necessary. */
717 if (!unsignedp && (cppchar_signed_t) cc < 0)
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));
726 break;
728 case CPP_NAME:
729 if (token->val.node == pfile->spec_nodes.n_defined)
730 return parse_defined (pfile);
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))
735 result.high = 0;
736 result.low = (token->val.node == pfile->spec_nodes.n_true);
738 else
740 result.high = 0;
741 result.low = 0;
742 if (CPP_OPTION (pfile, warn_undef) && !pfile->state.skip_eval)
743 cpp_error (pfile, CPP_DL_WARNING, "\"%s\" is not defined",
744 NODE_NAME (token->val.node));
746 break;
748 default: /* CPP_HASH */
749 _cpp_test_assertion (pfile, &temp);
750 result.high = 0;
751 result.low = temp;
754 result.unsignedp = !!unsignedp;
755 return result;
758 /* Operator precedence and flags table.
760 After an operator is returned from the lexer, if it has priority less
761 than the operator on the top of the stack, we reduce the stack by one
762 operator and repeat the test. Since equal priorities do not reduce,
763 this is naturally right-associative.
765 We handle left-associative operators by decrementing the priority of
766 just-lexed operators by one, but retaining the priority of operators
767 already on the stack.
769 The remaining cases are '(' and ')'. We handle '(' by skipping the
770 reduction phase completely. ')' is given lower priority than
771 everything else, including '(', effectively forcing a reduction of the
772 parenthesized expression. If there is a matching '(', the routine
773 reduce() exits immediately. If the normal exit route sees a ')', then
774 there cannot have been a matching '(' and an error message is output.
776 The parser assumes all shifted operators require a left operand unless
777 the flag NO_L_OPERAND is set. These semantics are automatic; any
778 extra semantics need to be handled with operator-specific code. */
780 /* Flags. If CHECK_PROMOTION, we warn if the effective sign of an
781 operand changes because of integer promotions. */
782 #define NO_L_OPERAND (1 << 0)
783 #define LEFT_ASSOC (1 << 1)
784 #define CHECK_PROMOTION (1 << 2)
786 /* Operator to priority map. Must be in the same order as the first
787 N entries of enum cpp_ttype. */
788 static const struct cpp_operator
790 uchar prio;
791 uchar flags;
792 } optab[] =
794 /* EQ */ {0, 0}, /* Shouldn't happen. */
795 /* NOT */ {16, NO_L_OPERAND},
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},
806 /* RSHIFT */ {13, LEFT_ASSOC},
807 /* LSHIFT */ {13, LEFT_ASSOC},
809 /* COMPL */ {16, NO_L_OPERAND},
810 /* AND_AND */ {6, LEFT_ASSOC},
811 /* OR_OR */ {5, LEFT_ASSOC},
812 /* Note that QUERY, COLON, and COMMA must have the same precedence.
813 However, there are some special cases for these in reduce(). */
814 /* QUERY */ {4, 0},
815 /* COLON */ {4, LEFT_ASSOC | CHECK_PROMOTION},
816 /* COMMA */ {4, LEFT_ASSOC},
817 /* OPEN_PAREN */ {1, NO_L_OPERAND},
818 /* CLOSE_PAREN */ {0, 0},
819 /* EOF */ {0, 0},
820 /* EQ_EQ */ {11, LEFT_ASSOC},
821 /* NOT_EQ */ {11, LEFT_ASSOC},
822 /* GREATER_EQ */ {12, LEFT_ASSOC | CHECK_PROMOTION},
823 /* LESS_EQ */ {12, LEFT_ASSOC | CHECK_PROMOTION},
824 /* UPLUS */ {16, NO_L_OPERAND},
825 /* UMINUS */ {16, NO_L_OPERAND}
828 /* Parse and evaluate a C expression, reading from PFILE.
829 Returns the truth value of the expression.
831 The implementation is an operator precedence parser, i.e. a
832 bottom-up parser, using a stack for not-yet-reduced tokens.
834 The stack base is op_stack, and the current stack pointer is 'top'.
835 There is a stack element for each operator (only), and the most
836 recently pushed operator is 'top->op'. An operand (value) is
837 stored in the 'value' field of the stack element of the operator
838 that precedes it. */
839 bool
840 _cpp_parse_expr (cpp_reader *pfile)
842 struct op *top = pfile->op_stack;
843 unsigned int lex_count;
844 bool saw_leading_not, want_value = true;
846 pfile->state.skip_eval = 0;
848 /* Set up detection of #if ! defined(). */
849 pfile->mi_ind_cmacro = 0;
850 saw_leading_not = false;
851 lex_count = 0;
853 /* Lowest priority operator prevents further reductions. */
854 top->op = CPP_EOF;
856 for (;;)
858 struct op op;
860 lex_count++;
861 op.token = cpp_get_token (pfile);
862 op.op = op.token->type;
864 switch (op.op)
866 /* These tokens convert into values. */
867 case CPP_NUMBER:
868 case CPP_CHAR:
869 case CPP_WCHAR:
870 case CPP_CHAR16:
871 case CPP_CHAR32:
872 case CPP_NAME:
873 case CPP_HASH:
874 if (!want_value)
875 SYNTAX_ERROR2 ("missing binary operator before token \"%s\"",
876 cpp_token_as_text (pfile, op.token));
877 want_value = false;
878 top->value = eval_token (pfile, op.token);
879 continue;
881 case CPP_NOT:
882 saw_leading_not = lex_count == 1;
883 break;
884 case CPP_PLUS:
885 if (want_value)
886 op.op = CPP_UPLUS;
887 break;
888 case CPP_MINUS:
889 if (want_value)
890 op.op = CPP_UMINUS;
891 break;
893 default:
894 if ((int) op.op <= (int) CPP_EQ || (int) op.op >= (int) CPP_PLUS_EQ)
895 SYNTAX_ERROR2 ("token \"%s\" is not valid in preprocessor expressions",
896 cpp_token_as_text (pfile, op.token));
897 break;
900 /* Check we have a value or operator as appropriate. */
901 if (optab[op.op].flags & NO_L_OPERAND)
903 if (!want_value)
904 SYNTAX_ERROR2 ("missing binary operator before token \"%s\"",
905 cpp_token_as_text (pfile, op.token));
907 else if (want_value)
909 /* We want a number (or expression) and haven't got one.
910 Try to emit a specific diagnostic. */
911 if (op.op == CPP_CLOSE_PAREN && top->op == CPP_OPEN_PAREN)
912 SYNTAX_ERROR ("missing expression between '(' and ')'");
914 if (op.op == CPP_EOF && top->op == CPP_EOF)
915 SYNTAX_ERROR ("#if with no expression");
917 if (top->op != CPP_EOF && top->op != CPP_OPEN_PAREN)
918 SYNTAX_ERROR2 ("operator '%s' has no right operand",
919 cpp_token_as_text (pfile, top->token));
920 else if (op.op == CPP_CLOSE_PAREN || op.op == CPP_EOF)
921 /* Complain about missing paren during reduction. */;
922 else
923 SYNTAX_ERROR2 ("operator '%s' has no left operand",
924 cpp_token_as_text (pfile, op.token));
927 top = reduce (pfile, top, op.op);
928 if (!top)
929 goto syntax_error;
931 if (op.op == CPP_EOF)
932 break;
934 switch (op.op)
936 case CPP_CLOSE_PAREN:
937 continue;
938 case CPP_OR_OR:
939 if (!num_zerop (top->value))
940 pfile->state.skip_eval++;
941 break;
942 case CPP_AND_AND:
943 case CPP_QUERY:
944 if (num_zerop (top->value))
945 pfile->state.skip_eval++;
946 break;
947 case CPP_COLON:
948 if (top->op != CPP_QUERY)
949 SYNTAX_ERROR (" ':' without preceding '?'");
950 if (!num_zerop (top[-1].value)) /* Was '?' condition true? */
951 pfile->state.skip_eval++;
952 else
953 pfile->state.skip_eval--;
954 default:
955 break;
958 want_value = true;
960 /* Check for and handle stack overflow. */
961 if (++top == pfile->op_limit)
962 top = _cpp_expand_op_stack (pfile);
964 top->op = op.op;
965 top->token = op.token;
968 /* The controlling macro expression is only valid if we called lex 3
969 times: <!> <defined expression> and <EOF>. push_conditional ()
970 checks that we are at top-of-file. */
971 if (pfile->mi_ind_cmacro && !(saw_leading_not && lex_count == 3))
972 pfile->mi_ind_cmacro = 0;
974 if (top != pfile->op_stack)
976 cpp_error (pfile, CPP_DL_ICE, "unbalanced stack in #if");
977 syntax_error:
978 return false; /* Return false on syntax error. */
981 return !num_zerop (top->value);
984 /* Reduce the operator / value stack if possible, in preparation for
985 pushing operator OP. Returns NULL on error, otherwise the top of
986 the stack. */
987 static struct op *
988 reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op)
990 unsigned int prio;
992 if (top->op <= CPP_EQ || top->op > CPP_LAST_CPP_OP + 2)
994 bad_op:
995 cpp_error (pfile, CPP_DL_ICE, "impossible operator '%u'", top->op);
996 return 0;
999 if (op == CPP_OPEN_PAREN)
1000 return top;
1002 /* Decrement the priority of left-associative operators to force a
1003 reduction with operators of otherwise equal priority. */
1004 prio = optab[op].prio - ((optab[op].flags & LEFT_ASSOC) != 0);
1005 while (prio < optab[top->op].prio)
1007 if (CPP_OPTION (pfile, warn_num_sign_change)
1008 && optab[top->op].flags & CHECK_PROMOTION)
1009 check_promotion (pfile, top);
1011 switch (top->op)
1013 case CPP_UPLUS:
1014 case CPP_UMINUS:
1015 case CPP_NOT:
1016 case CPP_COMPL:
1017 top[-1].value = num_unary_op (pfile, top->value, top->op);
1018 break;
1020 case CPP_PLUS:
1021 case CPP_MINUS:
1022 case CPP_RSHIFT:
1023 case CPP_LSHIFT:
1024 case CPP_COMMA:
1025 top[-1].value = num_binary_op (pfile, top[-1].value,
1026 top->value, top->op);
1027 break;
1029 case CPP_GREATER:
1030 case CPP_LESS:
1031 case CPP_GREATER_EQ:
1032 case CPP_LESS_EQ:
1033 top[-1].value
1034 = num_inequality_op (pfile, top[-1].value, top->value, top->op);
1035 break;
1037 case CPP_EQ_EQ:
1038 case CPP_NOT_EQ:
1039 top[-1].value
1040 = num_equality_op (pfile, top[-1].value, top->value, top->op);
1041 break;
1043 case CPP_AND:
1044 case CPP_OR:
1045 case CPP_XOR:
1046 top[-1].value
1047 = num_bitwise_op (pfile, top[-1].value, top->value, top->op);
1048 break;
1050 case CPP_MULT:
1051 top[-1].value = num_mul (pfile, top[-1].value, top->value);
1052 break;
1054 case CPP_DIV:
1055 case CPP_MOD:
1056 top[-1].value = num_div_op (pfile, top[-1].value,
1057 top->value, top->op);
1058 break;
1060 case CPP_OR_OR:
1061 top--;
1062 if (!num_zerop (top->value))
1063 pfile->state.skip_eval--;
1064 top->value.low = (!num_zerop (top->value)
1065 || !num_zerop (top[1].value));
1066 top->value.high = 0;
1067 top->value.unsignedp = false;
1068 top->value.overflow = false;
1069 continue;
1071 case CPP_AND_AND:
1072 top--;
1073 if (num_zerop (top->value))
1074 pfile->state.skip_eval--;
1075 top->value.low = (!num_zerop (top->value)
1076 && !num_zerop (top[1].value));
1077 top->value.high = 0;
1078 top->value.unsignedp = false;
1079 top->value.overflow = false;
1080 continue;
1082 case CPP_OPEN_PAREN:
1083 if (op != CPP_CLOSE_PAREN)
1085 cpp_error (pfile, CPP_DL_ERROR, "missing ')' in expression");
1086 return 0;
1088 top--;
1089 top->value = top[1].value;
1090 return top;
1092 case CPP_COLON:
1093 top -= 2;
1094 if (!num_zerop (top->value))
1096 pfile->state.skip_eval--;
1097 top->value = top[1].value;
1099 else
1100 top->value = top[2].value;
1101 top->value.unsignedp = (top[1].value.unsignedp
1102 || top[2].value.unsignedp);
1103 continue;
1105 case CPP_QUERY:
1106 /* COMMA and COLON should not reduce a QUERY operator. */
1107 if (op == CPP_COMMA || op == CPP_COLON)
1108 return top;
1109 cpp_error (pfile, CPP_DL_ERROR, "'?' without following ':'");
1110 return 0;
1112 default:
1113 goto bad_op;
1116 top--;
1117 if (top->value.overflow && !pfile->state.skip_eval)
1118 cpp_error (pfile, CPP_DL_PEDWARN,
1119 "integer overflow in preprocessor expression");
1122 if (op == CPP_CLOSE_PAREN)
1124 cpp_error (pfile, CPP_DL_ERROR, "missing '(' in expression");
1125 return 0;
1128 return top;
1131 /* Returns the position of the old top of stack after expansion. */
1132 struct op *
1133 _cpp_expand_op_stack (cpp_reader *pfile)
1135 size_t old_size = (size_t) (pfile->op_limit - pfile->op_stack);
1136 size_t new_size = old_size * 2 + 20;
1138 pfile->op_stack = XRESIZEVEC (struct op, pfile->op_stack, new_size);
1139 pfile->op_limit = pfile->op_stack + new_size;
1141 return pfile->op_stack + old_size;
1144 /* Emits a warning if the effective sign of either operand of OP
1145 changes because of integer promotions. */
1146 static void
1147 check_promotion (cpp_reader *pfile, const struct op *op)
1149 if (op->value.unsignedp == op[-1].value.unsignedp)
1150 return;
1152 if (op->value.unsignedp)
1154 if (!num_positive (op[-1].value, CPP_OPTION (pfile, precision)))
1155 cpp_error (pfile, CPP_DL_WARNING,
1156 "the left operand of \"%s\" changes sign when promoted",
1157 cpp_token_as_text (pfile, op->token));
1159 else if (!num_positive (op->value, CPP_OPTION (pfile, precision)))
1160 cpp_error (pfile, CPP_DL_WARNING,
1161 "the right operand of \"%s\" changes sign when promoted",
1162 cpp_token_as_text (pfile, op->token));
1165 /* Clears the unused high order bits of the number pointed to by PNUM. */
1166 static cpp_num
1167 num_trim (cpp_num num, size_t precision)
1169 if (precision > PART_PRECISION)
1171 precision -= PART_PRECISION;
1172 if (precision < PART_PRECISION)
1173 num.high &= ((cpp_num_part) 1 << precision) - 1;
1175 else
1177 if (precision < PART_PRECISION)
1178 num.low &= ((cpp_num_part) 1 << precision) - 1;
1179 num.high = 0;
1182 return num;
1185 /* True iff A (presumed signed) >= 0. */
1186 static bool
1187 num_positive (cpp_num num, size_t precision)
1189 if (precision > PART_PRECISION)
1191 precision -= PART_PRECISION;
1192 return (num.high & (cpp_num_part) 1 << (precision - 1)) == 0;
1195 return (num.low & (cpp_num_part) 1 << (precision - 1)) == 0;
1198 /* Sign extend a number, with PRECISION significant bits and all
1199 others assumed clear, to fill out a cpp_num structure. */
1200 cpp_num
1201 cpp_num_sign_extend (cpp_num num, size_t precision)
1203 if (!num.unsignedp)
1205 if (precision > PART_PRECISION)
1207 precision -= PART_PRECISION;
1208 if (precision < PART_PRECISION
1209 && (num.high & (cpp_num_part) 1 << (precision - 1)))
1210 num.high |= ~(~(cpp_num_part) 0 >> (PART_PRECISION - precision));
1212 else if (num.low & (cpp_num_part) 1 << (precision - 1))
1214 if (precision < PART_PRECISION)
1215 num.low |= ~(~(cpp_num_part) 0 >> (PART_PRECISION - precision));
1216 num.high = ~(cpp_num_part) 0;
1220 return num;
1223 /* Returns the negative of NUM. */
1224 static cpp_num
1225 num_negate (cpp_num num, size_t precision)
1227 cpp_num copy;
1229 copy = num;
1230 num.high = ~num.high;
1231 num.low = ~num.low;
1232 if (++num.low == 0)
1233 num.high++;
1234 num = num_trim (num, precision);
1235 num.overflow = (!num.unsignedp && num_eq (num, copy) && !num_zerop (num));
1237 return num;
1240 /* Returns true if A >= B. */
1241 static bool
1242 num_greater_eq (cpp_num pa, cpp_num pb, size_t precision)
1244 bool unsignedp;
1246 unsignedp = pa.unsignedp || pb.unsignedp;
1248 if (!unsignedp)
1250 /* Both numbers have signed type. If they are of different
1251 sign, the answer is the sign of A. */
1252 unsignedp = num_positive (pa, precision);
1254 if (unsignedp != num_positive (pb, precision))
1255 return unsignedp;
1257 /* Otherwise we can do an unsigned comparison. */
1260 return (pa.high > pb.high) || (pa.high == pb.high && pa.low >= pb.low);
1263 /* Returns LHS OP RHS, where OP is a bit-wise operation. */
1264 static cpp_num
1265 num_bitwise_op (cpp_reader *pfile ATTRIBUTE_UNUSED,
1266 cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
1268 lhs.overflow = false;
1269 lhs.unsignedp = lhs.unsignedp || rhs.unsignedp;
1271 /* As excess precision is zeroed, there is no need to num_trim () as
1272 these operations cannot introduce a set bit there. */
1273 if (op == CPP_AND)
1275 lhs.low &= rhs.low;
1276 lhs.high &= rhs.high;
1278 else if (op == CPP_OR)
1280 lhs.low |= rhs.low;
1281 lhs.high |= rhs.high;
1283 else
1285 lhs.low ^= rhs.low;
1286 lhs.high ^= rhs.high;
1289 return lhs;
1292 /* Returns LHS OP RHS, where OP is an inequality. */
1293 static cpp_num
1294 num_inequality_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs,
1295 enum cpp_ttype op)
1297 bool gte = num_greater_eq (lhs, rhs, CPP_OPTION (pfile, precision));
1299 if (op == CPP_GREATER_EQ)
1300 lhs.low = gte;
1301 else if (op == CPP_LESS)
1302 lhs.low = !gte;
1303 else if (op == CPP_GREATER)
1304 lhs.low = gte && !num_eq (lhs, rhs);
1305 else /* CPP_LESS_EQ. */
1306 lhs.low = !gte || num_eq (lhs, rhs);
1308 lhs.high = 0;
1309 lhs.overflow = false;
1310 lhs.unsignedp = false;
1311 return lhs;
1314 /* Returns LHS OP RHS, where OP is == or !=. */
1315 static cpp_num
1316 num_equality_op (cpp_reader *pfile ATTRIBUTE_UNUSED,
1317 cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
1319 /* Work around a 3.0.4 bug; see PR 6950. */
1320 bool eq = num_eq (lhs, rhs);
1321 if (op == CPP_NOT_EQ)
1322 eq = !eq;
1323 lhs.low = eq;
1324 lhs.high = 0;
1325 lhs.overflow = false;
1326 lhs.unsignedp = false;
1327 return lhs;
1330 /* Shift NUM, of width PRECISION, right by N bits. */
1331 static cpp_num
1332 num_rshift (cpp_num num, size_t precision, size_t n)
1334 cpp_num_part sign_mask;
1335 bool x = num_positive (num, precision);
1337 if (num.unsignedp || x)
1338 sign_mask = 0;
1339 else
1340 sign_mask = ~(cpp_num_part) 0;
1342 if (n >= precision)
1343 num.high = num.low = sign_mask;
1344 else
1346 /* Sign-extend. */
1347 if (precision < PART_PRECISION)
1348 num.high = sign_mask, num.low |= sign_mask << precision;
1349 else if (precision < 2 * PART_PRECISION)
1350 num.high |= sign_mask << (precision - PART_PRECISION);
1352 if (n >= PART_PRECISION)
1354 n -= PART_PRECISION;
1355 num.low = num.high;
1356 num.high = sign_mask;
1359 if (n)
1361 num.low = (num.low >> n) | (num.high << (PART_PRECISION - n));
1362 num.high = (num.high >> n) | (sign_mask << (PART_PRECISION - n));
1366 num = num_trim (num, precision);
1367 num.overflow = false;
1368 return num;
1371 /* Shift NUM, of width PRECISION, left by N bits. */
1372 static cpp_num
1373 num_lshift (cpp_num num, size_t precision, size_t n)
1375 if (n >= precision)
1377 num.overflow = !num.unsignedp && !num_zerop (num);
1378 num.high = num.low = 0;
1380 else
1382 cpp_num orig, maybe_orig;
1383 size_t m = n;
1385 orig = num;
1386 if (m >= PART_PRECISION)
1388 m -= PART_PRECISION;
1389 num.high = num.low;
1390 num.low = 0;
1392 if (m)
1394 num.high = (num.high << m) | (num.low >> (PART_PRECISION - m));
1395 num.low <<= m;
1397 num = num_trim (num, precision);
1399 if (num.unsignedp)
1400 num.overflow = false;
1401 else
1403 maybe_orig = num_rshift (num, precision, n);
1404 num.overflow = !num_eq (orig, maybe_orig);
1408 return num;
1411 /* The four unary operators: +, -, ! and ~. */
1412 static cpp_num
1413 num_unary_op (cpp_reader *pfile, cpp_num num, enum cpp_ttype op)
1415 switch (op)
1417 case CPP_UPLUS:
1418 if (CPP_WTRADITIONAL (pfile) && !pfile->state.skip_eval)
1419 cpp_error (pfile, CPP_DL_WARNING,
1420 "traditional C rejects the unary plus operator");
1421 num.overflow = false;
1422 break;
1424 case CPP_UMINUS:
1425 num = num_negate (num, CPP_OPTION (pfile, precision));
1426 break;
1428 case CPP_COMPL:
1429 num.high = ~num.high;
1430 num.low = ~num.low;
1431 num = num_trim (num, CPP_OPTION (pfile, precision));
1432 num.overflow = false;
1433 break;
1435 default: /* case CPP_NOT: */
1436 num.low = num_zerop (num);
1437 num.high = 0;
1438 num.overflow = false;
1439 num.unsignedp = false;
1440 break;
1443 return num;
1446 /* The various binary operators. */
1447 static cpp_num
1448 num_binary_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
1450 cpp_num result;
1451 size_t precision = CPP_OPTION (pfile, precision);
1452 size_t n;
1454 switch (op)
1456 /* Shifts. */
1457 case CPP_LSHIFT:
1458 case CPP_RSHIFT:
1459 if (!rhs.unsignedp && !num_positive (rhs, precision))
1461 /* A negative shift is a positive shift the other way. */
1462 if (op == CPP_LSHIFT)
1463 op = CPP_RSHIFT;
1464 else
1465 op = CPP_LSHIFT;
1466 rhs = num_negate (rhs, precision);
1468 if (rhs.high)
1469 n = ~0; /* Maximal. */
1470 else
1471 n = rhs.low;
1472 if (op == CPP_LSHIFT)
1473 lhs = num_lshift (lhs, precision, n);
1474 else
1475 lhs = num_rshift (lhs, precision, n);
1476 break;
1478 /* Arithmetic. */
1479 case CPP_MINUS:
1480 rhs = num_negate (rhs, precision);
1481 case CPP_PLUS:
1482 result.low = lhs.low + rhs.low;
1483 result.high = lhs.high + rhs.high;
1484 if (result.low < lhs.low)
1485 result.high++;
1486 result.unsignedp = lhs.unsignedp || rhs.unsignedp;
1487 result.overflow = false;
1489 result = num_trim (result, precision);
1490 if (!result.unsignedp)
1492 bool lhsp = num_positive (lhs, precision);
1493 result.overflow = (lhsp == num_positive (rhs, precision)
1494 && lhsp != num_positive (result, precision));
1496 return result;
1498 /* Comma. */
1499 default: /* case CPP_COMMA: */
1500 if (CPP_PEDANTIC (pfile) && (!CPP_OPTION (pfile, c99)
1501 || !pfile->state.skip_eval))
1502 cpp_error (pfile, CPP_DL_PEDWARN,
1503 "comma operator in operand of #if");
1504 lhs = rhs;
1505 break;
1508 return lhs;
1511 /* Multiplies two unsigned cpp_num_parts to give a cpp_num. This
1512 cannot overflow. */
1513 static cpp_num
1514 num_part_mul (cpp_num_part lhs, cpp_num_part rhs)
1516 cpp_num result;
1517 cpp_num_part middle[2], temp;
1519 result.low = LOW_PART (lhs) * LOW_PART (rhs);
1520 result.high = HIGH_PART (lhs) * HIGH_PART (rhs);
1522 middle[0] = LOW_PART (lhs) * HIGH_PART (rhs);
1523 middle[1] = HIGH_PART (lhs) * LOW_PART (rhs);
1525 temp = result.low;
1526 result.low += LOW_PART (middle[0]) << (PART_PRECISION / 2);
1527 if (result.low < temp)
1528 result.high++;
1530 temp = result.low;
1531 result.low += LOW_PART (middle[1]) << (PART_PRECISION / 2);
1532 if (result.low < temp)
1533 result.high++;
1535 result.high += HIGH_PART (middle[0]);
1536 result.high += HIGH_PART (middle[1]);
1537 result.unsignedp = true;
1538 result.overflow = false;
1540 return result;
1543 /* Multiply two preprocessing numbers. */
1544 static cpp_num
1545 num_mul (cpp_reader *pfile, cpp_num lhs, cpp_num rhs)
1547 cpp_num result, temp;
1548 bool unsignedp = lhs.unsignedp || rhs.unsignedp;
1549 bool overflow, negate = false;
1550 size_t precision = CPP_OPTION (pfile, precision);
1552 /* Prepare for unsigned multiplication. */
1553 if (!unsignedp)
1555 if (!num_positive (lhs, precision))
1556 negate = !negate, lhs = num_negate (lhs, precision);
1557 if (!num_positive (rhs, precision))
1558 negate = !negate, rhs = num_negate (rhs, precision);
1561 overflow = lhs.high && rhs.high;
1562 result = num_part_mul (lhs.low, rhs.low);
1564 temp = num_part_mul (lhs.high, rhs.low);
1565 result.high += temp.low;
1566 if (temp.high)
1567 overflow = true;
1569 temp = num_part_mul (lhs.low, rhs.high);
1570 result.high += temp.low;
1571 if (temp.high)
1572 overflow = true;
1574 temp.low = result.low, temp.high = result.high;
1575 result = num_trim (result, precision);
1576 if (!num_eq (result, temp))
1577 overflow = true;
1579 if (negate)
1580 result = num_negate (result, precision);
1582 if (unsignedp)
1583 result.overflow = false;
1584 else
1585 result.overflow = overflow || (num_positive (result, precision) ^ !negate
1586 && !num_zerop (result));
1587 result.unsignedp = unsignedp;
1589 return result;
1592 /* Divide two preprocessing numbers, returning the answer or the
1593 remainder depending upon OP. */
1594 static cpp_num
1595 num_div_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
1597 cpp_num result, sub;
1598 cpp_num_part mask;
1599 bool unsignedp = lhs.unsignedp || rhs.unsignedp;
1600 bool negate = false, lhs_neg = false;
1601 size_t i, precision = CPP_OPTION (pfile, precision);
1603 /* Prepare for unsigned division. */
1604 if (!unsignedp)
1606 if (!num_positive (lhs, precision))
1607 negate = !negate, lhs_neg = true, lhs = num_negate (lhs, precision);
1608 if (!num_positive (rhs, precision))
1609 negate = !negate, rhs = num_negate (rhs, precision);
1612 /* Find the high bit. */
1613 if (rhs.high)
1615 i = precision - 1;
1616 mask = (cpp_num_part) 1 << (i - PART_PRECISION);
1617 for (; ; i--, mask >>= 1)
1618 if (rhs.high & mask)
1619 break;
1621 else if (rhs.low)
1623 if (precision > PART_PRECISION)
1624 i = precision - PART_PRECISION - 1;
1625 else
1626 i = precision - 1;
1627 mask = (cpp_num_part) 1 << i;
1628 for (; ; i--, mask >>= 1)
1629 if (rhs.low & mask)
1630 break;
1632 else
1634 if (!pfile->state.skip_eval)
1635 cpp_error (pfile, CPP_DL_ERROR, "division by zero in #if");
1636 return lhs;
1639 /* First nonzero bit of RHS is bit I. Do naive division by
1640 shifting the RHS fully left, and subtracting from LHS if LHS is
1641 at least as big, and then repeating but with one less shift.
1642 This is not very efficient, but is easy to understand. */
1644 rhs.unsignedp = true;
1645 lhs.unsignedp = true;
1646 i = precision - i - 1;
1647 sub = num_lshift (rhs, precision, i);
1649 result.high = result.low = 0;
1650 for (;;)
1652 if (num_greater_eq (lhs, sub, precision))
1654 lhs = num_binary_op (pfile, lhs, sub, CPP_MINUS);
1655 if (i >= PART_PRECISION)
1656 result.high |= (cpp_num_part) 1 << (i - PART_PRECISION);
1657 else
1658 result.low |= (cpp_num_part) 1 << i;
1660 if (i-- == 0)
1661 break;
1662 sub.low = (sub.low >> 1) | (sub.high << (PART_PRECISION - 1));
1663 sub.high >>= 1;
1666 /* We divide so that the remainder has the sign of the LHS. */
1667 if (op == CPP_DIV)
1669 result.unsignedp = unsignedp;
1670 result.overflow = false;
1671 if (!unsignedp)
1673 if (negate)
1674 result = num_negate (result, precision);
1675 result.overflow = (num_positive (result, precision) ^ !negate
1676 && !num_zerop (result));
1679 return result;
1682 /* CPP_MOD. */
1683 lhs.unsignedp = unsignedp;
1684 lhs.overflow = false;
1685 if (lhs_neg)
1686 lhs = num_negate (lhs, precision);
1688 return lhs;