1 /* Parse C expressions for cpplib.
2 Copyright (C) 1987, 92, 94, 95, 97, 98, 1999, 2000 Free Software Foundation.
3 Contributed by Per Bothner, 1994.
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the
7 Free Software Foundation; either version 2, or (at your option) any
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. */
20 /* Parse a C expression from text in a string */
28 #ifndef MAX_CHAR_TYPE_SIZE
29 #define MAX_CHAR_TYPE_SIZE CHAR_TYPE_SIZE
32 #ifndef MAX_INT_TYPE_SIZE
33 #define MAX_INT_TYPE_SIZE INT_TYPE_SIZE
36 #ifndef MAX_LONG_TYPE_SIZE
37 #define MAX_LONG_TYPE_SIZE LONG_TYPE_SIZE
40 #ifndef MAX_WCHAR_TYPE_SIZE
41 #define MAX_WCHAR_TYPE_SIZE WCHAR_TYPE_SIZE
44 #define MAX_CHAR_TYPE_MASK (MAX_CHAR_TYPE_SIZE < HOST_BITS_PER_WIDEST_INT \
45 ? (~(~(HOST_WIDEST_INT) 0 << MAX_CHAR_TYPE_SIZE)) \
46 : ~ (HOST_WIDEST_INT) 0)
48 #define MAX_WCHAR_TYPE_MASK (MAX_WCHAR_TYPE_SIZE < HOST_BITS_PER_WIDEST_INT \
49 ? ~(~(HOST_WIDEST_INT) 0 << MAX_WCHAR_TYPE_SIZE) \
50 : ~ (HOST_WIDEST_INT) 0)
52 /* Yield nonzero if adding two numbers with A's and B's signs can yield a
53 number with SUM's sign, where A, B, and SUM are all C integers. */
54 #define possible_sum_sign(a, b, sum) ((((a) ^ (b)) | ~ ((a) ^ (sum))) < 0)
56 static void integer_overflow PARAMS ((cpp_reader *));
57 static HOST_WIDEST_INT left_shift PARAMS ((cpp_reader *, HOST_WIDEST_INT,
59 unsigned HOST_WIDEST_INT));
60 static HOST_WIDEST_INT right_shift PARAMS ((cpp_reader *, HOST_WIDEST_INT,
62 unsigned HOST_WIDEST_INT));
63 static struct op parse_number PARAMS ((cpp_reader *, const cpp_token *));
64 static struct op parse_charconst PARAMS ((cpp_reader *, const cpp_token *));
65 static struct op parse_defined PARAMS ((cpp_reader *));
66 static struct op parse_assertion PARAMS ((cpp_reader *));
67 static HOST_WIDEST_INT parse_escape PARAMS ((cpp_reader *, const U_CHAR **,
68 const U_CHAR *, HOST_WIDEST_INT));
69 static struct op lex PARAMS ((cpp_reader *, int));
74 U_CHAR prio; /* Priority of op. */
76 U_CHAR unsignedp; /* True if value should be treated as unsigned. */
77 HOST_WIDEST_INT value; /* The value logically "right" of op. */
80 /* There is no "error" token, but we can't get comments in #if, so we can
81 abuse that token type. */
82 #define CPP_ERROR CPP_COMMENT
84 /* With -O2, gcc appears to produce nice code, moving the error
85 message load and subsequent jump completely out of the main path. */
86 #define CPP_ICE(msgid) \
87 do { cpp_ice (pfile, msgid); goto syntax_error; } while(0)
88 #define SYNTAX_ERROR(msgid) \
89 do { cpp_error (pfile, msgid); goto syntax_error; } while(0)
90 #define SYNTAX_ERROR2(msgid, arg) \
91 do { cpp_error (pfile, msgid, arg); goto syntax_error; } while(0)
93 /* Parse and convert an integer for #if. Accepts decimal, hex, or octal
94 with or without size suffixes. */
102 const struct suffix vsuf_1[] = {
103 { "u", 1, 0 }, { "U", 1, 0 },
104 { "l", 0, 1 }, { "L", 0, 1 }
107 const struct suffix vsuf_2[] = {
108 { "ul", 1, 1 }, { "UL", 1, 1 }, { "uL", 1, 1 }, { "Ul", 1, 1 },
109 { "lu", 1, 1 }, { "LU", 1, 1 }, { "Lu", 1, 1 }, { "lU", 1, 1 },
110 { "ll", 0, 2 }, { "LL", 0, 2 }
113 const struct suffix vsuf_3[] = {
114 { "ull", 1, 2 }, { "ULL", 1, 2 }, { "uLL", 1, 2 }, { "Ull", 1, 2 },
115 { "llu", 1, 2 }, { "LLU", 1, 2 }, { "LLu", 1, 2 }, { "llU", 1, 2 }
117 #define Nsuff(tab) (sizeof tab / sizeof (struct suffix))
120 parse_number (pfile, tok)
122 const cpp_token *tok;
125 const U_CHAR *start = tok->val.str.text;
126 const U_CHAR *end = start + tok->val.str.len;
127 const U_CHAR *p = start;
129 unsigned HOST_WIDEST_INT n = 0, nd, MAX_over_base;
132 int digit, largest_digit = 0;
133 const struct suffix *sufftab;
139 if (end - start >= 3 && (p[1] == 'x' || p[1] == 'X'))
151 /* Some buggy compilers (e.g. MPW C) seem to need both casts. */
152 MAX_over_base = (((unsigned HOST_WIDEST_INT) -1)
153 / ((unsigned HOST_WIDEST_INT) base));
159 if (c >= '0' && c <= '9')
161 /* We believe that in all live character sets, a-f are
162 consecutive, and so are A-F. */
163 else if (base == 16 && c >= 'a' && c <= 'f')
164 digit = c - 'a' + 10;
165 else if (base == 16 && c >= 'A' && c <= 'F')
166 digit = c - 'A' + 10;
170 if (largest_digit < digit)
171 largest_digit = digit;
172 nd = n * base + digit;
173 overflow |= MAX_over_base < n || nd < n;
179 /* Check for a floating point constant. Note that float constants
180 with an exponent or suffix but no decimal point are technically
181 invalid (C99 6.4.4.2) but accepted elsewhere. */
182 if ((c == '.' || c == 'F' || c == 'f')
183 || (base == 10 && (c == 'E' || c == 'e')
184 && p+1 < end && (p[1] == '+' || p[1] == '-'))
185 || (base == 16 && (c == 'P' || c == 'p')
186 && p+1 < end && (p[1] == '+' || p[1] == '-')))
187 SYNTAX_ERROR ("floating point numbers are not valid in #if");
189 /* Determine the suffix. l means long, and u means unsigned.
190 See the suffix tables, above. */
193 case 1: sufftab = vsuf_1; nsuff = Nsuff(vsuf_1); break;
194 case 2: sufftab = vsuf_2; nsuff = Nsuff(vsuf_2); break;
195 case 3: sufftab = vsuf_3; nsuff = Nsuff(vsuf_3); break;
196 default: goto invalid_suffix;
199 for (i = 0; i < nsuff; i++)
200 if (memcmp (p, sufftab[i].s, end - p) == 0)
204 op.unsignedp = sufftab[i].u;
206 if (CPP_WTRADITIONAL (pfile) && sufftab[i].u)
207 cpp_warning (pfile, "traditional C rejects the `U' suffix");
208 if (CPP_OPTION (pfile, c89) && sufftab[i].l == 2)
209 SYNTAX_ERROR ("too many 'l' suffixes in integer constant");
212 if (base <= largest_digit)
213 cpp_pedwarn (pfile, "integer constant contains digits beyond the radix");
216 cpp_pedwarn (pfile, "integer constant out of range");
218 /* If too big to be signed, consider it unsigned. */
219 else if ((HOST_WIDEST_INT) n < 0 && ! op.unsignedp)
222 cpp_warning (pfile, "integer constant is so large that it is unsigned");
231 cpp_error (pfile, "invalid suffix '%.*s' on integer constant",
238 /* Parse and convert a character constant for #if. Understands backslash
239 escapes (\n, \031) and multibyte characters (if so configured). */
241 parse_charconst (pfile, tok)
243 const cpp_token *tok;
246 HOST_WIDEST_INT result = 0;
249 unsigned int width = MAX_CHAR_TYPE_SIZE, mask = MAX_CHAR_TYPE_MASK;
251 const U_CHAR *ptr = tok->val.str.text;
252 const U_CHAR *end = ptr + tok->val.str.len;
256 if (tok->type == CPP_WCHAR)
257 width = MAX_WCHAR_TYPE_SIZE, mask = MAX_WCHAR_TYPE_MASK;
258 max_chars = MAX_LONG_TYPE_SIZE / width;
264 CPP_ICE ("unescaped ' in character constant");
267 c = parse_escape (pfile, &ptr, end, mask);
268 if (width < HOST_BITS_PER_INT
269 && (unsigned int) c >= (unsigned int)(1 << width))
271 "escape sequence out of range for character");
274 /* Merge character into result; ignore excess chars. */
275 if (++num_chars <= max_chars)
277 if (width < HOST_BITS_PER_INT)
278 result = (result << width) | (c & ((1 << width) - 1));
285 SYNTAX_ERROR ("empty character constant");
286 else if (num_chars > max_chars)
287 SYNTAX_ERROR ("character constant too long");
288 else if (num_chars != 1)
289 cpp_warning (pfile, "multi-character character constant");
291 /* If char type is signed, sign-extend the constant. */
292 num_bits = num_chars * width;
294 if (pfile->spec_nodes->n__CHAR_UNSIGNED__->type != T_VOID
295 || ((result >> (num_bits - 1)) & 1) == 0)
296 op.value = result & ((unsigned HOST_WIDEST_INT) ~0
297 >> (HOST_BITS_PER_WIDEST_INT - num_bits));
299 op.value = result | ~((unsigned HOST_WIDEST_INT) ~0
300 >> (HOST_BITS_PER_WIDEST_INT - num_bits));
302 /* This is always a signed type. */
313 parse_defined (pfile)
317 const cpp_token *tok;
321 tok = _cpp_get_raw_token (pfile);
322 if (tok->type == CPP_OPEN_PAREN)
325 tok = _cpp_get_raw_token (pfile);
328 if (tok->type != CPP_NAME)
329 SYNTAX_ERROR ("\"defined\" without an identifier");
331 if (paren && _cpp_get_raw_token (pfile)->type != CPP_CLOSE_PAREN)
332 SYNTAX_ERROR ("missing close paren after \"defined\"");
334 if (tok->val.node->type == T_POISON)
335 SYNTAX_ERROR2 ("attempt to use poisoned \"%s\"", tok->val.node->name);
337 op.value = tok->val.node->type != T_VOID;
348 parse_assertion (pfile)
352 struct answer *answer;
356 hp = _cpp_parse_assertion (pfile, &answer);
359 /* If we get here, the syntax is valid. */
362 op.value = (hp->type == T_ASSERTION &&
363 (answer == 0 || *_cpp_find_answer (hp, &answer->list) != 0));
366 FREE_ANSWER (answer);
371 /* Read one token. */
374 lex (pfile, skip_evaluation)
379 const cpp_token *tok;
382 tok = _cpp_get_token (pfile);
386 case CPP_PLACEMARKER:
391 return parse_number (pfile, tok);
394 return parse_charconst (pfile, tok);
398 SYNTAX_ERROR ("string constants are not valid in #if");
401 SYNTAX_ERROR ("floating point numbers are not valid in #if");
404 if (ISGRAPH (tok->val.aux))
405 SYNTAX_ERROR2 ("invalid character '%c' in #if", tok->val.aux);
407 SYNTAX_ERROR2 ("invalid character '\\%03o' in #if", tok->val.aux);
410 return parse_defined (pfile);
417 if (CPP_OPTION (pfile, warn_undef) && !skip_evaluation)
418 cpp_warning (pfile, "\"%s\" is not defined", tok->val.node->name);
422 return parse_assertion (pfile);
425 if ((tok->type > CPP_EQ && tok->type < CPP_PLUS_EQ)
426 || tok->type == CPP_EOF)
432 SYNTAX_ERROR2("'%s' is not valid in #if expressions", TOKEN_NAME (tok));
440 /* Parse a C escape sequence. STRING_PTR points to a variable
441 containing a pointer to the string to parse. That pointer
442 is updated past the characters we use. The value of the
443 escape sequence is returned.
445 If \ is followed by 000, we return 0 and leave the string pointer
446 after the zeros. A value of 0 does not mean end of string. */
448 static HOST_WIDEST_INT
449 parse_escape (pfile, string_ptr, limit, result_mask)
451 const U_CHAR **string_ptr;
453 HOST_WIDEST_INT result_mask;
455 const U_CHAR *ptr = *string_ptr;
456 /* We know we have at least one following character. */
460 case 'a': c = TARGET_BELL; break;
461 case 'b': c = TARGET_BS; break;
462 case 'f': c = TARGET_FF; break;
463 case 'n': c = TARGET_NEWLINE; break;
464 case 'r': c = TARGET_CR; break;
465 case 't': c = TARGET_TAB; break;
466 case 'v': c = TARGET_VT; break;
469 if (CPP_PEDANTIC (pfile))
470 cpp_pedwarn (pfile, "non-ISO-standard escape sequence, '\\%c'", c);
474 case '0': case '1': case '2': case '3':
475 case '4': case '5': case '6': case '7':
477 unsigned int i = c - '0';
485 if (c < '0' || c > '7')
488 i = (i << 3) + c - '0';
490 if (i != (i & result_mask))
493 cpp_pedwarn (pfile, "octal escape sequence out of range");
501 unsigned int i = 0, overflow = 0;
502 int digits_found = 0, digit;
508 if (c >= '0' && c <= '9')
510 else if (c >= 'a' && c <= 'f')
511 digit = c - 'a' + 10;
512 else if (c >= 'A' && c <= 'F')
513 digit = c - 'A' + 10;
517 overflow |= i ^ (i << 4 >> 4);
518 i = (i << 4) + digit;
522 cpp_error (pfile, "\\x used with no following hex digits");
523 if (overflow | (i != (i & result_mask)))
526 cpp_pedwarn (pfile, "hex escape sequence out of range");
537 integer_overflow (pfile)
540 if (CPP_PEDANTIC (pfile))
541 cpp_pedwarn (pfile, "integer overflow in preprocessor expression");
544 static HOST_WIDEST_INT
545 left_shift (pfile, a, unsignedp, b)
548 unsigned int unsignedp;
549 unsigned HOST_WIDEST_INT b;
551 if (b >= HOST_BITS_PER_WIDEST_INT)
553 if (! unsignedp && a != 0)
554 integer_overflow (pfile);
558 return (unsigned HOST_WIDEST_INT) a << b;
561 HOST_WIDEST_INT l = a << b;
563 integer_overflow (pfile);
568 static HOST_WIDEST_INT
569 right_shift (pfile, a, unsignedp, b)
570 cpp_reader *pfile ATTRIBUTE_UNUSED;
572 unsigned int unsignedp;
573 unsigned HOST_WIDEST_INT b;
575 if (b >= HOST_BITS_PER_WIDEST_INT)
576 return unsignedp ? 0 : a >> (HOST_BITS_PER_WIDEST_INT - 1);
578 return (unsigned HOST_WIDEST_INT) a >> b;
583 /* Operator precedence and flags table.
585 After an operator is returned from the lexer, if it has priority less
586 than or equal to the operator on the top of the stack, we reduce the
587 stack by one operator and repeat the test. Since equal priorities
588 reduce, this is naturally left-associative.
590 We handle right-associative operators by clearing the lower bit of all
591 left-associative operators, and setting it for right-associative ones.
592 After the reduction phase of a new operator, just before it is pushed
593 onto the stack, its RIGHT_ASSOC bit is cleared. The effect is that
594 during the reduction phase, the current right-associative operator has
595 a priority one greater than any other operator of otherwise equal
596 precedence that has been pushed on the top of the stack. This avoids
597 a reduction pass, and effectively makes the logic right-associative.
599 The remaining cases are '(' and ')'. We handle '(' by skipping the
600 reduction phase completely. ')' is given lower priority than
601 everything else, including '(', effectively forcing a reduction of the
602 parenthesised expression. If there is no matching '(', the stack will
603 be reduced all the way to the beginning, exiting the parser in the
604 same way as the ultra-low priority end-of-expression dummy operator.
605 The exit code checks to see if the operator that caused it is ')', and
606 if so outputs an appropriate error message.
608 The parser assumes all shifted operators require a right operand
609 unless the flag NO_R_OPERAND is set, and similarly for NO_L_OPERAND.
610 These semantics are automatically checked, any extra semantics need to
611 be handled with operator-specific code. */
614 #define FLAG_MASK ((1 << FLAG_BITS) - 1)
615 #define PRIO_SHIFT (FLAG_BITS + 1)
616 #define EXTRACT_PRIO(cnst) (cnst >> FLAG_BITS)
617 #define EXTRACT_FLAGS(cnst) (cnst & FLAG_MASK)
620 #define HAVE_VALUE (1 << 0)
621 #define NO_L_OPERAND (1 << 1)
622 #define NO_R_OPERAND (1 << 2)
623 #define SHORT_CIRCUIT (1 << 3)
625 /* Priority and flag combinations. */
626 #define RIGHT_ASSOC (1 << FLAG_BITS)
627 #define FORCE_REDUCE_PRIO (0 << PRIO_SHIFT)
628 #define CLOSE_PAREN_PRIO (1 << PRIO_SHIFT)
629 #define OPEN_PAREN_PRIO ((2 << PRIO_SHIFT) | NO_L_OPERAND)
630 #define COMMA_PRIO (3 << PRIO_SHIFT)
631 #define COND_PRIO ((4 << PRIO_SHIFT) | RIGHT_ASSOC | SHORT_CIRCUIT)
632 #define COLON_PRIO ((5 << PRIO_SHIFT) | SHORT_CIRCUIT)
633 #define OROR_PRIO ((6 << PRIO_SHIFT) | SHORT_CIRCUIT)
634 #define ANDAND_PRIO ((7 << PRIO_SHIFT) | SHORT_CIRCUIT)
635 #define OR_PRIO (8 << PRIO_SHIFT)
636 #define XOR_PRIO (9 << PRIO_SHIFT)
637 #define AND_PRIO (10 << PRIO_SHIFT)
638 #define MINMAX_PRIO (11 << PRIO_SHIFT)
639 #define EQUAL_PRIO (12 << PRIO_SHIFT)
640 #define LESS_PRIO (13 << PRIO_SHIFT)
641 #define SHIFT_PRIO (14 << PRIO_SHIFT)
642 #define PLUS_PRIO (15 << PRIO_SHIFT)
643 #define MUL_PRIO (16 << PRIO_SHIFT)
644 #define UNARY_PRIO ((17 << PRIO_SHIFT) | RIGHT_ASSOC | NO_L_OPERAND)
646 /* Operator to priority map. Must be in the same order as the first
647 N entries of enum cpp_ttype. */
651 /* EQ */ 0, /* dummy entry - can't happen */
652 /* NOT */ UNARY_PRIO,
653 /* GREATER */ LESS_PRIO,
654 /* LESS */ LESS_PRIO,
655 /* PLUS */ UNARY_PRIO, /* note these two can be unary */
656 /* MINUS */ UNARY_PRIO, /* or binary */
663 /* RSHIFT */ SHIFT_PRIO,
664 /* LSHIFT */ SHIFT_PRIO,
665 /* MIN */ MINMAX_PRIO, /* C++ specific */
666 /* MAX */ MINMAX_PRIO, /* extensions */
668 /* COMPL */ UNARY_PRIO,
669 /* AND_AND */ ANDAND_PRIO,
670 /* OR_OR */ OROR_PRIO,
671 /* QUERY */ COND_PRIO,
672 /* COLON */ COLON_PRIO,
673 /* COMMA */ COMMA_PRIO,
674 /* OPEN_PAREN */ OPEN_PAREN_PRIO,
675 /* CLOSE_PAREN */ CLOSE_PAREN_PRIO,
676 /* EQ_EQ */ EQUAL_PRIO,
677 /* NOT_EQ */ EQUAL_PRIO,
678 /* GREATER_EQ */ LESS_PRIO,
679 /* LESS_EQ */ LESS_PRIO
682 #define COMPARE(OP) \
683 top->unsignedp = 0; \
684 top->value = (unsigned1 | unsigned2) \
685 ? (unsigned HOST_WIDEST_INT) v1 OP (unsigned HOST_WIDEST_INT) v2 \
687 #define EQUALITY(OP) \
688 top->value = v1 OP v2; \
690 #define BITWISE(OP) \
691 top->value = v1 OP v2; \
692 top->unsignedp = unsigned1 | unsigned2;
694 top->value = (v1 OP v2) ? v1 : v2; \
695 top->unsignedp = unsigned1 | unsigned2;
697 top->value = OP v2; \
698 top->unsignedp = unsigned2; \
699 top->flags |= HAVE_VALUE;
700 #define SHIFT(PSH, MSH) \
701 if (skip_evaluation) \
703 top->unsignedp = unsigned1; \
704 if (v2 < 0 && ! unsigned2) \
705 top->value = MSH (pfile, v1, unsigned1, -v2); \
707 top->value = PSH (pfile, v1, unsigned1, v2);
709 /* Parse and evaluate a C expression, reading from PFILE.
710 Returns the truth value of the expression. */
712 #define TYPE_NAME(t) _cpp_token_spellings[t].name
715 _cpp_parse_expr (pfile)
718 /* The implementation is an operator precedence parser, i.e. a
719 bottom-up parser, using a stack for not-yet-reduced tokens.
721 The stack base is 'stack', and the current stack pointer is 'top'.
722 There is a stack element for each operator (only),
723 and the most recently pushed operator is 'top->op'.
724 An operand (value) is stored in the 'value' field of the stack
725 element of the operator that precedes it.
726 In that case the 'flags' field has the HAVE_VALUE flag set. */
728 #define INIT_STACK_SIZE 20
729 struct op init_stack[INIT_STACK_SIZE];
730 struct op *stack = init_stack;
731 struct op *limit = stack + INIT_STACK_SIZE;
732 register struct op *top = stack + 1;
733 int skip_evaluation = 0;
736 /* Save parser state and set it to something sane. */
737 int save_skipping = pfile->skipping;
740 /* We've finished when we try to reduce this. */
742 /* Nifty way to catch missing '('. */
743 top->prio = EXTRACT_PRIO(CLOSE_PAREN_PRIO);
744 /* Avoid missing right operand checks. */
745 top->flags = NO_R_OPERAND;
754 op = lex (pfile, skip_evaluation);
756 /* If the token is an operand, push its value and get next
757 token. If it is an operator, get its priority and flags, and
758 try to reduce the expression on the stack. */
765 /* Push a value onto the stack. */
766 if (top->flags & HAVE_VALUE)
767 SYNTAX_ERROR ("missing binary operator");
768 top->value = op.value;
769 top->unsignedp = op.unsignedp;
770 top->flags |= HAVE_VALUE;
773 case CPP_EOF: prio = FORCE_REDUCE_PRIO; break;
775 case CPP_MINUS: prio = PLUS_PRIO; if (top->flags & HAVE_VALUE) break;
776 /* else unary; fall through */
777 default: prio = op_to_prio[op.op]; break;
780 /* Separate the operator's code into priority and flags. */
781 flags = EXTRACT_FLAGS(prio);
782 prio = EXTRACT_PRIO(prio);
783 if (prio == EXTRACT_PRIO(OPEN_PAREN_PRIO))
786 /* Check for reductions. Then push the operator. */
787 while (prio <= top->prio)
789 HOST_WIDEST_INT v1, v2;
790 unsigned int unsigned1, unsigned2;
792 /* Most operators that can appear on the stack require a
793 right operand. Check this before trying to reduce. */
794 if ((top->flags & (HAVE_VALUE | NO_R_OPERAND)) == 0)
796 if (top->op == CPP_OPEN_PAREN)
797 SYNTAX_ERROR ("void expression between '(' and ')'");
799 SYNTAX_ERROR2 ("operator '%s' has no right operand",
800 TYPE_NAME (top->op));
803 unsigned2 = top->unsignedp, v2 = top->value;
805 unsigned1 = top->unsignedp, v1 = top->value;
807 /* Now set top->value = (top[1].op)(v1, v2); */
811 cpp_ice (pfile, "impossible operator type %s", TYPE_NAME (op.op));
814 case CPP_NOT: UNARY(!); break;
815 case CPP_COMPL: UNARY(~); break;
816 case CPP_LESS: COMPARE(<); break;
817 case CPP_GREATER: COMPARE(>); break;
818 case CPP_LESS_EQ: COMPARE(<=); break;
819 case CPP_GREATER_EQ: COMPARE(>=); break;
820 case CPP_EQ_EQ: EQUALITY(==); break;
821 case CPP_NOT_EQ: EQUALITY(!=); break;
822 case CPP_AND: BITWISE(&); break;
823 case CPP_XOR: BITWISE(^); break;
824 case CPP_OR: BITWISE(|); break;
825 case CPP_LSHIFT: SHIFT(left_shift, right_shift); break;
826 case CPP_RSHIFT: SHIFT(right_shift, left_shift); break;
827 case CPP_MIN: MINMAX(<); break;
828 case CPP_MAX: MINMAX(>); break;
831 if (!(top->flags & HAVE_VALUE))
833 /* Can't use UNARY(+) because K+R C did not have unary
834 plus. Can't use UNARY() because some compilers object
835 to the empty argument. */
837 top->unsignedp = unsigned2;
838 top->flags |= HAVE_VALUE;
840 if (CPP_WTRADITIONAL (pfile))
842 "traditional C rejects the unary plus operator");
846 top->value = v1 + v2;
847 top->unsignedp = unsigned1 | unsigned2;
848 if (! top->unsignedp && ! skip_evaluation
849 && ! possible_sum_sign (v1, v2, top->value))
850 integer_overflow (pfile);
854 if (!(top->flags & HAVE_VALUE))
857 if (!skip_evaluation && (top->value & v2) < 0 && !unsigned2)
858 integer_overflow (pfile);
862 top->value = v1 - v2;
863 top->unsignedp = unsigned1 | unsigned2;
864 if (! top->unsignedp && ! skip_evaluation
865 && ! possible_sum_sign (top->value, v2, v1))
866 integer_overflow (pfile);
870 top->unsignedp = unsigned1 | unsigned2;
872 top->value = (unsigned HOST_WIDEST_INT) v1 * v2;
873 else if (!skip_evaluation)
875 top->value = v1 * v2;
876 if (v1 && (top->value / v1 != v2
877 || (top->value & v1 & v2) < 0))
878 integer_overflow (pfile);
886 SYNTAX_ERROR ("division by zero in #if");
887 top->unsignedp = unsigned1 | unsigned2;
888 if (top[1].op == CPP_DIV)
891 top->value = (unsigned HOST_WIDEST_INT) v1 / v2;
894 top->value = v1 / v2;
895 if ((top->value & v1 & v2) < 0)
896 integer_overflow (pfile);
902 top->value = (unsigned HOST_WIDEST_INT) v1 % v2;
904 top->value = v1 % v2;
909 top->value = v1 || v2;
911 if (v1) skip_evaluation--;
914 top->value = v1 && v2;
916 if (!v1) skip_evaluation--;
919 if (CPP_PEDANTIC (pfile))
920 cpp_pedwarn (pfile, "comma operator in operand of #if");
922 top->unsignedp = unsigned2;
925 SYNTAX_ERROR ("syntax error '?' without following ':'");
927 if (top[0].op != CPP_QUERY)
928 SYNTAX_ERROR ("syntax error ':' without preceding '?'");
930 if (top->value) skip_evaluation--;
931 top->value = top->value ? v1 : v2;
932 top->unsignedp = unsigned1 | unsigned2;
935 if (op.op != CPP_CLOSE_PAREN)
936 SYNTAX_ERROR ("missing ')' in expression");
938 op.unsignedp = unsigned2;
941 /* Reducing this dummy operator indicates we've finished. */
942 if (op.op == CPP_CLOSE_PAREN)
943 SYNTAX_ERROR ("missing '(' in expression");
948 /* Handle short-circuit evaluations. */
949 if (flags & SHORT_CIRCUIT)
952 case CPP_OR_OR: if (top->value) skip_evaluation++; break;
954 case CPP_QUERY: if (!top->value) skip_evaluation++; break;
956 if (top[-1].value) /* Was '?' condition true? */
965 /* Check we have a left operand iff we need one. */
966 if (flags & NO_L_OPERAND)
968 if (top->flags & HAVE_VALUE)
969 SYNTAX_ERROR2 ("missing binary operator before '%s'",
974 if (!(top->flags & HAVE_VALUE))
975 SYNTAX_ERROR2 ("operator '%s' has no left operand",
979 /* Check for and handle stack overflow. */
983 struct op *new_stack;
984 int old_size = (char *) limit - (char *) stack;
985 int new_size = 2 * old_size;
986 if (stack != init_stack)
987 new_stack = (struct op *) xrealloc (stack, new_size);
990 new_stack = (struct op *) xmalloc (new_size);
991 memcpy (new_stack, stack, old_size);
994 top = (struct op *) ((char *) new_stack + old_size);
995 limit = (struct op *) ((char *) new_stack + new_size);
999 top->prio = prio & ~EXTRACT_PRIO(RIGHT_ASSOC);
1004 result = (top[1].value != 0);
1006 CPP_ICE ("unbalanced stack in #if");
1007 else if (!(top[1].flags & HAVE_VALUE))
1009 SYNTAX_ERROR ("#if with no expression");
1011 result = 0; /* Return 0 on syntax error. */
1014 /* Free dynamic stack if we allocated one. */
1015 if (stack != init_stack)
1017 pfile->skipping = save_skipping;