OSDN Git Service

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