Add D30V options
[official-gcc.git] / gcc / cppexp.c
blobe80f8e882e3cc56c74bf004eaeff34292bc98d93
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
8 later version.
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 */
22 #include "config.h"
23 #include "system.h"
24 #include "cpplib.h"
25 #include "cpphash.h"
27 #ifndef CHAR_TYPE_SIZE
28 #define CHAR_TYPE_SIZE BITS_PER_UNIT
29 #endif
31 #ifndef INT_TYPE_SIZE
32 #define INT_TYPE_SIZE BITS_PER_WORD
33 #endif
35 #ifndef LONG_TYPE_SIZE
36 #define LONG_TYPE_SIZE BITS_PER_WORD
37 #endif
39 #ifndef WCHAR_TYPE_SIZE
40 #define WCHAR_TYPE_SIZE INT_TYPE_SIZE
41 #endif
43 #ifndef MAX_CHAR_TYPE_SIZE
44 #define MAX_CHAR_TYPE_SIZE CHAR_TYPE_SIZE
45 #endif
47 #ifndef MAX_INT_TYPE_SIZE
48 #define MAX_INT_TYPE_SIZE INT_TYPE_SIZE
49 #endif
51 #ifndef MAX_LONG_TYPE_SIZE
52 #define MAX_LONG_TYPE_SIZE LONG_TYPE_SIZE
53 #endif
55 #ifndef MAX_WCHAR_TYPE_SIZE
56 #define MAX_WCHAR_TYPE_SIZE WCHAR_TYPE_SIZE
57 #endif
59 #define MAX_CHAR_TYPE_MASK (MAX_CHAR_TYPE_SIZE < HOST_BITS_PER_WIDEST_INT \
60 ? (~(~(HOST_WIDEST_INT) 0 << MAX_CHAR_TYPE_SIZE)) \
61 : ~ (HOST_WIDEST_INT) 0)
63 #define MAX_WCHAR_TYPE_MASK (MAX_WCHAR_TYPE_SIZE < HOST_BITS_PER_WIDEST_INT \
64 ? ~(~(HOST_WIDEST_INT) 0 << MAX_WCHAR_TYPE_SIZE) \
65 : ~ (HOST_WIDEST_INT) 0)
67 /* Yield nonzero if adding two numbers with A's and B's signs can yield a
68 number with SUM's sign, where A, B, and SUM are all C integers. */
69 #define possible_sum_sign(a, b, sum) ((((a) ^ (b)) | ~ ((a) ^ (sum))) < 0)
71 static void integer_overflow PARAMS ((cpp_reader *));
72 static HOST_WIDEST_INT left_shift PARAMS ((cpp_reader *, HOST_WIDEST_INT,
73 unsigned int,
74 unsigned HOST_WIDEST_INT));
75 static HOST_WIDEST_INT right_shift PARAMS ((cpp_reader *, HOST_WIDEST_INT,
76 unsigned int,
77 unsigned HOST_WIDEST_INT));
78 static struct op parse_number PARAMS ((cpp_reader *, const cpp_token *));
79 static struct op parse_charconst PARAMS ((cpp_reader *, const cpp_token *));
80 static struct op parse_defined PARAMS ((cpp_reader *));
81 static struct op parse_assertion PARAMS ((cpp_reader *));
82 static HOST_WIDEST_INT parse_escape PARAMS ((cpp_reader *, const U_CHAR **,
83 const U_CHAR *, HOST_WIDEST_INT));
84 static struct op lex PARAMS ((cpp_reader *, int));
86 struct op
88 enum cpp_ttype op;
89 U_CHAR prio; /* Priority of op. */
90 U_CHAR flags;
91 U_CHAR unsignedp; /* True if value should be treated as unsigned. */
92 HOST_WIDEST_INT value; /* The value logically "right" of op. */
95 /* There is no "error" token, but we can't get comments in #if, so we can
96 abuse that token type. */
97 #define CPP_ERROR CPP_COMMENT
99 /* With -O2, gcc appears to produce nice code, moving the error
100 message load and subsequent jump completely out of the main path. */
101 #define CPP_ICE(msgid) \
102 do { cpp_ice (pfile, msgid); goto syntax_error; } while(0)
103 #define SYNTAX_ERROR(msgid) \
104 do { cpp_error (pfile, msgid); goto syntax_error; } while(0)
105 #define SYNTAX_ERROR2(msgid, arg) \
106 do { cpp_error (pfile, msgid, arg); goto syntax_error; } while(0)
108 /* Parse and convert an integer for #if. Accepts decimal, hex, or octal
109 with or without size suffixes. */
110 struct suffix
112 unsigned char s[4];
113 unsigned char u;
114 unsigned char l;
117 const struct suffix vsuf_1[] = {
118 { "u", 1, 0 }, { "U", 1, 0 },
119 { "l", 0, 1 }, { "L", 0, 1 }
122 const struct suffix vsuf_2[] = {
123 { "ul", 1, 1 }, { "UL", 1, 1 }, { "uL", 1, 1 }, { "Ul", 1, 1 },
124 { "lu", 1, 1 }, { "LU", 1, 1 }, { "Lu", 1, 1 }, { "lU", 1, 1 },
125 { "ll", 0, 2 }, { "LL", 0, 2 }
128 const struct suffix vsuf_3[] = {
129 { "ull", 1, 2 }, { "ULL", 1, 2 }, { "uLL", 1, 2 }, { "Ull", 1, 2 },
130 { "llu", 1, 2 }, { "LLU", 1, 2 }, { "LLu", 1, 2 }, { "llU", 1, 2 }
132 #define Nsuff(tab) (sizeof tab / sizeof (struct suffix))
134 static struct op
135 parse_number (pfile, tok)
136 cpp_reader *pfile;
137 const cpp_token *tok;
139 struct op op;
140 const U_CHAR *start = tok->val.str.text;
141 const U_CHAR *end = start + tok->val.str.len;
142 const U_CHAR *p = start;
143 int c = 0, i, nsuff;
144 unsigned HOST_WIDEST_INT n = 0, nd, MAX_over_base;
145 int base = 10;
146 int overflow = 0;
147 int digit, largest_digit = 0;
148 const struct suffix *sufftab;
150 op.unsignedp = 0;
152 if (p[0] == '0')
154 if (end - start >= 3 && (p[1] == 'x' || p[1] == 'X'))
156 p += 2;
157 base = 16;
159 else
161 p += 1;
162 base = 8;
166 /* Some buggy compilers (e.g. MPW C) seem to need both casts. */
167 MAX_over_base = (((unsigned HOST_WIDEST_INT) -1)
168 / ((unsigned HOST_WIDEST_INT) base));
170 for(; p < end; p++)
172 c = *p;
174 if (c >= '0' && c <= '9')
175 digit = c - '0';
176 /* We believe that in all live character sets, a-f are
177 consecutive, and so are A-F. */
178 else if (base == 16 && c >= 'a' && c <= 'f')
179 digit = c - 'a' + 10;
180 else if (base == 16 && c >= 'A' && c <= 'F')
181 digit = c - 'A' + 10;
182 else
183 break;
185 if (largest_digit < digit)
186 largest_digit = digit;
187 nd = n * base + digit;
188 overflow |= MAX_over_base < n || nd < n;
189 n = nd;
192 if (p < end)
194 /* Check for a floating point constant. Note that float constants
195 with an exponent or suffix but no decimal point are technically
196 illegal (C99 6.4.4.2) but accepted elsewhere. */
197 if ((c == '.' || c == 'F' || c == 'f')
198 || (base == 10 && (c == 'E' || c == 'e')
199 && p+1 < end && (p[1] == '+' || p[1] == '-'))
200 || (base == 16 && (c == 'P' || c == 'p')
201 && p+1 < end && (p[1] == '+' || p[1] == '-')))
202 SYNTAX_ERROR ("floating point numbers are not valid in #if");
204 /* Determine the suffix. l means long, and u means unsigned.
205 See the suffix tables, above. */
206 switch (end - p)
208 case 1: sufftab = vsuf_1; nsuff = Nsuff(vsuf_1); break;
209 case 2: sufftab = vsuf_2; nsuff = Nsuff(vsuf_2); break;
210 case 3: sufftab = vsuf_3; nsuff = Nsuff(vsuf_3); break;
211 default: goto invalid_suffix;
214 for (i = 0; i < nsuff; i++)
215 if (memcmp (p, sufftab[i].s, end - p) == 0)
216 break;
217 if (i == nsuff)
218 goto invalid_suffix;
219 op.unsignedp = sufftab[i].u;
221 if (CPP_OPTION (pfile, c89) && sufftab[i].l == 2)
222 SYNTAX_ERROR ("too many 'l' suffixes in integer constant");
225 if (base <= largest_digit)
226 cpp_pedwarn (pfile, "integer constant contains digits beyond the radix");
228 if (overflow)
229 cpp_pedwarn (pfile, "integer constant out of range");
231 /* If too big to be signed, consider it unsigned. */
232 else if ((HOST_WIDEST_INT) n < 0 && ! op.unsignedp)
234 if (base == 10)
235 cpp_warning (pfile, "integer constant is so large that it is unsigned");
236 op.unsignedp = 1;
239 op.value = n;
240 op.op = CPP_INT;
241 return op;
243 invalid_suffix:
244 cpp_error (pfile, "invalid suffix '%.*s' on integer constant",
245 (int) (end - p), p);
246 syntax_error:
247 op.op = CPP_ERROR;
248 return op;
251 /* Parse and convert a character constant for #if. Understands backslash
252 escapes (\n, \031) and multibyte characters (if so configured). */
253 static struct op
254 parse_charconst (pfile, tok)
255 cpp_reader *pfile;
256 const cpp_token *tok;
258 struct op op;
259 HOST_WIDEST_INT result = 0;
260 int num_chars = 0;
261 int num_bits;
262 unsigned int width = MAX_CHAR_TYPE_SIZE, mask = MAX_CHAR_TYPE_MASK;
263 int max_chars;
264 const U_CHAR *ptr = tok->val.str.text;
265 const U_CHAR *end = ptr + tok->val.str.len;
267 int c = -1;
269 if (tok->type == CPP_WCHAR)
270 width = MAX_WCHAR_TYPE_SIZE, mask = MAX_WCHAR_TYPE_MASK;
271 max_chars = MAX_LONG_TYPE_SIZE / width;
273 while (ptr < end)
275 c = *ptr++;
276 if (c == '\'')
277 CPP_ICE ("unescaped ' in character constant");
278 else if (c == '\\')
280 c = parse_escape (pfile, &ptr, end, mask);
281 if (width < HOST_BITS_PER_INT
282 && (unsigned int) c >= (unsigned int)(1 << width))
283 cpp_pedwarn (pfile,
284 "escape sequence out of range for character");
287 /* Merge character into result; ignore excess chars. */
288 if (++num_chars <= max_chars)
290 if (width < HOST_BITS_PER_INT)
291 result = (result << width) | (c & ((1 << width) - 1));
292 else
293 result = c;
297 if (num_chars == 0)
298 SYNTAX_ERROR ("empty character constant");
299 else if (num_chars > max_chars)
300 SYNTAX_ERROR ("character constant too long");
301 else if (num_chars != 1)
302 cpp_warning (pfile, "multi-character character constant");
304 /* If char type is signed, sign-extend the constant. */
305 num_bits = num_chars * width;
307 if (pfile->spec_nodes->n__CHAR_UNSIGNED__->type != T_VOID
308 || ((result >> (num_bits - 1)) & 1) == 0)
309 op.value = result & ((unsigned HOST_WIDEST_INT) ~0
310 >> (HOST_BITS_PER_WIDEST_INT - num_bits));
311 else
312 op.value = result | ~((unsigned HOST_WIDEST_INT) ~0
313 >> (HOST_BITS_PER_WIDEST_INT - num_bits));
315 /* This is always a signed type. */
316 op.unsignedp = 0;
317 op.op = CPP_INT;
318 return op;
320 syntax_error:
321 op.op = CPP_ERROR;
322 return op;
325 static struct op
326 parse_defined (pfile)
327 cpp_reader *pfile;
329 int paren;
330 const cpp_token *tok;
331 struct op op;
333 paren = 0;
334 tok = _cpp_get_raw_token (pfile);
335 if (tok->type == CPP_OPEN_PAREN)
337 paren = 1;
338 tok = _cpp_get_raw_token (pfile);
341 if (tok->type != CPP_NAME)
342 SYNTAX_ERROR ("\"defined\" without an identifier");
344 if (paren && _cpp_get_raw_token (pfile)->type != CPP_CLOSE_PAREN)
345 SYNTAX_ERROR ("missing close paren after \"defined\"");
347 if (tok->val.node->type == T_POISON)
348 SYNTAX_ERROR2 ("attempt to use poisoned \"%s\"", tok->val.node->name);
350 op.value = tok->val.node->type != T_VOID;
351 op.unsignedp = 0;
352 op.op = CPP_INT;
353 return op;
355 syntax_error:
356 op.op = CPP_ERROR;
357 return op;
360 static struct op
361 parse_assertion (pfile)
362 cpp_reader *pfile;
364 struct op op;
365 struct answer *answer;
366 cpp_hashnode *hp;
368 op.op = CPP_ERROR;
369 hp = _cpp_parse_assertion (pfile, &answer);
370 if (hp)
372 /* If we get here, the syntax is valid. */
373 op.op = CPP_INT;
374 op.unsignedp = 0;
375 op.value = (hp->type == T_ASSERTION &&
376 (answer == 0 || *_cpp_find_answer (hp, &answer->list) != 0));
378 if (answer)
379 FREE_ANSWER (answer);
381 return op;
384 /* Read one token. */
386 static struct op
387 lex (pfile, skip_evaluation)
388 cpp_reader *pfile;
389 int skip_evaluation;
391 struct op op;
392 const cpp_token *tok;
394 retry:
395 tok = _cpp_get_token (pfile);
397 switch (tok->type)
399 case CPP_PLACEMARKER:
400 goto retry;
402 case CPP_INT:
403 case CPP_NUMBER:
404 return parse_number (pfile, tok);
405 case CPP_CHAR:
406 case CPP_WCHAR:
407 return parse_charconst (pfile, tok);
409 case CPP_STRING:
410 case CPP_WSTRING:
411 SYNTAX_ERROR ("string constants are not valid in #if");
413 case CPP_FLOAT:
414 SYNTAX_ERROR ("floating point numbers are not valid in #if");
416 case CPP_OTHER:
417 if (ISGRAPH (tok->val.aux))
418 SYNTAX_ERROR2 ("invalid character '%c' in #if", tok->val.aux);
419 else
420 SYNTAX_ERROR2 ("invalid character '\\%03o' in #if", tok->val.aux);
422 case CPP_DEFINED:
423 return parse_defined (pfile);
425 case CPP_NAME:
426 op.op = CPP_INT;
427 op.unsignedp = 0;
428 op.value = 0;
430 if (CPP_OPTION (pfile, warn_undef) && !skip_evaluation)
431 cpp_warning (pfile, "\"%s\" is not defined", tok->val.node->name);
432 return op;
434 case CPP_HASH:
435 return parse_assertion (pfile);
437 default:
438 if ((tok->type > CPP_EQ && tok->type < CPP_PLUS_EQ)
439 || tok->type == CPP_EOF)
441 op.op = tok->type;
442 return op;
445 SYNTAX_ERROR2("'%s' is not valid in #if expressions", TOKEN_NAME (tok));
448 syntax_error:
449 op.op = CPP_ERROR;
450 return op;
453 /* Parse a C escape sequence. STRING_PTR points to a variable
454 containing a pointer to the string to parse. That pointer
455 is updated past the characters we use. The value of the
456 escape sequence is returned.
458 If \ is followed by 000, we return 0 and leave the string pointer
459 after the zeros. A value of 0 does not mean end of string. */
461 static HOST_WIDEST_INT
462 parse_escape (pfile, string_ptr, limit, result_mask)
463 cpp_reader *pfile;
464 const U_CHAR **string_ptr;
465 const U_CHAR *limit;
466 HOST_WIDEST_INT result_mask;
468 const U_CHAR *ptr = *string_ptr;
469 /* We know we have at least one following character. */
470 int c = *ptr++;
471 switch (c)
473 case 'a': c = TARGET_BELL; break;
474 case 'b': c = TARGET_BS; break;
475 case 'f': c = TARGET_FF; break;
476 case 'n': c = TARGET_NEWLINE; break;
477 case 'r': c = TARGET_CR; break;
478 case 't': c = TARGET_TAB; break;
479 case 'v': c = TARGET_VT; break;
481 case 'e': case 'E':
482 if (CPP_PEDANTIC (pfile))
483 cpp_pedwarn (pfile, "non-ISO-standard escape sequence, '\\%c'", c);
484 c = TARGET_ESC;
485 break;
487 case '0': case '1': case '2': case '3':
488 case '4': case '5': case '6': case '7':
490 unsigned int i = c - '0';
491 int count = 0;
492 while (++count < 3)
494 if (ptr >= limit)
495 break;
497 c = *ptr;
498 if (c < '0' || c > '7')
499 break;
500 ptr++;
501 i = (i << 3) + c - '0';
503 if (i != (i & result_mask))
505 i &= result_mask;
506 cpp_pedwarn (pfile, "octal escape sequence out of range");
508 c = i;
509 break;
512 case 'x':
514 unsigned int i = 0, overflow = 0;
515 int digits_found = 0, digit;
516 for (;;)
518 if (ptr >= limit)
519 break;
520 c = *ptr;
521 if (c >= '0' && c <= '9')
522 digit = c - '0';
523 else if (c >= 'a' && c <= 'f')
524 digit = c - 'a' + 10;
525 else if (c >= 'A' && c <= 'F')
526 digit = c - 'A' + 10;
527 else
528 break;
529 ptr++;
530 overflow |= i ^ (i << 4 >> 4);
531 i = (i << 4) + digit;
532 digits_found = 1;
534 if (!digits_found)
535 cpp_error (pfile, "\\x used with no following hex digits");
536 if (overflow | (i != (i & result_mask)))
538 i &= result_mask;
539 cpp_pedwarn (pfile, "hex escape sequence out of range");
541 c = i;
542 break;
545 *string_ptr = ptr;
546 return c;
549 static void
550 integer_overflow (pfile)
551 cpp_reader *pfile;
553 if (CPP_PEDANTIC (pfile))
554 cpp_pedwarn (pfile, "integer overflow in preprocessor expression");
557 static HOST_WIDEST_INT
558 left_shift (pfile, a, unsignedp, b)
559 cpp_reader *pfile;
560 HOST_WIDEST_INT a;
561 unsigned int unsignedp;
562 unsigned HOST_WIDEST_INT b;
564 if (b >= HOST_BITS_PER_WIDEST_INT)
566 if (! unsignedp && a != 0)
567 integer_overflow (pfile);
568 return 0;
570 else if (unsignedp)
571 return (unsigned HOST_WIDEST_INT) a << b;
572 else
574 HOST_WIDEST_INT l = a << b;
575 if (l >> b != a)
576 integer_overflow (pfile);
577 return l;
581 static HOST_WIDEST_INT
582 right_shift (pfile, a, unsignedp, b)
583 cpp_reader *pfile ATTRIBUTE_UNUSED;
584 HOST_WIDEST_INT a;
585 unsigned int unsignedp;
586 unsigned HOST_WIDEST_INT b;
588 if (b >= HOST_BITS_PER_WIDEST_INT)
589 return unsignedp ? 0 : a >> (HOST_BITS_PER_WIDEST_INT - 1);
590 else if (unsignedp)
591 return (unsigned HOST_WIDEST_INT) a >> b;
592 else
593 return a >> b;
596 /* Operator precedence and flags table.
598 After an operator is returned from the lexer, if it has priority less
599 than or equal to the operator on the top of the stack, we reduce the
600 stack by one operator and repeat the test. Since equal priorities
601 reduce, this is naturally left-associative.
603 We handle right-associative operators by clearing the lower bit of all
604 left-associative operators, and setting it for right-associative ones.
605 After the reduction phase of a new operator, just before it is pushed
606 onto the stack, its RIGHT_ASSOC bit is cleared. The effect is that
607 during the reduction phase, the current right-associative operator has
608 a priority one greater than any other operator of otherwise equal
609 precedence that has been pushed on the top of the stack. This avoids
610 a reduction pass, and effectively makes the logic right-associative.
612 The remaining cases are '(' and ')'. We handle '(' by skipping the
613 reduction phase completely. ')' is given lower priority than
614 everything else, including '(', effectively forcing a reduction of the
615 parenthesised expression. If there is no matching '(', the stack will
616 be reduced all the way to the beginning, exiting the parser in the
617 same way as the ultra-low priority end-of-expression dummy operator.
618 The exit code checks to see if the operator that caused it is ')', and
619 if so outputs an appropriate error message.
621 The parser assumes all shifted operators require a right operand
622 unless the flag NO_R_OPERAND is set, and similarly for NO_L_OPERAND.
623 These semantics are automatically checked, any extra semantics need to
624 be handled with operator-specific code. */
626 #define FLAG_BITS 8
627 #define FLAG_MASK ((1 << FLAG_BITS) - 1)
628 #define PRIO_SHIFT (FLAG_BITS + 1)
629 #define EXTRACT_PRIO(cnst) (cnst >> FLAG_BITS)
630 #define EXTRACT_FLAGS(cnst) (cnst & FLAG_MASK)
632 /* Flags. */
633 #define HAVE_VALUE (1 << 0)
634 #define NO_L_OPERAND (1 << 1)
635 #define NO_R_OPERAND (1 << 2)
636 #define SHORT_CIRCUIT (1 << 3)
638 /* Priority and flag combinations. */
639 #define RIGHT_ASSOC (1 << FLAG_BITS)
640 #define FORCE_REDUCE_PRIO (0 << PRIO_SHIFT)
641 #define CLOSE_PAREN_PRIO (1 << PRIO_SHIFT)
642 #define OPEN_PAREN_PRIO ((2 << PRIO_SHIFT) | NO_L_OPERAND)
643 #define COMMA_PRIO (3 << PRIO_SHIFT)
644 #define COND_PRIO ((4 << PRIO_SHIFT) | RIGHT_ASSOC | SHORT_CIRCUIT)
645 #define COLON_PRIO ((5 << PRIO_SHIFT) | SHORT_CIRCUIT)
646 #define OROR_PRIO ((6 << PRIO_SHIFT) | SHORT_CIRCUIT)
647 #define ANDAND_PRIO ((7 << PRIO_SHIFT) | SHORT_CIRCUIT)
648 #define OR_PRIO (8 << PRIO_SHIFT)
649 #define XOR_PRIO (9 << PRIO_SHIFT)
650 #define AND_PRIO (10 << PRIO_SHIFT)
651 #define MINMAX_PRIO (11 << PRIO_SHIFT)
652 #define EQUAL_PRIO (12 << PRIO_SHIFT)
653 #define LESS_PRIO (13 << PRIO_SHIFT)
654 #define SHIFT_PRIO (14 << PRIO_SHIFT)
655 #define PLUS_PRIO (15 << PRIO_SHIFT)
656 #define MUL_PRIO (16 << PRIO_SHIFT)
657 #define UNARY_PRIO ((17 << PRIO_SHIFT) | RIGHT_ASSOC | NO_L_OPERAND)
659 /* Operator to priority map. Must be in the same order as the first
660 N entries of enum cpp_ttype. */
661 static const short
662 op_to_prio[] =
664 /* EQ */ 0, /* dummy entry - can't happen */
665 /* NOT */ UNARY_PRIO,
666 /* GREATER */ LESS_PRIO,
667 /* LESS */ LESS_PRIO,
668 /* PLUS */ UNARY_PRIO, /* note these two can be unary */
669 /* MINUS */ UNARY_PRIO, /* or binary */
670 /* MULT */ MUL_PRIO,
671 /* DIV */ MUL_PRIO,
672 /* MOD */ MUL_PRIO,
673 /* AND */ AND_PRIO,
674 /* OR */ OR_PRIO,
675 /* XOR */ XOR_PRIO,
676 /* RSHIFT */ SHIFT_PRIO,
677 /* LSHIFT */ SHIFT_PRIO,
678 /* MIN */ MINMAX_PRIO, /* C++ specific */
679 /* MAX */ MINMAX_PRIO, /* extensions */
681 /* COMPL */ UNARY_PRIO,
682 /* AND_AND */ ANDAND_PRIO,
683 /* OR_OR */ OROR_PRIO,
684 /* QUERY */ COND_PRIO,
685 /* COLON */ COLON_PRIO,
686 /* COMMA */ COMMA_PRIO,
687 /* OPEN_PAREN */ OPEN_PAREN_PRIO,
688 /* CLOSE_PAREN */ CLOSE_PAREN_PRIO,
689 /* EQ_EQ */ EQUAL_PRIO,
690 /* NOT_EQ */ EQUAL_PRIO,
691 /* GREATER_EQ */ LESS_PRIO,
692 /* LESS_EQ */ LESS_PRIO
695 #define COMPARE(OP) \
696 top->unsignedp = 0; \
697 top->value = (unsigned1 | unsigned2) \
698 ? (unsigned HOST_WIDEST_INT) v1 OP (unsigned HOST_WIDEST_INT) v2 \
699 : (v1 OP v2)
700 #define EQUALITY(OP) \
701 top->value = v1 OP v2; \
702 top->unsignedp = 0;
703 #define BITWISE(OP) \
704 top->value = v1 OP v2; \
705 top->unsignedp = unsigned1 | unsigned2;
706 #define MINMAX(OP) \
707 top->value = (v1 OP v2) ? v1 : v2; \
708 top->unsignedp = unsigned1 | unsigned2;
709 #define UNARY(OP) \
710 top->value = OP v2; \
711 top->unsignedp = unsigned2; \
712 top->flags |= HAVE_VALUE;
713 #define SHIFT(PSH, MSH) \
714 if (skip_evaluation) \
715 break; \
716 top->unsignedp = unsigned1; \
717 if (v2 < 0 && ! unsigned2) \
718 top->value = MSH (pfile, v1, unsigned1, -v2); \
719 else \
720 top->value = PSH (pfile, v1, unsigned1, v2);
722 /* Parse and evaluate a C expression, reading from PFILE.
723 Returns the truth value of the expression. */
725 #define TYPE_NAME(t) _cpp_token_spellings[t].name
728 _cpp_parse_expr (pfile)
729 cpp_reader *pfile;
731 /* The implementation is an operator precedence parser, i.e. a
732 bottom-up parser, using a stack for not-yet-reduced tokens.
734 The stack base is 'stack', and the current stack pointer is 'top'.
735 There is a stack element for each operator (only),
736 and the most recently pushed operator is 'top->op'.
737 An operand (value) is stored in the 'value' field of the stack
738 element of the operator that precedes it.
739 In that case the 'flags' field has the HAVE_VALUE flag set. */
741 #define INIT_STACK_SIZE 20
742 struct op init_stack[INIT_STACK_SIZE];
743 struct op *stack = init_stack;
744 struct op *limit = stack + INIT_STACK_SIZE;
745 register struct op *top = stack + 1;
746 int skip_evaluation = 0;
747 int result;
749 /* Save parser state and set it to something sane. */
750 int save_skipping = pfile->skipping;
751 pfile->skipping = 0;
753 /* We've finished when we try to reduce this. */
754 top->op = CPP_EOF;
755 /* Nifty way to catch missing '('. */
756 top->prio = EXTRACT_PRIO(CLOSE_PAREN_PRIO);
757 /* Avoid missing right operand checks. */
758 top->flags = NO_R_OPERAND;
760 for (;;)
762 unsigned int prio;
763 unsigned int flags;
764 struct op op;
766 /* Read a token */
767 op = lex (pfile, skip_evaluation);
769 /* If the token is an operand, push its value and get next
770 token. If it is an operator, get its priority and flags, and
771 try to reduce the expression on the stack. */
772 switch (op.op)
774 case CPP_ERROR:
775 goto syntax_error;
776 push_immediate:
777 case CPP_INT:
778 /* Push a value onto the stack. */
779 if (top->flags & HAVE_VALUE)
780 SYNTAX_ERROR ("missing binary operator");
781 top->value = op.value;
782 top->unsignedp = op.unsignedp;
783 top->flags |= HAVE_VALUE;
784 continue;
786 case CPP_EOF: prio = FORCE_REDUCE_PRIO; break;
787 case CPP_PLUS:
788 case CPP_MINUS: prio = PLUS_PRIO; if (top->flags & HAVE_VALUE) break;
789 /* else unary; fall through */
790 default: prio = op_to_prio[op.op]; break;
793 /* Separate the operator's code into priority and flags. */
794 flags = EXTRACT_FLAGS(prio);
795 prio = EXTRACT_PRIO(prio);
796 if (prio == EXTRACT_PRIO(OPEN_PAREN_PRIO))
797 goto skip_reduction;
799 /* Check for reductions. Then push the operator. */
800 while (prio <= top->prio)
802 HOST_WIDEST_INT v1, v2;
803 unsigned int unsigned1, unsigned2;
805 /* Most operators that can appear on the stack require a
806 right operand. Check this before trying to reduce. */
807 if ((top->flags & (HAVE_VALUE | NO_R_OPERAND)) == 0)
809 if (top->op == CPP_OPEN_PAREN)
810 SYNTAX_ERROR ("void expression between '(' and ')'");
811 else
812 SYNTAX_ERROR2 ("operator '%s' has no right operand",
813 TYPE_NAME (top->op));
816 unsigned2 = top->unsignedp, v2 = top->value;
817 top--;
818 unsigned1 = top->unsignedp, v1 = top->value;
820 /* Now set top->value = (top[1].op)(v1, v2); */
821 switch (top[1].op)
823 default:
824 cpp_ice (pfile, "impossible operator type %s", TYPE_NAME (op.op));
825 goto syntax_error;
827 case CPP_NOT: UNARY(!); break;
828 case CPP_COMPL: UNARY(~); break;
829 case CPP_LESS: COMPARE(<); break;
830 case CPP_GREATER: COMPARE(>); break;
831 case CPP_LESS_EQ: COMPARE(<=); break;
832 case CPP_GREATER_EQ: COMPARE(>=); break;
833 case CPP_EQ_EQ: EQUALITY(==); break;
834 case CPP_NOT_EQ: EQUALITY(!=); break;
835 case CPP_AND: BITWISE(&); break;
836 case CPP_XOR: BITWISE(^); break;
837 case CPP_OR: BITWISE(|); break;
838 case CPP_LSHIFT: SHIFT(left_shift, right_shift); break;
839 case CPP_RSHIFT: SHIFT(right_shift, left_shift); break;
840 case CPP_MIN: MINMAX(<); break;
841 case CPP_MAX: MINMAX(>); break;
843 case CPP_PLUS:
844 if (!(top->flags & HAVE_VALUE))
846 /* Can't use UNARY(+) because K+R C did not have unary
847 plus. Can't use UNARY() because some compilers object
848 to the empty argument. */
849 top->value = v2;
850 top->unsignedp = unsigned2;
851 top->flags |= HAVE_VALUE;
853 else
855 top->value = v1 + v2;
856 top->unsignedp = unsigned1 | unsigned2;
857 if (! top->unsignedp && ! skip_evaluation
858 && ! possible_sum_sign (v1, v2, top->value))
859 integer_overflow (pfile);
861 break;
862 case CPP_MINUS:
863 if (!(top->flags & HAVE_VALUE))
865 UNARY(-);
866 if (!skip_evaluation && (top->value & v2) < 0 && !unsigned2)
867 integer_overflow (pfile);
869 else
870 { /* Binary '-' */
871 top->value = v1 - v2;
872 top->unsignedp = unsigned1 | unsigned2;
873 if (! top->unsignedp && ! skip_evaluation
874 && ! possible_sum_sign (top->value, v2, v1))
875 integer_overflow (pfile);
877 break;
878 case CPP_MULT:
879 top->unsignedp = unsigned1 | unsigned2;
880 if (top->unsignedp)
881 top->value = (unsigned HOST_WIDEST_INT) v1 * v2;
882 else if (!skip_evaluation)
884 top->value = v1 * v2;
885 if (v1 && (top->value / v1 != v2
886 || (top->value & v1 & v2) < 0))
887 integer_overflow (pfile);
889 break;
890 case CPP_DIV:
891 case CPP_MOD:
892 if (skip_evaluation)
893 break;
894 if (v2 == 0)
895 SYNTAX_ERROR ("division by zero in #if");
896 top->unsignedp = unsigned1 | unsigned2;
897 if (top[1].op == CPP_DIV)
899 if (top->unsignedp)
900 top->value = (unsigned HOST_WIDEST_INT) v1 / v2;
901 else
903 top->value = v1 / v2;
904 if ((top->value & v1 & v2) < 0)
905 integer_overflow (pfile);
908 else
910 if (top->unsignedp)
911 top->value = (unsigned HOST_WIDEST_INT) v1 % v2;
912 else
913 top->value = v1 % v2;
915 break;
917 case CPP_OR_OR:
918 top->value = v1 || v2;
919 top->unsignedp = 0;
920 if (v1) skip_evaluation--;
921 break;
922 case CPP_AND_AND:
923 top->value = v1 && v2;
924 top->unsignedp = 0;
925 if (!v1) skip_evaluation--;
926 break;
927 case CPP_COMMA:
928 if (CPP_PEDANTIC (pfile))
929 cpp_pedwarn (pfile, "comma operator in operand of #if");
930 top->value = v2;
931 top->unsignedp = unsigned2;
932 break;
933 case CPP_QUERY:
934 SYNTAX_ERROR ("syntax error '?' without following ':'");
935 case CPP_COLON:
936 if (top[0].op != CPP_QUERY)
937 SYNTAX_ERROR ("syntax error ':' without preceding '?'");
938 top--;
939 if (top->value) skip_evaluation--;
940 top->value = top->value ? v1 : v2;
941 top->unsignedp = unsigned1 | unsigned2;
942 break;
943 case CPP_OPEN_PAREN:
944 if (op.op != CPP_CLOSE_PAREN)
945 SYNTAX_ERROR ("missing ')' in expression");
946 op.value = v2;
947 op.unsignedp = unsigned2;
948 goto push_immediate;
949 case CPP_EOF:
950 /* Reducing this dummy operator indicates we've finished. */
951 if (op.op == CPP_CLOSE_PAREN)
952 SYNTAX_ERROR ("missing '(' in expression");
953 goto done;
957 /* Handle short-circuit evaluations. */
958 if (flags & SHORT_CIRCUIT)
959 switch (op.op)
961 case CPP_OR_OR: if (top->value) skip_evaluation++; break;
962 case CPP_AND_AND:
963 case CPP_QUERY: if (!top->value) skip_evaluation++; break;
964 case CPP_COLON:
965 if (top[-1].value) /* Was '?' condition true? */
966 skip_evaluation++;
967 else
968 skip_evaluation--;
969 default:
970 break;
973 skip_reduction:
974 /* Check we have a left operand iff we need one. */
975 if (flags & NO_L_OPERAND)
977 if (top->flags & HAVE_VALUE)
978 SYNTAX_ERROR2 ("missing binary operator before '%s'",
979 TYPE_NAME (op.op));
981 else
983 if (!(top->flags & HAVE_VALUE))
984 SYNTAX_ERROR2 ("operator '%s' has no left operand",
985 TYPE_NAME (op.op));
988 /* Check for and handle stack overflow. */
989 top++;
990 if (top == limit)
992 struct op *new_stack;
993 int old_size = (char *) limit - (char *) stack;
994 int new_size = 2 * old_size;
995 if (stack != init_stack)
996 new_stack = (struct op *) xrealloc (stack, new_size);
997 else
999 new_stack = (struct op *) xmalloc (new_size);
1000 memcpy (new_stack, stack, old_size);
1002 stack = new_stack;
1003 top = (struct op *) ((char *) new_stack + old_size);
1004 limit = (struct op *) ((char *) new_stack + new_size);
1007 top->flags = flags;
1008 top->prio = prio & ~EXTRACT_PRIO(RIGHT_ASSOC);
1009 top->op = op.op;
1012 done:
1013 result = (top[1].value != 0);
1014 if (top != stack)
1015 CPP_ICE ("unbalanced stack in #if");
1016 else if (!(top[1].flags & HAVE_VALUE))
1018 SYNTAX_ERROR ("#if with no expression");
1019 syntax_error:
1020 result = 0; /* Return 0 on syntax error. */
1023 /* Free dynamic stack if we allocated one. */
1024 if (stack != init_stack)
1025 free (stack);
1026 pfile->skipping = save_skipping;
1027 return result;