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