xref: /netbsd-src/external/gpl3/gcc/dist/libcpp/expr.cc (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 /* Parse C expressions for cpplib.
2    Copyright (C) 1987-2022 Free Software Foundation, Inc.
3    Contributed by Per Bothner, 1994.
4 
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the
7 Free Software Foundation; either version 3, or (at your option) any
8 later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program; see the file COPYING3.  If not see
17 <http://www.gnu.org/licenses/>.  */
18 
19 #include "config.h"
20 #include "system.h"
21 #include "cpplib.h"
22 #include "internal.h"
23 
24 #define PART_PRECISION (sizeof (cpp_num_part) * CHAR_BIT)
25 #define HALF_MASK (~(cpp_num_part) 0 >> (PART_PRECISION / 2))
26 #define LOW_PART(num_part) (num_part & HALF_MASK)
27 #define HIGH_PART(num_part) (num_part >> (PART_PRECISION / 2))
28 
29 struct op
30 {
31   const cpp_token *token;	/* The token forming op (for diagnostics).  */
32   cpp_num value;		/* The value logically "right" of op.  */
33   location_t loc;          /* The location of this value.         */
34   enum cpp_ttype op;
35 };
36 
37 /* Some simple utility routines on double integers.  */
38 #define num_zerop(num) ((num.low | num.high) == 0)
39 #define num_eq(num1, num2) (num1.low == num2.low && num1.high == num2.high)
40 static bool num_positive (cpp_num, size_t);
41 static bool num_greater_eq (cpp_num, cpp_num, size_t);
42 static cpp_num num_trim (cpp_num, size_t);
43 static cpp_num num_part_mul (cpp_num_part, cpp_num_part);
44 
45 static cpp_num num_unary_op (cpp_reader *, cpp_num, enum cpp_ttype);
46 static cpp_num num_binary_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype);
47 static cpp_num num_negate (cpp_num, size_t);
48 static cpp_num num_bitwise_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype);
49 static cpp_num num_inequality_op (cpp_reader *, cpp_num, cpp_num,
50 				  enum cpp_ttype);
51 static cpp_num num_equality_op (cpp_reader *, cpp_num, cpp_num,
52 				enum cpp_ttype);
53 static cpp_num num_mul (cpp_reader *, cpp_num, cpp_num);
54 static cpp_num num_div_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype,
55 			   location_t);
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 *, location_t);
62 static struct op *reduce (cpp_reader *, struct op *, enum cpp_ttype);
63 static unsigned int interpret_float_suffix (cpp_reader *, const uchar *, size_t);
64 static unsigned int interpret_int_suffix (cpp_reader *, 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 #define SYNTAX_ERROR_AT(loc, msgid) \
79   do { cpp_error_with_line (pfile, CPP_DL_ERROR, (loc), 0, msgid); goto syntax_error; } \
80   while(0)
81 #define SYNTAX_ERROR2_AT(loc, msgid, arg)					\
82   do { cpp_error_with_line (pfile, CPP_DL_ERROR, (loc), 0, msgid, arg); goto syntax_error; } \
83   while(0)
84 
85 /* Subroutine of cpp_classify_number.  S points to a float suffix of
86    length LEN, possibly zero.  Returns 0 for an invalid suffix, or a
87    flag vector (of CPP_N_* bits) describing the suffix.  */
88 static unsigned int
interpret_float_suffix(cpp_reader * pfile,const uchar * s,size_t len)89 interpret_float_suffix (cpp_reader *pfile, const uchar *s, size_t len)
90 {
91   size_t orig_len = len;
92   const uchar *orig_s = s;
93   size_t flags;
94   size_t f, d, l, w, q, i, fn, fnx, fn_bits;
95 
96   flags = 0;
97   f = d = l = w = q = i = fn = fnx = fn_bits = 0;
98 
99   /* The following decimal float suffixes, from TR 24732:2009, TS
100      18661-2:2015 and C2X, are supported:
101 
102      df, DF - _Decimal32.
103      dd, DD - _Decimal64.
104      dl, DL - _Decimal128.
105 
106      The dN and DN suffixes for _DecimalN, and dNx and DNx for
107      _DecimalNx, defined in TS 18661-3:2015, are not supported.
108 
109      Fixed-point suffixes, from TR 18037:2008, are supported.  They
110      consist of three parts, in order:
111 
112      (i) An optional u or U, for unsigned types.
113 
114      (ii) An optional h or H, for short types, or l or L, for long
115      types, or ll or LL, for long long types.  Use of ll or LL is a
116      GNU extension.
117 
118      (iii) r or R, for _Fract types, or k or K, for _Accum types.
119 
120      Otherwise the suffix is for a binary or standard floating-point
121      type.  Such a suffix, or the absence of a suffix, may be preceded
122      or followed by i, I, j or J, to indicate an imaginary number with
123      the corresponding complex type.  The following suffixes for
124      binary or standard floating-point types are supported:
125 
126      f, F - float (ISO C and C++).
127      l, L - long double (ISO C and C++).
128      d, D - double, even with the FLOAT_CONST_DECIMAL64 pragma in
129 	    operation (from TR 24732:2009; the pragma and the suffix
130 	    are not included in TS 18661-2:2015).
131      w, W - machine-specific type such as __float80 (GNU extension).
132      q, Q - machine-specific type such as __float128 (GNU extension).
133      fN, FN - _FloatN (TS 18661-3:2015).
134      fNx, FNx - _FloatNx (TS 18661-3:2015).  */
135 
136   /* Process decimal float suffixes, which are two letters starting
137      with d or D.  Order and case are significant.  */
138   if (len == 2 && (*s == 'd' || *s == 'D'))
139     {
140       bool uppercase = (*s == 'D');
141       switch (s[1])
142       {
143       case 'f': return (!uppercase ? (CPP_N_DFLOAT | CPP_N_SMALL): 0); break;
144       case 'F': return (uppercase ? (CPP_N_DFLOAT | CPP_N_SMALL) : 0); break;
145       case 'd': return (!uppercase ? (CPP_N_DFLOAT | CPP_N_MEDIUM): 0); break;
146       case 'D': return (uppercase ? (CPP_N_DFLOAT | CPP_N_MEDIUM) : 0); break;
147       case 'l': return (!uppercase ? (CPP_N_DFLOAT | CPP_N_LARGE) : 0); break;
148       case 'L': return (uppercase ? (CPP_N_DFLOAT | CPP_N_LARGE) : 0); break;
149       default:
150 	/* Additional two-character suffixes beginning with D are not
151 	   for decimal float constants.  */
152 	break;
153       }
154     }
155 
156   if (CPP_OPTION (pfile, ext_numeric_literals))
157     {
158       /* Recognize a fixed-point suffix.  */
159       if (len != 0)
160 	switch (s[len-1])
161 	  {
162 	  case 'k': case 'K': flags = CPP_N_ACCUM; break;
163 	  case 'r': case 'R': flags = CPP_N_FRACT; break;
164 	  default: break;
165 	  }
166 
167       /* Continue processing a fixed-point suffix.  The suffix is case
168 	 insensitive except for ll or LL.  Order is significant.  */
169       if (flags)
170 	{
171 	  if (len == 1)
172 	    return flags;
173 	  len--;
174 
175 	  if (*s == 'u' || *s == 'U')
176 	    {
177 	      flags |= CPP_N_UNSIGNED;
178 	      if (len == 1)
179 		return flags;
180 	      len--;
181 	      s++;
182             }
183 
184 	  switch (*s)
185 	  {
186 	  case 'h': case 'H':
187 	    if (len == 1)
188 	      return flags |= CPP_N_SMALL;
189 	    break;
190 	  case 'l':
191 	    if (len == 1)
192 	      return flags |= CPP_N_MEDIUM;
193 	    if (len == 2 && s[1] == 'l')
194 	      return flags |= CPP_N_LARGE;
195 	    break;
196 	  case 'L':
197 	    if (len == 1)
198 	      return flags |= CPP_N_MEDIUM;
199 	    if (len == 2 && s[1] == 'L')
200 	      return flags |= CPP_N_LARGE;
201 	    break;
202 	  default:
203 	    break;
204 	  }
205 	  /* Anything left at this point is invalid.  */
206 	  return 0;
207 	}
208     }
209 
210   /* In any remaining valid suffix, the case and order don't matter.  */
211   while (len--)
212     {
213       switch (s[0])
214 	{
215 	case 'f': case 'F':
216 	  f++;
217 	  if (len > 0
218 	      && !CPP_OPTION (pfile, cplusplus)
219 	      && s[1] >= '1'
220 	      && s[1] <= '9'
221 	      && fn_bits == 0)
222 	    {
223 	      f--;
224 	      while (len > 0
225 		     && s[1] >= '0'
226 		     && s[1] <= '9'
227 		     && fn_bits < CPP_FLOATN_MAX)
228 		{
229 		  fn_bits = fn_bits * 10 + (s[1] - '0');
230 		  len--;
231 		  s++;
232 		}
233 	      if (len > 0 && s[1] == 'x')
234 		{
235 		  fnx++;
236 		  len--;
237 		  s++;
238 		}
239 	      else
240 		fn++;
241 	    }
242 	  break;
243 	case 'd': case 'D': d++; break;
244 	case 'l': case 'L': l++; break;
245 	case 'w': case 'W': w++; break;
246 	case 'q': case 'Q': q++; break;
247 	case 'i': case 'I':
248 	case 'j': case 'J': i++; break;
249 	default:
250 	  return 0;
251 	}
252       s++;
253     }
254 
255   /* Reject any case of multiple suffixes specifying types, multiple
256      suffixes specifying an imaginary constant, _FloatN or _FloatNx
257      suffixes for invalid values of N, and _FloatN suffixes for values
258      of N larger than can be represented in the return value.  The
259      caller is responsible for rejecting _FloatN suffixes where
260      _FloatN is not supported on the chosen target.  */
261   if (f + d + l + w + q + fn + fnx > 1 || i > 1)
262     return 0;
263   if (fn_bits > CPP_FLOATN_MAX)
264     return 0;
265   if (fnx && fn_bits != 32 && fn_bits != 64 && fn_bits != 128)
266     return 0;
267   if (fn && fn_bits != 16 && fn_bits % 32 != 0)
268     return 0;
269   if (fn && fn_bits == 96)
270     return 0;
271 
272   if (i)
273     {
274       if (!CPP_OPTION (pfile, ext_numeric_literals))
275 	return 0;
276 
277       /* In C++14 and up these suffixes are in the standard library, so treat
278 	 them as user-defined literals.  */
279       if (CPP_OPTION (pfile, cplusplus)
280 	  && CPP_OPTION (pfile, lang) > CLK_CXX11
281 	  && orig_s[0] == 'i'
282 	  && (orig_len == 1
283 	      || (orig_len == 2
284 		  && (orig_s[1] == 'f' || orig_s[1] == 'l'))))
285 	return 0;
286     }
287 
288   if ((w || q) && !CPP_OPTION (pfile, ext_numeric_literals))
289     return 0;
290 
291   return ((i ? CPP_N_IMAGINARY : 0)
292 	  | (f ? CPP_N_SMALL :
293 	     d ? CPP_N_MEDIUM :
294 	     l ? CPP_N_LARGE :
295 	     w ? CPP_N_MD_W :
296 	     q ? CPP_N_MD_Q :
297 	     fn ? CPP_N_FLOATN | (fn_bits << CPP_FLOATN_SHIFT) :
298 	     fnx ? CPP_N_FLOATNX | (fn_bits << CPP_FLOATN_SHIFT) :
299 	     CPP_N_DEFAULT));
300 }
301 
302 /* Return the classification flags for a float suffix.  */
303 unsigned int
cpp_interpret_float_suffix(cpp_reader * pfile,const char * s,size_t len)304 cpp_interpret_float_suffix (cpp_reader *pfile, const char *s, size_t len)
305 {
306   return interpret_float_suffix (pfile, (const unsigned char *)s, len);
307 }
308 
309 /* Subroutine of cpp_classify_number.  S points to an integer suffix
310    of length LEN, possibly zero. Returns 0 for an invalid suffix, or a
311    flag vector describing the suffix.  */
312 static unsigned int
interpret_int_suffix(cpp_reader * pfile,const uchar * s,size_t len)313 interpret_int_suffix (cpp_reader *pfile, const uchar *s, size_t len)
314 {
315   size_t orig_len = len;
316   size_t u, l, i, z;
317 
318   u = l = i = z = 0;
319 
320   while (len--)
321     switch (s[len])
322       {
323       case 'z': case 'Z':	z++; break;
324       case 'u': case 'U':	u++; break;
325       case 'i': case 'I':
326       case 'j': case 'J':	i++; break;
327       case 'l': case 'L':	l++;
328 	/* If there are two Ls, they must be adjacent and the same case.  */
329 	if (l == 2 && s[len] != s[len + 1])
330 	  return 0;
331 	break;
332       default:
333 	return 0;
334       }
335 
336   if (l > 2 || u > 1 || i > 1 || z > 1)
337     return 0;
338 
339   if (z)
340     {
341       if (l > 0 || i > 0)
342 	return 0;
343       if (!CPP_OPTION (pfile, cplusplus))
344 	return 0;
345     }
346 
347   if (i)
348     {
349       if (!CPP_OPTION (pfile, ext_numeric_literals))
350 	return 0;
351 
352       /* In C++14 and up these suffixes are in the standard library, so treat
353 	 them as user-defined literals.  */
354       if (CPP_OPTION (pfile, cplusplus)
355 	  && CPP_OPTION (pfile, lang) > CLK_CXX11
356 	  && s[0] == 'i'
357 	  && (orig_len == 1 || (orig_len == 2 && s[1] == 'l')))
358 	return 0;
359     }
360 
361   return ((i ? CPP_N_IMAGINARY : 0)
362 	  | (u ? CPP_N_UNSIGNED : 0)
363 	  | ((l == 0) ? CPP_N_SMALL
364 	     : (l == 1) ? CPP_N_MEDIUM : CPP_N_LARGE)
365 	  | (z ? CPP_N_SIZE_T : 0));
366 }
367 
368 /* Return the classification flags for an int suffix.  */
369 unsigned int
cpp_interpret_int_suffix(cpp_reader * pfile,const char * s,size_t len)370 cpp_interpret_int_suffix (cpp_reader *pfile, const char *s, size_t len)
371 {
372   return interpret_int_suffix (pfile, (const unsigned char *)s, len);
373 }
374 
375 /* Return the string type corresponding to the the input user-defined string
376    literal type.  If the input type is not a user-defined string literal
377    type return the input type.  */
378 enum cpp_ttype
cpp_userdef_string_remove_type(enum cpp_ttype type)379 cpp_userdef_string_remove_type (enum cpp_ttype type)
380 {
381   if (type == CPP_STRING_USERDEF)
382     return CPP_STRING;
383   else if (type == CPP_WSTRING_USERDEF)
384     return CPP_WSTRING;
385   else if (type == CPP_STRING16_USERDEF)
386     return CPP_STRING16;
387   else if (type == CPP_STRING32_USERDEF)
388     return CPP_STRING32;
389   else if (type == CPP_UTF8STRING_USERDEF)
390     return CPP_UTF8STRING;
391   else
392     return type;
393 }
394 
395 /* Return the user-defined string literal type corresponding to the input
396    string type.  If the input type is not a string type return the input
397    type.  */
398 enum cpp_ttype
cpp_userdef_string_add_type(enum cpp_ttype type)399 cpp_userdef_string_add_type (enum cpp_ttype type)
400 {
401   if (type == CPP_STRING)
402     return CPP_STRING_USERDEF;
403   else if (type == CPP_WSTRING)
404     return CPP_WSTRING_USERDEF;
405   else if (type == CPP_STRING16)
406     return CPP_STRING16_USERDEF;
407   else if (type == CPP_STRING32)
408     return CPP_STRING32_USERDEF;
409   else if (type == CPP_UTF8STRING)
410     return CPP_UTF8STRING_USERDEF;
411   else
412     return type;
413 }
414 
415 /* Return the char type corresponding to the the input user-defined char
416    literal type.  If the input type is not a user-defined char literal
417    type return the input type.  */
418 enum cpp_ttype
cpp_userdef_char_remove_type(enum cpp_ttype type)419 cpp_userdef_char_remove_type (enum cpp_ttype type)
420 {
421   if (type == CPP_CHAR_USERDEF)
422     return CPP_CHAR;
423   else if (type == CPP_WCHAR_USERDEF)
424     return CPP_WCHAR;
425   else if (type == CPP_CHAR16_USERDEF)
426     return CPP_CHAR16;
427   else if (type == CPP_CHAR32_USERDEF)
428     return CPP_CHAR32;
429   else if (type == CPP_UTF8CHAR_USERDEF)
430     return CPP_UTF8CHAR;
431   else
432     return type;
433 }
434 
435 /* Return the user-defined char literal type corresponding to the input
436    char type.  If the input type is not a char type return the input
437    type.  */
438 enum cpp_ttype
cpp_userdef_char_add_type(enum cpp_ttype type)439 cpp_userdef_char_add_type (enum cpp_ttype type)
440 {
441   if (type == CPP_CHAR)
442     return CPP_CHAR_USERDEF;
443   else if (type == CPP_WCHAR)
444     return CPP_WCHAR_USERDEF;
445   else if (type == CPP_CHAR16)
446     return CPP_CHAR16_USERDEF;
447   else if (type == CPP_CHAR32)
448     return CPP_CHAR32_USERDEF;
449   else if (type == CPP_UTF8CHAR)
450     return CPP_UTF8CHAR_USERDEF;
451   else
452     return type;
453 }
454 
455 /* Return true if the token type is a user-defined string literal.  */
456 bool
cpp_userdef_string_p(enum cpp_ttype type)457 cpp_userdef_string_p (enum cpp_ttype type)
458 {
459   if (type == CPP_STRING_USERDEF
460    || type == CPP_WSTRING_USERDEF
461    || type == CPP_STRING16_USERDEF
462    || type == CPP_STRING32_USERDEF
463    || type == CPP_UTF8STRING_USERDEF)
464     return true;
465   else
466     return false;
467 }
468 
469 /* Return true if the token type is a user-defined char literal.  */
470 bool
cpp_userdef_char_p(enum cpp_ttype type)471 cpp_userdef_char_p (enum cpp_ttype type)
472 {
473   if (type == CPP_CHAR_USERDEF
474    || type == CPP_WCHAR_USERDEF
475    || type == CPP_CHAR16_USERDEF
476    || type == CPP_CHAR32_USERDEF
477    || type == CPP_UTF8CHAR_USERDEF)
478     return true;
479   else
480     return false;
481 }
482 
483 /* Extract the suffix from a user-defined literal string or char.  */
484 const char *
cpp_get_userdef_suffix(const cpp_token * tok)485 cpp_get_userdef_suffix (const cpp_token *tok)
486 {
487   unsigned int len = tok->val.str.len;
488   const char *text = (const char *)tok->val.str.text;
489   char delim;
490   unsigned int i;
491   for (i = 0; i < len; ++i)
492     if (text[i] == '\'' || text[i] == '"')
493       break;
494   if (i == len)
495     return text + len;
496   delim = text[i];
497   for (i = len; i > 0; --i)
498     if (text[i - 1] == delim)
499       break;
500   return text + i;
501 }
502 
503 /* Categorize numeric constants according to their field (integer,
504    floating point, or invalid), radix (decimal, octal, hexadecimal),
505    and type suffixes.
506 
507    TOKEN is the token that represents the numeric constant to
508    classify.
509 
510    In C++0X if UD_SUFFIX is non null it will be assigned
511    any unrecognized suffix for a user-defined literal.
512 
513    VIRTUAL_LOCATION is the virtual location for TOKEN.  */
514 unsigned int
cpp_classify_number(cpp_reader * pfile,const cpp_token * token,const char ** ud_suffix,location_t virtual_location)515 cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
516 		     const char **ud_suffix, location_t virtual_location)
517 {
518   const uchar *str = token->val.str.text;
519   const uchar *limit;
520   unsigned int max_digit, result, radix;
521   enum {NOT_FLOAT = 0, AFTER_POINT, AFTER_EXPON} float_flag;
522   bool seen_digit;
523   bool seen_digit_sep;
524 
525   if (ud_suffix)
526     *ud_suffix = NULL;
527 
528   /* If the lexer has done its job, length one can only be a single
529      digit.  Fast-path this very common case.  */
530   if (token->val.str.len == 1)
531     return CPP_N_INTEGER | CPP_N_SMALL | CPP_N_DECIMAL;
532 
533   limit = str + token->val.str.len;
534   float_flag = NOT_FLOAT;
535   max_digit = 0;
536   radix = 10;
537   seen_digit = false;
538   seen_digit_sep = false;
539 
540   /* First, interpret the radix.  */
541   if (*str == '0')
542     {
543       radix = 8;
544       str++;
545 
546       /* Require at least one hex digit to classify it as hex.  */
547       if (*str == 'x' || *str == 'X')
548 	{
549 	  if (str[1] == '.' || ISXDIGIT (str[1]))
550 	    {
551 	      radix = 16;
552 	      str++;
553 	    }
554 	  else if (DIGIT_SEP (str[1]))
555 	    SYNTAX_ERROR_AT (virtual_location,
556 			     "digit separator after base indicator");
557 	}
558       else if (*str == 'b' || *str == 'B')
559 	{
560 	  if (str[1] == '0' || str[1] == '1')
561 	    {
562 	      radix = 2;
563 	      str++;
564 	    }
565 	  else if (DIGIT_SEP (str[1]))
566 	    SYNTAX_ERROR_AT (virtual_location,
567 			     "digit separator after base indicator");
568 	}
569     }
570 
571   /* Now scan for a well-formed integer or float.  */
572   for (;;)
573     {
574       unsigned int c = *str++;
575 
576       if (ISDIGIT (c) || (ISXDIGIT (c) && radix == 16))
577 	{
578 	  seen_digit_sep = false;
579 	  seen_digit = true;
580 	  c = hex_value (c);
581 	  if (c > max_digit)
582 	    max_digit = c;
583 	}
584       else if (DIGIT_SEP (c))
585 	seen_digit_sep = true;
586       else if (c == '.')
587 	{
588 	  if (seen_digit_sep || DIGIT_SEP (*str))
589 	    SYNTAX_ERROR_AT (virtual_location,
590 			     "digit separator adjacent to decimal point");
591 	  seen_digit_sep = false;
592 	  if (float_flag == NOT_FLOAT)
593 	    float_flag = AFTER_POINT;
594 	  else
595 	    SYNTAX_ERROR_AT (virtual_location,
596 			     "too many decimal points in number");
597 	}
598       else if ((radix <= 10 && (c == 'e' || c == 'E'))
599 	       || (radix == 16 && (c == 'p' || c == 'P')))
600 	{
601 	  if (seen_digit_sep || DIGIT_SEP (*str))
602 	    SYNTAX_ERROR_AT (virtual_location,
603 			     "digit separator adjacent to exponent");
604 	  float_flag = AFTER_EXPON;
605 	  break;
606 	}
607       else
608 	{
609 	  /* Start of suffix.  */
610 	  str--;
611 	  break;
612 	}
613     }
614 
615   if (seen_digit_sep && float_flag != AFTER_EXPON)
616     SYNTAX_ERROR_AT (virtual_location,
617 		     "digit separator outside digit sequence");
618 
619   /* The suffix may be for decimal fixed-point constants without exponent.  */
620   if (radix != 16 && float_flag == NOT_FLOAT)
621     {
622       result = interpret_float_suffix (pfile, str, limit - str);
623       if ((result & CPP_N_FRACT) || (result & CPP_N_ACCUM))
624 	{
625 	  result |= CPP_N_FLOATING;
626 	  /* We need to restore the radix to 10, if the radix is 8.  */
627 	  if (radix == 8)
628 	    radix = 10;
629 
630 	  if (CPP_PEDANTIC (pfile))
631 	    cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
632 				 "fixed-point constants are a GCC extension");
633 	  goto syntax_ok;
634 	}
635       else
636 	result = 0;
637     }
638 
639   if (float_flag != NOT_FLOAT && radix == 8)
640     radix = 10;
641 
642   if (max_digit >= radix)
643     {
644       if (radix == 2)
645 	SYNTAX_ERROR2_AT (virtual_location,
646 			  "invalid digit \"%c\" in binary constant", '0' + max_digit);
647       else
648 	SYNTAX_ERROR2_AT (virtual_location,
649 			  "invalid digit \"%c\" in octal constant", '0' + max_digit);
650     }
651 
652   if (float_flag != NOT_FLOAT)
653     {
654       if (radix == 2)
655 	{
656 	  cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0,
657 			       "invalid prefix \"0b\" for floating constant");
658 	  return CPP_N_INVALID;
659 	}
660 
661       if (radix == 16 && !seen_digit)
662 	SYNTAX_ERROR_AT (virtual_location,
663 			 "no digits in hexadecimal floating constant");
664 
665       if (radix == 16 && CPP_PEDANTIC (pfile)
666 	  && !CPP_OPTION (pfile, extended_numbers))
667 	{
668 	  if (CPP_OPTION (pfile, cplusplus))
669 	    cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
670 				 "use of C++17 hexadecimal floating constant");
671 	  else
672 	    cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
673 				 "use of C99 hexadecimal floating constant");
674 	}
675 
676       if (float_flag == AFTER_EXPON)
677 	{
678 	  if (*str == '+' || *str == '-')
679 	    str++;
680 
681 	  /* Exponent is decimal, even if string is a hex float.  */
682 	  if (!ISDIGIT (*str))
683 	    {
684 	      if (DIGIT_SEP (*str))
685 		SYNTAX_ERROR_AT (virtual_location,
686 				 "digit separator adjacent to exponent");
687 	      else
688 		SYNTAX_ERROR_AT (virtual_location, "exponent has no digits");
689 	    }
690 	  do
691 	    {
692 	      seen_digit_sep = DIGIT_SEP (*str);
693 	      str++;
694 	    }
695 	  while (ISDIGIT (*str) || DIGIT_SEP (*str));
696 	}
697       else if (radix == 16)
698 	SYNTAX_ERROR_AT (virtual_location,
699 			 "hexadecimal floating constants require an exponent");
700 
701       if (seen_digit_sep)
702 	SYNTAX_ERROR_AT (virtual_location,
703 			 "digit separator outside digit sequence");
704 
705       result = interpret_float_suffix (pfile, str, limit - str);
706       if (result == 0)
707 	{
708 	  if (CPP_OPTION (pfile, user_literals))
709 	    {
710 	      if (ud_suffix)
711 		*ud_suffix = (const char *) str;
712 	      result = CPP_N_LARGE | CPP_N_USERDEF;
713 	    }
714 	  else
715 	    {
716 	      cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0,
717 				   "invalid suffix \"%.*s\" on floating constant",
718 				   (int) (limit - str), str);
719 	      return CPP_N_INVALID;
720 	    }
721 	}
722 
723       /* Traditional C didn't accept any floating suffixes.  */
724       if (limit != str
725 	  && CPP_WTRADITIONAL (pfile)
726 	  && ! cpp_sys_macro_p (pfile))
727 	cpp_warning_with_line (pfile, CPP_W_TRADITIONAL, virtual_location, 0,
728 			       "traditional C rejects the \"%.*s\" suffix",
729 			       (int) (limit - str), str);
730 
731       /* A suffix for double is a GCC extension via decimal float support.
732 	 If the suffix also specifies an imaginary value we'll catch that
733 	 later.  */
734       if ((result == CPP_N_MEDIUM) && CPP_PEDANTIC (pfile))
735 	cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
736 			     "suffix for double constant is a GCC extension");
737 
738       /* Radix must be 10 for decimal floats.  */
739       if ((result & CPP_N_DFLOAT) && radix != 10)
740         {
741           cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0,
742 			       "invalid suffix \"%.*s\" with hexadecimal floating constant",
743 			       (int) (limit - str), str);
744           return CPP_N_INVALID;
745         }
746 
747       if ((result & (CPP_N_FRACT | CPP_N_ACCUM)) && CPP_PEDANTIC (pfile))
748 	cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
749 			     "fixed-point constants are a GCC extension");
750 
751       if (result & CPP_N_DFLOAT)
752 	{
753 	  if (CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, dfp_constants))
754 	    cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
755 				 "decimal float constants are a C2X feature");
756 	  else if (CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) > 0)
757 	    cpp_warning_with_line (pfile, CPP_W_C11_C2X_COMPAT,
758 				   virtual_location, 0,
759 				   "decimal float constants are a C2X feature");
760 	}
761 
762       result |= CPP_N_FLOATING;
763     }
764   else
765     {
766       result = interpret_int_suffix (pfile, str, limit - str);
767       if (result == 0)
768 	{
769 	  if (CPP_OPTION (pfile, user_literals))
770 	    {
771 	      if (ud_suffix)
772 		*ud_suffix = (const char *) str;
773 	      result = CPP_N_UNSIGNED | CPP_N_LARGE | CPP_N_USERDEF;
774 	    }
775 	  else
776 	    {
777 	      cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0,
778 				   "invalid suffix \"%.*s\" on integer constant",
779 				   (int) (limit - str), str);
780 	      return CPP_N_INVALID;
781 	    }
782 	}
783 
784       /* Traditional C only accepted the 'L' suffix.
785          Suppress warning about 'LL' with -Wno-long-long.  */
786       if (CPP_WTRADITIONAL (pfile) && ! cpp_sys_macro_p (pfile))
787 	{
788 	  int u_or_i = (result & (CPP_N_UNSIGNED|CPP_N_IMAGINARY));
789 	  int large = (result & CPP_N_WIDTH) == CPP_N_LARGE
790 		       && CPP_OPTION (pfile, cpp_warn_long_long);
791 
792 	  if (u_or_i || large)
793 	    cpp_warning_with_line (pfile, large ? CPP_W_LONG_LONG : CPP_W_TRADITIONAL,
794 				   virtual_location, 0,
795 				   "traditional C rejects the \"%.*s\" suffix",
796 				   (int) (limit - str), str);
797 	}
798 
799       if ((result & CPP_N_WIDTH) == CPP_N_LARGE
800 	  && CPP_OPTION (pfile, cpp_warn_long_long))
801         {
802           const char *message = CPP_OPTION (pfile, cplusplus)
803 				? N_("use of C++11 long long integer constant")
804 		                : N_("use of C99 long long integer constant");
805 
806 	  if (CPP_OPTION (pfile, c99))
807             cpp_warning_with_line (pfile, CPP_W_LONG_LONG, virtual_location,
808 				   0, message);
809           else
810             cpp_pedwarning_with_line (pfile, CPP_W_LONG_LONG,
811 				      virtual_location, 0, message);
812         }
813 
814       if ((result & CPP_N_SIZE_T) == CPP_N_SIZE_T
815 	  && !CPP_OPTION (pfile, size_t_literals))
816        {
817 	  const char *message = (result & CPP_N_UNSIGNED) == CPP_N_UNSIGNED
818 				? N_("use of C++23 %<size_t%> integer constant")
819 				: N_("use of C++23 %<make_signed_t<size_t>%> integer constant");
820 	  cpp_warning_with_line (pfile, CPP_W_SIZE_T_LITERALS,
821 				 virtual_location, 0, message);
822        }
823 
824       result |= CPP_N_INTEGER;
825     }
826 
827  syntax_ok:
828   if ((result & CPP_N_IMAGINARY) && CPP_PEDANTIC (pfile))
829     cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
830 			 "imaginary constants are a GCC extension");
831   if (radix == 2)
832     {
833       if (!CPP_OPTION (pfile, binary_constants)
834 	  && CPP_PEDANTIC (pfile))
835 	cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
836 			     CPP_OPTION (pfile, cplusplus)
837 			     ? N_("binary constants are a C++14 feature "
838 				  "or GCC extension")
839 			     : N_("binary constants are a C2X feature "
840 				  "or GCC extension"));
841       else if (CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) > 0)
842 	cpp_warning_with_line (pfile, CPP_W_C11_C2X_COMPAT,
843 			       virtual_location, 0,
844 			       "binary constants are a C2X feature");
845     }
846 
847   if (radix == 10)
848     result |= CPP_N_DECIMAL;
849   else if (radix == 16)
850     result |= CPP_N_HEX;
851   else if (radix == 2)
852     result |= CPP_N_BINARY;
853   else
854     result |= CPP_N_OCTAL;
855 
856   return result;
857 
858  syntax_error:
859   return CPP_N_INVALID;
860 }
861 
862 /* cpp_interpret_integer converts an integer constant into a cpp_num,
863    of precision options->precision.
864 
865    We do not provide any interface for decimal->float conversion,
866    because the preprocessor doesn't need it and we don't want to
867    drag in GCC's floating point emulator.  */
868 cpp_num
cpp_interpret_integer(cpp_reader * pfile,const cpp_token * token,unsigned int type)869 cpp_interpret_integer (cpp_reader *pfile, const cpp_token *token,
870 		       unsigned int type)
871 {
872   const uchar *p, *end;
873   cpp_num result;
874 
875   result.low = 0;
876   result.high = 0;
877   result.unsignedp = !!(type & CPP_N_UNSIGNED);
878   result.overflow = false;
879 
880   p = token->val.str.text;
881   end = p + token->val.str.len;
882 
883   /* Common case of a single digit.  */
884   if (token->val.str.len == 1)
885     result.low = p[0] - '0';
886   else
887     {
888       cpp_num_part max;
889       size_t precision = CPP_OPTION (pfile, precision);
890       unsigned int base = 10, c = 0;
891       bool overflow = false;
892 
893       if ((type & CPP_N_RADIX) == CPP_N_OCTAL)
894 	{
895 	  base = 8;
896 	  p++;
897 	}
898       else if ((type & CPP_N_RADIX) == CPP_N_HEX)
899 	{
900 	  base = 16;
901 	  p += 2;
902 	}
903       else if ((type & CPP_N_RADIX) == CPP_N_BINARY)
904 	{
905 	  base = 2;
906 	  p += 2;
907 	}
908 
909       /* We can add a digit to numbers strictly less than this without
910 	 needing the precision and slowness of double integers.  */
911       max = ~(cpp_num_part) 0;
912       if (precision < PART_PRECISION)
913 	max >>= PART_PRECISION - precision;
914       max = (max - base + 1) / base + 1;
915 
916       for (; p < end; p++)
917 	{
918 	  c = *p;
919 
920 	  if (ISDIGIT (c) || (base == 16 && ISXDIGIT (c)))
921 	    c = hex_value (c);
922 	  else if (DIGIT_SEP (c))
923 	    continue;
924 	  else
925 	    break;
926 
927 	  /* Strict inequality for when max is set to zero.  */
928 	  if (result.low < max)
929 	    result.low = result.low * base + c;
930 	  else
931 	    {
932 	      result = append_digit (result, c, base, precision);
933 	      overflow |= result.overflow;
934 	      max = 0;
935 	    }
936 	}
937 
938       if (overflow && !(type & CPP_N_USERDEF))
939 	cpp_error (pfile, CPP_DL_PEDWARN,
940 		   "integer constant is too large for its type");
941       /* If too big to be signed, consider it unsigned.  Only warn for
942 	 decimal numbers.  Traditional numbers were always signed (but
943 	 we still honor an explicit U suffix); but we only have
944 	 traditional semantics in directives.  */
945       else if (!result.unsignedp
946 	       && !(CPP_OPTION (pfile, traditional)
947 		    && pfile->state.in_directive)
948 	       && !num_positive (result, precision))
949 	{
950 	  /* This is for constants within the range of uintmax_t but
951 	     not that of intmax_t.  For such decimal constants, a
952 	     diagnostic is required for C99 as the selected type must
953 	     be signed and not having a type is a constraint violation
954 	     (DR#298, TC3), so this must be a pedwarn.  For C90,
955 	     unsigned long is specified to be used for a constant that
956 	     does not fit in signed long; if uintmax_t has the same
957 	     range as unsigned long this means only a warning is
958 	     appropriate here.  C90 permits the preprocessor to use a
959 	     wider range than unsigned long in the compiler, so if
960 	     uintmax_t is wider than unsigned long no diagnostic is
961 	     required for such constants in preprocessor #if
962 	     expressions and the compiler will pedwarn for such
963 	     constants outside the range of unsigned long that reach
964 	     the compiler so a diagnostic is not required there
965 	     either; thus, pedwarn for C99 but use a plain warning for
966 	     C90.  */
967 	  if (base == 10)
968 	    cpp_error (pfile, (CPP_OPTION (pfile, c99)
969 			       ? CPP_DL_PEDWARN
970 			       : CPP_DL_WARNING),
971 		       "integer constant is so large that it is unsigned");
972 	  result.unsignedp = true;
973 	}
974     }
975 
976   return result;
977 }
978 
979 /* Append DIGIT to NUM, a number of PRECISION bits being read in base BASE.  */
980 static cpp_num
append_digit(cpp_num num,int digit,int base,size_t precision)981 append_digit (cpp_num num, int digit, int base, size_t precision)
982 {
983   cpp_num result;
984   unsigned int shift;
985   bool overflow;
986   cpp_num_part add_high, add_low;
987 
988   /* Multiply by 2, 8 or 16.  Catching this overflow here means we don't
989      need to worry about add_high overflowing.  */
990   switch (base)
991     {
992     case 2:
993       shift = 1;
994       break;
995 
996     case 16:
997       shift = 4;
998       break;
999 
1000     default:
1001       shift = 3;
1002     }
1003   overflow = !!(num.high >> (PART_PRECISION - shift));
1004   result.high = num.high << shift;
1005   result.low = num.low << shift;
1006   result.high |= num.low >> (PART_PRECISION - shift);
1007   result.unsignedp = num.unsignedp;
1008 
1009   if (base == 10)
1010     {
1011       add_low = num.low << 1;
1012       add_high = (num.high << 1) + (num.low >> (PART_PRECISION - 1));
1013     }
1014   else
1015     add_high = add_low = 0;
1016 
1017   if (add_low + digit < add_low)
1018     add_high++;
1019   add_low += digit;
1020 
1021   if (result.low + add_low < result.low)
1022     add_high++;
1023   if (result.high + add_high < result.high)
1024     overflow = true;
1025 
1026   result.low += add_low;
1027   result.high += add_high;
1028   result.overflow = overflow;
1029 
1030   /* The above code catches overflow of a cpp_num type.  This catches
1031      overflow of the (possibly shorter) target precision.  */
1032   num.low = result.low;
1033   num.high = result.high;
1034   result = num_trim (result, precision);
1035   if (!num_eq (result, num))
1036     result.overflow = true;
1037 
1038   return result;
1039 }
1040 
1041 /* Handle meeting "defined" in a preprocessor expression.  */
1042 static cpp_num
parse_defined(cpp_reader * pfile)1043 parse_defined (cpp_reader *pfile)
1044 {
1045   cpp_num result;
1046   int paren = 0;
1047   cpp_hashnode *node = 0;
1048   const cpp_token *token;
1049   cpp_context *initial_context = pfile->context;
1050 
1051   /* Don't expand macros.  */
1052   pfile->state.prevent_expansion++;
1053 
1054   token = cpp_get_token (pfile);
1055   if (token->type == CPP_OPEN_PAREN)
1056     {
1057       paren = 1;
1058       token = cpp_get_token (pfile);
1059     }
1060 
1061   if (token->type == CPP_NAME)
1062     {
1063       node = token->val.node.node;
1064       if (paren && cpp_get_token (pfile)->type != CPP_CLOSE_PAREN)
1065 	{
1066 	  cpp_error (pfile, CPP_DL_ERROR, "missing ')' after \"defined\"");
1067 	  node = 0;
1068 	}
1069     }
1070   else
1071     {
1072       cpp_error (pfile, CPP_DL_ERROR,
1073 		 "operator \"defined\" requires an identifier");
1074       if (token->flags & NAMED_OP)
1075 	{
1076 	  cpp_token op;
1077 
1078 	  op.flags = 0;
1079 	  op.type = token->type;
1080 	  cpp_error (pfile, CPP_DL_ERROR,
1081 		     "(\"%s\" is an alternative token for \"%s\" in C++)",
1082 		     cpp_token_as_text (pfile, token),
1083 		     cpp_token_as_text (pfile, &op));
1084 	}
1085     }
1086 
1087   bool is_defined = false;
1088   if (node)
1089     {
1090       if ((pfile->context != initial_context
1091 	   || initial_context != &pfile->base_context)
1092 	  && CPP_OPTION (pfile, warn_expansion_to_defined))
1093         cpp_pedwarning (pfile, CPP_W_EXPANSION_TO_DEFINED,
1094 		        "this use of \"defined\" may not be portable");
1095       is_defined = _cpp_defined_macro_p (node);
1096       if (!_cpp_maybe_notify_macro_use (pfile, node, token->src_loc))
1097 	/* It wasn't a macro after all.  */
1098 	is_defined = false;
1099       _cpp_mark_macro_used (node);
1100 
1101       /* A possible controlling macro of the form #if !defined ().
1102 	 _cpp_parse_expr checks there was no other junk on the line.  */
1103       pfile->mi_ind_cmacro = node;
1104     }
1105 
1106   pfile->state.prevent_expansion--;
1107 
1108   /* Do not treat conditional macros as being defined.  This is due to the
1109      powerpc port using conditional macros for 'vector', 'bool', and 'pixel'
1110      to act as conditional keywords.  This messes up tests like #ifndef
1111      bool.  */
1112   result.unsignedp = false;
1113   result.high = 0;
1114   result.overflow = false;
1115   result.low = is_defined;
1116   return result;
1117 }
1118 
1119 /* Convert a token into a CPP_NUMBER (an interpreted preprocessing
1120    number or character constant, or the result of the "defined" or "#"
1121    operators).  */
1122 static cpp_num
eval_token(cpp_reader * pfile,const cpp_token * token,location_t virtual_location)1123 eval_token (cpp_reader *pfile, const cpp_token *token,
1124 	    location_t virtual_location)
1125 {
1126   cpp_num result;
1127   unsigned int temp;
1128   int unsignedp = 0;
1129 
1130   result.unsignedp = false;
1131   result.overflow = false;
1132 
1133   switch (token->type)
1134     {
1135     case CPP_NUMBER:
1136       temp = cpp_classify_number (pfile, token, NULL, virtual_location);
1137       if (temp & CPP_N_USERDEF)
1138 	cpp_error (pfile, CPP_DL_ERROR,
1139 		   "user-defined literal in preprocessor expression");
1140       switch (temp & CPP_N_CATEGORY)
1141 	{
1142 	case CPP_N_FLOATING:
1143 	  cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0,
1144 			       "floating constant in preprocessor expression");
1145 	  break;
1146 	case CPP_N_INTEGER:
1147 	  if (!(temp & CPP_N_IMAGINARY))
1148 	    return cpp_interpret_integer (pfile, token, temp);
1149 	  cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0,
1150 			       "imaginary number in preprocessor expression");
1151 	  break;
1152 
1153 	case CPP_N_INVALID:
1154 	  /* Error already issued.  */
1155 	  break;
1156 	}
1157       result.high = result.low = 0;
1158       break;
1159 
1160     case CPP_WCHAR:
1161     case CPP_CHAR:
1162     case CPP_CHAR16:
1163     case CPP_CHAR32:
1164     case CPP_UTF8CHAR:
1165       {
1166 	cppchar_t cc = cpp_interpret_charconst (pfile, token,
1167 						&temp, &unsignedp);
1168 
1169 	result.high = 0;
1170 	result.low = cc;
1171 	/* Sign-extend the result if necessary.  */
1172 	if (!unsignedp && (cppchar_signed_t) cc < 0)
1173 	  {
1174 	    if (PART_PRECISION > BITS_PER_CPPCHAR_T)
1175 	      result.low |= ~(~(cpp_num_part) 0
1176 			      >> (PART_PRECISION - BITS_PER_CPPCHAR_T));
1177 	    result.high = ~(cpp_num_part) 0;
1178 	    result = num_trim (result, CPP_OPTION (pfile, precision));
1179 	  }
1180       }
1181       break;
1182 
1183     case CPP_NAME:
1184       if (token->val.node.node == pfile->spec_nodes.n_defined)
1185 	return parse_defined (pfile);
1186       else if (CPP_OPTION (pfile, cplusplus)
1187 	       && (token->val.node.node == pfile->spec_nodes.n_true
1188 		   || token->val.node.node == pfile->spec_nodes.n_false))
1189 	{
1190 	  result.high = 0;
1191 	  result.low = (token->val.node.node == pfile->spec_nodes.n_true);
1192 	}
1193       else
1194 	{
1195 	  result.high = 0;
1196 	  result.low = 0;
1197 	  if (CPP_OPTION (pfile, warn_undef) && !pfile->state.skip_eval)
1198 	    cpp_warning_with_line (pfile, CPP_W_UNDEF, virtual_location, 0,
1199 				   "\"%s\" is not defined, evaluates to 0",
1200 				   NODE_NAME (token->val.node.node));
1201 	}
1202       break;
1203 
1204     case CPP_HASH:
1205       if (!pfile->state.skipping)
1206 	{
1207 	  /* A pedantic warning takes precedence over a deprecated
1208 	     warning here.  */
1209 	  if (CPP_PEDANTIC (pfile))
1210 	    cpp_error_with_line (pfile, CPP_DL_PEDWARN,
1211 				 virtual_location, 0,
1212 				 "assertions are a GCC extension");
1213 	  else if (CPP_OPTION (pfile, cpp_warn_deprecated))
1214 	    cpp_warning_with_line (pfile, CPP_W_DEPRECATED, virtual_location, 0,
1215 				   "assertions are a deprecated extension");
1216 	}
1217       _cpp_test_assertion (pfile, &temp);
1218       result.high = 0;
1219       result.low = temp;
1220       break;
1221 
1222     default:
1223       abort ();
1224     }
1225 
1226   result.unsignedp = !!unsignedp;
1227   return result;
1228 }
1229 
1230 /* Operator precedence and flags table.
1231 
1232 After an operator is returned from the lexer, if it has priority less
1233 than the operator on the top of the stack, we reduce the stack by one
1234 operator and repeat the test.  Since equal priorities do not reduce,
1235 this is naturally right-associative.
1236 
1237 We handle left-associative operators by decrementing the priority of
1238 just-lexed operators by one, but retaining the priority of operators
1239 already on the stack.
1240 
1241 The remaining cases are '(' and ')'.  We handle '(' by skipping the
1242 reduction phase completely.  ')' is given lower priority than
1243 everything else, including '(', effectively forcing a reduction of the
1244 parenthesized expression.  If there is a matching '(', the routine
1245 reduce() exits immediately.  If the normal exit route sees a ')', then
1246 there cannot have been a matching '(' and an error message is output.
1247 
1248 The parser assumes all shifted operators require a left operand unless
1249 the flag NO_L_OPERAND is set.  These semantics are automatic; any
1250 extra semantics need to be handled with operator-specific code.  */
1251 
1252 /* Flags.  If CHECK_PROMOTION, we warn if the effective sign of an
1253    operand changes because of integer promotions.  */
1254 #define NO_L_OPERAND	(1 << 0)
1255 #define LEFT_ASSOC	(1 << 1)
1256 #define CHECK_PROMOTION	(1 << 2)
1257 
1258 /* Operator to priority map.  Must be in the same order as the first
1259    N entries of enum cpp_ttype.  */
1260 static const struct cpp_operator
1261 {
1262   uchar prio;
1263   uchar flags;
1264 } optab[] =
1265 {
1266   /* EQ */		{0, 0},	/* Shouldn't happen.  */
1267   /* NOT */		{16, NO_L_OPERAND},
1268   /* GREATER */		{12, LEFT_ASSOC | CHECK_PROMOTION},
1269   /* LESS */		{12, LEFT_ASSOC | CHECK_PROMOTION},
1270   /* PLUS */		{14, LEFT_ASSOC | CHECK_PROMOTION},
1271   /* MINUS */		{14, LEFT_ASSOC | CHECK_PROMOTION},
1272   /* MULT */		{15, LEFT_ASSOC | CHECK_PROMOTION},
1273   /* DIV */		{15, LEFT_ASSOC | CHECK_PROMOTION},
1274   /* MOD */		{15, LEFT_ASSOC | CHECK_PROMOTION},
1275   /* AND */		{9, LEFT_ASSOC | CHECK_PROMOTION},
1276   /* OR */		{7, LEFT_ASSOC | CHECK_PROMOTION},
1277   /* XOR */		{8, LEFT_ASSOC | CHECK_PROMOTION},
1278   /* RSHIFT */		{13, LEFT_ASSOC},
1279   /* LSHIFT */		{13, LEFT_ASSOC},
1280 
1281   /* COMPL */		{16, NO_L_OPERAND},
1282   /* AND_AND */		{6, LEFT_ASSOC},
1283   /* OR_OR */		{5, LEFT_ASSOC},
1284   /* Note that QUERY, COLON, and COMMA must have the same precedence.
1285      However, there are some special cases for these in reduce().  */
1286   /* QUERY */		{4, 0},
1287   /* COLON */		{4, LEFT_ASSOC | CHECK_PROMOTION},
1288   /* COMMA */		{4, LEFT_ASSOC},
1289   /* OPEN_PAREN */	{1, NO_L_OPERAND},
1290   /* CLOSE_PAREN */	{0, 0},
1291   /* EOF */		{0, 0},
1292   /* EQ_EQ */		{11, LEFT_ASSOC},
1293   /* NOT_EQ */		{11, LEFT_ASSOC},
1294   /* GREATER_EQ */	{12, LEFT_ASSOC | CHECK_PROMOTION},
1295   /* LESS_EQ */		{12, LEFT_ASSOC | CHECK_PROMOTION},
1296   /* UPLUS */		{16, NO_L_OPERAND},
1297   /* UMINUS */		{16, NO_L_OPERAND}
1298 };
1299 
1300 /* Parse and evaluate a C expression, reading from PFILE.
1301    Returns the truth value of the expression.
1302 
1303    The implementation is an operator precedence parser, i.e. a
1304    bottom-up parser, using a stack for not-yet-reduced tokens.
1305 
1306    The stack base is op_stack, and the current stack pointer is 'top'.
1307    There is a stack element for each operator (only), and the most
1308    recently pushed operator is 'top->op'.  An operand (value) is
1309    stored in the 'value' field of the stack element of the operator
1310    that precedes it.  */
1311 bool
_cpp_parse_expr(cpp_reader * pfile,bool is_if)1312 _cpp_parse_expr (cpp_reader *pfile, bool is_if)
1313 {
1314   struct op *top = pfile->op_stack;
1315   unsigned int lex_count;
1316   bool saw_leading_not, want_value = true;
1317   location_t virtual_location = 0;
1318 
1319   pfile->state.skip_eval = 0;
1320 
1321   /* Set up detection of #if ! defined().  */
1322   pfile->mi_ind_cmacro = 0;
1323   saw_leading_not = false;
1324   lex_count = 0;
1325 
1326   /* Lowest priority operator prevents further reductions.  */
1327   top->op = CPP_EOF;
1328 
1329   for (;;)
1330     {
1331       struct op op;
1332 
1333       lex_count++;
1334       op.token = cpp_get_token_with_location (pfile, &virtual_location);
1335       op.op = op.token->type;
1336       op.loc = virtual_location;
1337 
1338       switch (op.op)
1339 	{
1340 	  /* These tokens convert into values.  */
1341 	case CPP_NUMBER:
1342 	case CPP_CHAR:
1343 	case CPP_WCHAR:
1344 	case CPP_CHAR16:
1345 	case CPP_CHAR32:
1346 	case CPP_UTF8CHAR:
1347 	case CPP_NAME:
1348 	case CPP_HASH:
1349 	  if (!want_value)
1350 	    SYNTAX_ERROR2_AT (op.loc,
1351 			      "missing binary operator before token \"%s\"",
1352 			      cpp_token_as_text (pfile, op.token));
1353 	  want_value = false;
1354 	  top->value = eval_token (pfile, op.token, op.loc);
1355 	  continue;
1356 
1357 	case CPP_NOT:
1358 	  saw_leading_not = lex_count == 1;
1359 	  break;
1360 	case CPP_PLUS:
1361 	  if (want_value)
1362 	    op.op = CPP_UPLUS;
1363 	  break;
1364 	case CPP_MINUS:
1365 	  if (want_value)
1366 	    op.op = CPP_UMINUS;
1367 	  break;
1368 
1369 	case CPP_PADDING:
1370 	  lex_count--;
1371 	  continue;
1372 
1373 	default:
1374 	  if ((int) op.op <= (int) CPP_EQ || (int) op.op >= (int) CPP_PLUS_EQ)
1375 	    SYNTAX_ERROR2_AT (op.loc,
1376 			      "token \"%s\" is not valid in preprocessor expressions",
1377 			      cpp_token_as_text (pfile, op.token));
1378 	  break;
1379 	}
1380 
1381       /* Check we have a value or operator as appropriate.  */
1382       if (optab[op.op].flags & NO_L_OPERAND)
1383 	{
1384 	  if (!want_value)
1385 	    SYNTAX_ERROR2_AT (op.loc,
1386 			      "missing binary operator before token \"%s\"",
1387 			      cpp_token_as_text (pfile, op.token));
1388 	}
1389       else if (want_value)
1390 	{
1391 	  /* We want a number (or expression) and haven't got one.
1392 	     Try to emit a specific diagnostic.  */
1393 	  if (op.op == CPP_CLOSE_PAREN && top->op == CPP_OPEN_PAREN)
1394 	    SYNTAX_ERROR_AT (op.loc,
1395 			     "missing expression between '(' and ')'");
1396 
1397 	  if (op.op == CPP_EOF && top->op == CPP_EOF)
1398  	    SYNTAX_ERROR2_AT (op.loc,
1399 			      "%s with no expression", is_if ? "#if" : "#elif");
1400 
1401  	  if (top->op != CPP_EOF && top->op != CPP_OPEN_PAREN)
1402  	    SYNTAX_ERROR2_AT (op.loc,
1403 			      "operator '%s' has no right operand",
1404 			      cpp_token_as_text (pfile, top->token));
1405 	  else if (op.op == CPP_CLOSE_PAREN || op.op == CPP_EOF)
1406 	    /* Complain about missing paren during reduction.  */;
1407 	  else
1408 	    SYNTAX_ERROR2_AT (op.loc,
1409 			      "operator '%s' has no left operand",
1410 			      cpp_token_as_text (pfile, op.token));
1411 	}
1412 
1413       top = reduce (pfile, top, op.op);
1414       if (!top)
1415 	goto syntax_error;
1416 
1417       if (op.op == CPP_EOF)
1418 	break;
1419 
1420       switch (op.op)
1421 	{
1422 	case CPP_CLOSE_PAREN:
1423 	  continue;
1424 	case CPP_OR_OR:
1425 	  if (!num_zerop (top->value))
1426 	    pfile->state.skip_eval++;
1427 	  break;
1428 	case CPP_AND_AND:
1429 	case CPP_QUERY:
1430 	  if (num_zerop (top->value))
1431 	    pfile->state.skip_eval++;
1432 	  break;
1433 	case CPP_COLON:
1434 	  if (top->op != CPP_QUERY)
1435 	    SYNTAX_ERROR_AT (op.loc,
1436 			     " ':' without preceding '?'");
1437 	  if (!num_zerop (top[-1].value)) /* Was '?' condition true?  */
1438 	    pfile->state.skip_eval++;
1439 	  else
1440 	    pfile->state.skip_eval--;
1441 	default:
1442 	  break;
1443 	}
1444 
1445       want_value = true;
1446 
1447       /* Check for and handle stack overflow.  */
1448       if (++top == pfile->op_limit)
1449 	top = _cpp_expand_op_stack (pfile);
1450 
1451       top->op = op.op;
1452       top->token = op.token;
1453       top->loc = op.loc;
1454     }
1455 
1456   /* The controlling macro expression is only valid if we called lex 3
1457      times: <!> <defined expression> and <EOF>.  push_conditional ()
1458      checks that we are at top-of-file.  */
1459   if (pfile->mi_ind_cmacro && !(saw_leading_not && lex_count == 3))
1460     pfile->mi_ind_cmacro = 0;
1461 
1462   if (top != pfile->op_stack)
1463     {
1464       cpp_error_with_line (pfile, CPP_DL_ICE, top->loc, 0,
1465 			   "unbalanced stack in %s",
1466 			   is_if ? "#if" : "#elif");
1467     syntax_error:
1468       return false;  /* Return false on syntax error.  */
1469     }
1470 
1471   return !num_zerop (top->value);
1472 }
1473 
1474 /* Reduce the operator / value stack if possible, in preparation for
1475    pushing operator OP.  Returns NULL on error, otherwise the top of
1476    the stack.  */
1477 static struct op *
reduce(cpp_reader * pfile,struct op * top,enum cpp_ttype op)1478 reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op)
1479 {
1480   unsigned int prio;
1481 
1482   if (top->op <= CPP_EQ || top->op > CPP_LAST_CPP_OP + 2)
1483     {
1484     bad_op:
1485       cpp_error (pfile, CPP_DL_ICE, "impossible operator '%u'", top->op);
1486       return 0;
1487     }
1488 
1489   if (op == CPP_OPEN_PAREN)
1490     return top;
1491 
1492   /* Decrement the priority of left-associative operators to force a
1493      reduction with operators of otherwise equal priority.  */
1494   prio = optab[op].prio - ((optab[op].flags & LEFT_ASSOC) != 0);
1495   while (prio < optab[top->op].prio)
1496     {
1497       if (CPP_OPTION (pfile, warn_num_sign_change)
1498 	  && optab[top->op].flags & CHECK_PROMOTION)
1499 	check_promotion (pfile, top);
1500 
1501       switch (top->op)
1502 	{
1503 	case CPP_UPLUS:
1504 	case CPP_UMINUS:
1505 	case CPP_NOT:
1506 	case CPP_COMPL:
1507 	  top[-1].value = num_unary_op (pfile, top->value, top->op);
1508 	  top[-1].loc = top->loc;
1509 	  break;
1510 
1511 	case CPP_PLUS:
1512 	case CPP_MINUS:
1513 	case CPP_RSHIFT:
1514 	case CPP_LSHIFT:
1515 	case CPP_COMMA:
1516 	  top[-1].value = num_binary_op (pfile, top[-1].value,
1517 					 top->value, top->op);
1518 	  top[-1].loc = top->loc;
1519 	  break;
1520 
1521 	case CPP_GREATER:
1522 	case CPP_LESS:
1523 	case CPP_GREATER_EQ:
1524 	case CPP_LESS_EQ:
1525 	  top[-1].value
1526 	    = num_inequality_op (pfile, top[-1].value, top->value, top->op);
1527 	  top[-1].loc = top->loc;
1528 	  break;
1529 
1530 	case CPP_EQ_EQ:
1531 	case CPP_NOT_EQ:
1532 	  top[-1].value
1533 	    = num_equality_op (pfile, top[-1].value, top->value, top->op);
1534 	  top[-1].loc = top->loc;
1535 	  break;
1536 
1537 	case CPP_AND:
1538 	case CPP_OR:
1539 	case CPP_XOR:
1540 	  top[-1].value
1541 	    = num_bitwise_op (pfile, top[-1].value, top->value, top->op);
1542 	  top[-1].loc = top->loc;
1543 	  break;
1544 
1545 	case CPP_MULT:
1546 	  top[-1].value = num_mul (pfile, top[-1].value, top->value);
1547 	  top[-1].loc = top->loc;
1548 	  break;
1549 
1550 	case CPP_DIV:
1551 	case CPP_MOD:
1552 	  top[-1].value = num_div_op (pfile, top[-1].value,
1553 				      top->value, top->op, top->loc);
1554 	  top[-1].loc = top->loc;
1555 	  break;
1556 
1557 	case CPP_OR_OR:
1558 	  top--;
1559 	  if (!num_zerop (top->value))
1560 	    pfile->state.skip_eval--;
1561 	  top->value.low = (!num_zerop (top->value)
1562 			    || !num_zerop (top[1].value));
1563 	  top->value.high = 0;
1564 	  top->value.unsignedp = false;
1565 	  top->value.overflow = false;
1566 	  top->loc = top[1].loc;
1567 	  continue;
1568 
1569 	case CPP_AND_AND:
1570 	  top--;
1571 	  if (num_zerop (top->value))
1572 	    pfile->state.skip_eval--;
1573 	  top->value.low = (!num_zerop (top->value)
1574 			    && !num_zerop (top[1].value));
1575 	  top->value.high = 0;
1576 	  top->value.unsignedp = false;
1577 	  top->value.overflow = false;
1578 	  top->loc = top[1].loc;
1579 	  continue;
1580 
1581 	case CPP_OPEN_PAREN:
1582 	  if (op != CPP_CLOSE_PAREN)
1583 	    {
1584 	      cpp_error_with_line (pfile, CPP_DL_ERROR,
1585 				   top->token->src_loc,
1586 				   0, "missing ')' in expression");
1587 	      return 0;
1588 	    }
1589 	  top--;
1590 	  top->value = top[1].value;
1591 	  top->loc = top[1].loc;
1592 	  return top;
1593 
1594 	case CPP_COLON:
1595 	  top -= 2;
1596 	  if (!num_zerop (top->value))
1597 	    {
1598 	      pfile->state.skip_eval--;
1599 	      top->value = top[1].value;
1600 	      top->loc = top[1].loc;
1601 	    }
1602 	  else
1603 	    {
1604 	      top->value = top[2].value;
1605 	      top->loc = top[2].loc;
1606 	    }
1607 	  top->value.unsignedp = (top[1].value.unsignedp
1608 				  || top[2].value.unsignedp);
1609 	  continue;
1610 
1611 	case CPP_QUERY:
1612 	  /* COMMA and COLON should not reduce a QUERY operator.  */
1613 	  if (op == CPP_COMMA || op == CPP_COLON)
1614 	    return top;
1615 	  cpp_error (pfile, CPP_DL_ERROR, "'?' without following ':'");
1616 	  return 0;
1617 
1618 	default:
1619 	  goto bad_op;
1620 	}
1621 
1622       top--;
1623       if (top->value.overflow && !pfile->state.skip_eval)
1624 	cpp_error (pfile, CPP_DL_PEDWARN,
1625 		   "integer overflow in preprocessor expression");
1626     }
1627 
1628   if (op == CPP_CLOSE_PAREN)
1629     {
1630       cpp_error (pfile, CPP_DL_ERROR, "missing '(' in expression");
1631       return 0;
1632     }
1633 
1634   return top;
1635 }
1636 
1637 /* Returns the position of the old top of stack after expansion.  */
1638 struct op *
_cpp_expand_op_stack(cpp_reader * pfile)1639 _cpp_expand_op_stack (cpp_reader *pfile)
1640 {
1641   size_t old_size = (size_t) (pfile->op_limit - pfile->op_stack);
1642   size_t new_size = old_size * 2 + 20;
1643 
1644   pfile->op_stack = XRESIZEVEC (struct op, pfile->op_stack, new_size);
1645   pfile->op_limit = pfile->op_stack + new_size;
1646 
1647   return pfile->op_stack + old_size;
1648 }
1649 
1650 /* Emits a warning if the effective sign of either operand of OP
1651    changes because of integer promotions.  */
1652 static void
check_promotion(cpp_reader * pfile,const struct op * op)1653 check_promotion (cpp_reader *pfile, const struct op *op)
1654 {
1655   if (op->value.unsignedp == op[-1].value.unsignedp)
1656     return;
1657 
1658   if (op->value.unsignedp)
1659     {
1660       if (!num_positive (op[-1].value, CPP_OPTION (pfile, precision)))
1661 	cpp_error_with_line (pfile, CPP_DL_WARNING, op[-1].loc, 0,
1662 			     "the left operand of \"%s\" changes sign when promoted",
1663 			     cpp_token_as_text (pfile, op->token));
1664     }
1665   else if (!num_positive (op->value, CPP_OPTION (pfile, precision)))
1666     cpp_error_with_line (pfile, CPP_DL_WARNING, op->loc, 0,
1667 	       "the right operand of \"%s\" changes sign when promoted",
1668 	       cpp_token_as_text (pfile, op->token));
1669 }
1670 
1671 /* Clears the unused high order bits of the number pointed to by PNUM.  */
1672 static cpp_num
num_trim(cpp_num num,size_t precision)1673 num_trim (cpp_num num, size_t precision)
1674 {
1675   if (precision > PART_PRECISION)
1676     {
1677       precision -= PART_PRECISION;
1678       if (precision < PART_PRECISION)
1679 	num.high &= ((cpp_num_part) 1 << precision) - 1;
1680     }
1681   else
1682     {
1683       if (precision < PART_PRECISION)
1684 	num.low &= ((cpp_num_part) 1 << precision) - 1;
1685       num.high = 0;
1686     }
1687 
1688   return num;
1689 }
1690 
1691 /* True iff A (presumed signed) >= 0.  */
1692 static bool
num_positive(cpp_num num,size_t precision)1693 num_positive (cpp_num num, size_t precision)
1694 {
1695   if (precision > PART_PRECISION)
1696     {
1697       precision -= PART_PRECISION;
1698       return (num.high & (cpp_num_part) 1 << (precision - 1)) == 0;
1699     }
1700 
1701   return (num.low & (cpp_num_part) 1 << (precision - 1)) == 0;
1702 }
1703 
1704 /* Sign extend a number, with PRECISION significant bits and all
1705    others assumed clear, to fill out a cpp_num structure.  */
1706 cpp_num
cpp_num_sign_extend(cpp_num num,size_t precision)1707 cpp_num_sign_extend (cpp_num num, size_t precision)
1708 {
1709   if (!num.unsignedp)
1710     {
1711       if (precision > PART_PRECISION)
1712 	{
1713 	  precision -= PART_PRECISION;
1714 	  if (precision < PART_PRECISION
1715 	      && (num.high & (cpp_num_part) 1 << (precision - 1)))
1716 	    num.high |= ~(~(cpp_num_part) 0 >> (PART_PRECISION - precision));
1717 	}
1718       else if (num.low & (cpp_num_part) 1 << (precision - 1))
1719 	{
1720 	  if (precision < PART_PRECISION)
1721 	    num.low |= ~(~(cpp_num_part) 0 >> (PART_PRECISION - precision));
1722 	  num.high = ~(cpp_num_part) 0;
1723 	}
1724     }
1725 
1726   return num;
1727 }
1728 
1729 /* Returns the negative of NUM.  */
1730 static cpp_num
num_negate(cpp_num num,size_t precision)1731 num_negate (cpp_num num, size_t precision)
1732 {
1733   cpp_num copy;
1734 
1735   copy = num;
1736   num.high = ~num.high;
1737   num.low = ~num.low;
1738   if (++num.low == 0)
1739     num.high++;
1740   num = num_trim (num, precision);
1741   num.overflow = (!num.unsignedp && num_eq (num, copy) && !num_zerop (num));
1742 
1743   return num;
1744 }
1745 
1746 /* Returns true if A >= B.  */
1747 static bool
num_greater_eq(cpp_num pa,cpp_num pb,size_t precision)1748 num_greater_eq (cpp_num pa, cpp_num pb, size_t precision)
1749 {
1750   bool unsignedp;
1751 
1752   unsignedp = pa.unsignedp || pb.unsignedp;
1753 
1754   if (!unsignedp)
1755     {
1756       /* Both numbers have signed type.  If they are of different
1757        sign, the answer is the sign of A.  */
1758       unsignedp = num_positive (pa, precision);
1759 
1760       if (unsignedp != num_positive (pb, precision))
1761 	return unsignedp;
1762 
1763       /* Otherwise we can do an unsigned comparison.  */
1764     }
1765 
1766   return (pa.high > pb.high) || (pa.high == pb.high && pa.low >= pb.low);
1767 }
1768 
1769 /* Returns LHS OP RHS, where OP is a bit-wise operation.  */
1770 static cpp_num
num_bitwise_op(cpp_reader * pfile ATTRIBUTE_UNUSED,cpp_num lhs,cpp_num rhs,enum cpp_ttype op)1771 num_bitwise_op (cpp_reader *pfile ATTRIBUTE_UNUSED,
1772 		cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
1773 {
1774   lhs.overflow = false;
1775   lhs.unsignedp = lhs.unsignedp || rhs.unsignedp;
1776 
1777   /* As excess precision is zeroed, there is no need to num_trim () as
1778      these operations cannot introduce a set bit there.  */
1779   if (op == CPP_AND)
1780     {
1781       lhs.low &= rhs.low;
1782       lhs.high &= rhs.high;
1783     }
1784   else if (op == CPP_OR)
1785     {
1786       lhs.low |= rhs.low;
1787       lhs.high |= rhs.high;
1788     }
1789   else
1790     {
1791       lhs.low ^= rhs.low;
1792       lhs.high ^= rhs.high;
1793     }
1794 
1795   return lhs;
1796 }
1797 
1798 /* Returns LHS OP RHS, where OP is an inequality.  */
1799 static cpp_num
num_inequality_op(cpp_reader * pfile,cpp_num lhs,cpp_num rhs,enum cpp_ttype op)1800 num_inequality_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs,
1801 		   enum cpp_ttype op)
1802 {
1803   bool gte = num_greater_eq (lhs, rhs, CPP_OPTION (pfile, precision));
1804 
1805   if (op == CPP_GREATER_EQ)
1806     lhs.low = gte;
1807   else if (op == CPP_LESS)
1808     lhs.low = !gte;
1809   else if (op == CPP_GREATER)
1810     lhs.low = gte && !num_eq (lhs, rhs);
1811   else /* CPP_LESS_EQ.  */
1812     lhs.low = !gte || num_eq (lhs, rhs);
1813 
1814   lhs.high = 0;
1815   lhs.overflow = false;
1816   lhs.unsignedp = false;
1817   return lhs;
1818 }
1819 
1820 /* Returns LHS OP RHS, where OP is == or !=.  */
1821 static cpp_num
num_equality_op(cpp_reader * pfile ATTRIBUTE_UNUSED,cpp_num lhs,cpp_num rhs,enum cpp_ttype op)1822 num_equality_op (cpp_reader *pfile ATTRIBUTE_UNUSED,
1823 		 cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
1824 {
1825   /* Work around a 3.0.4 bug; see PR 6950.  */
1826   bool eq = num_eq (lhs, rhs);
1827   if (op == CPP_NOT_EQ)
1828     eq = !eq;
1829   lhs.low = eq;
1830   lhs.high = 0;
1831   lhs.overflow = false;
1832   lhs.unsignedp = false;
1833   return lhs;
1834 }
1835 
1836 /* Shift NUM, of width PRECISION, right by N bits.  */
1837 static cpp_num
num_rshift(cpp_num num,size_t precision,size_t n)1838 num_rshift (cpp_num num, size_t precision, size_t n)
1839 {
1840   cpp_num_part sign_mask;
1841   bool x = num_positive (num, precision);
1842 
1843   if (num.unsignedp || x)
1844     sign_mask = 0;
1845   else
1846     sign_mask = ~(cpp_num_part) 0;
1847 
1848   if (n >= precision)
1849     num.high = num.low = sign_mask;
1850   else
1851     {
1852       /* Sign-extend.  */
1853       if (precision < PART_PRECISION)
1854 	num.high = sign_mask, num.low |= sign_mask << precision;
1855       else if (precision < 2 * PART_PRECISION)
1856 	num.high |= sign_mask << (precision - PART_PRECISION);
1857 
1858       if (n >= PART_PRECISION)
1859 	{
1860 	  n -= PART_PRECISION;
1861 	  num.low = num.high;
1862 	  num.high = sign_mask;
1863 	}
1864 
1865       if (n)
1866 	{
1867 	  num.low = (num.low >> n) | (num.high << (PART_PRECISION - n));
1868 	  num.high = (num.high >> n) | (sign_mask << (PART_PRECISION - n));
1869 	}
1870     }
1871 
1872   num = num_trim (num, precision);
1873   num.overflow = false;
1874   return num;
1875 }
1876 
1877 /* Shift NUM, of width PRECISION, left by N bits.  */
1878 static cpp_num
num_lshift(cpp_num num,size_t precision,size_t n)1879 num_lshift (cpp_num num, size_t precision, size_t n)
1880 {
1881   if (n >= precision)
1882     {
1883       num.overflow = !num.unsignedp && !num_zerop (num);
1884       num.high = num.low = 0;
1885     }
1886   else
1887     {
1888       cpp_num orig, maybe_orig;
1889       size_t m = n;
1890 
1891       orig = num;
1892       if (m >= PART_PRECISION)
1893 	{
1894 	  m -= PART_PRECISION;
1895 	  num.high = num.low;
1896 	  num.low = 0;
1897 	}
1898       if (m)
1899 	{
1900 	  num.high = (num.high << m) | (num.low >> (PART_PRECISION - m));
1901 	  num.low <<= m;
1902 	}
1903       num = num_trim (num, precision);
1904 
1905       if (num.unsignedp)
1906 	num.overflow = false;
1907       else
1908 	{
1909 	  maybe_orig = num_rshift (num, precision, n);
1910 	  num.overflow = !num_eq (orig, maybe_orig);
1911 	}
1912     }
1913 
1914   return num;
1915 }
1916 
1917 /* The four unary operators: +, -, ! and ~.  */
1918 static cpp_num
num_unary_op(cpp_reader * pfile,cpp_num num,enum cpp_ttype op)1919 num_unary_op (cpp_reader *pfile, cpp_num num, enum cpp_ttype op)
1920 {
1921   switch (op)
1922     {
1923     case CPP_UPLUS:
1924       if (CPP_WTRADITIONAL (pfile) && !pfile->state.skip_eval)
1925 	cpp_warning (pfile, CPP_W_TRADITIONAL,
1926 		     "traditional C rejects the unary plus operator");
1927       num.overflow = false;
1928       break;
1929 
1930     case CPP_UMINUS:
1931       num = num_negate (num, CPP_OPTION (pfile, precision));
1932       break;
1933 
1934     case CPP_COMPL:
1935       num.high = ~num.high;
1936       num.low = ~num.low;
1937       num = num_trim (num, CPP_OPTION (pfile, precision));
1938       num.overflow = false;
1939       break;
1940 
1941     default: /* case CPP_NOT: */
1942       num.low = num_zerop (num);
1943       num.high = 0;
1944       num.overflow = false;
1945       num.unsignedp = false;
1946       break;
1947     }
1948 
1949   return num;
1950 }
1951 
1952 /* The various binary operators.  */
1953 static cpp_num
num_binary_op(cpp_reader * pfile,cpp_num lhs,cpp_num rhs,enum cpp_ttype op)1954 num_binary_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
1955 {
1956   cpp_num result;
1957   size_t precision = CPP_OPTION (pfile, precision);
1958   size_t n;
1959 
1960   switch (op)
1961     {
1962       /* Shifts.  */
1963     case CPP_LSHIFT:
1964     case CPP_RSHIFT:
1965       if (!rhs.unsignedp && !num_positive (rhs, precision))
1966 	{
1967 	  /* A negative shift is a positive shift the other way.  */
1968 	  if (op == CPP_LSHIFT)
1969 	    op = CPP_RSHIFT;
1970 	  else
1971 	    op = CPP_LSHIFT;
1972 	  rhs = num_negate (rhs, precision);
1973 	}
1974       if (rhs.high)
1975 	n = ~0;			/* Maximal.  */
1976       else
1977 	n = rhs.low;
1978       if (op == CPP_LSHIFT)
1979 	lhs = num_lshift (lhs, precision, n);
1980       else
1981 	lhs = num_rshift (lhs, precision, n);
1982       break;
1983 
1984       /* Arithmetic.  */
1985     case CPP_MINUS:
1986       result.low = lhs.low - rhs.low;
1987       result.high = lhs.high - rhs.high;
1988       if (result.low > lhs.low)
1989 	result.high--;
1990       result.unsignedp = lhs.unsignedp || rhs.unsignedp;
1991       result.overflow = false;
1992 
1993       result = num_trim (result, precision);
1994       if (!result.unsignedp)
1995 	{
1996 	  bool lhsp = num_positive (lhs, precision);
1997 	  result.overflow = (lhsp != num_positive (rhs, precision)
1998 			     && lhsp != num_positive (result, precision));
1999 	}
2000       return result;
2001 
2002     case CPP_PLUS:
2003       result.low = lhs.low + rhs.low;
2004       result.high = lhs.high + rhs.high;
2005       if (result.low < lhs.low)
2006 	result.high++;
2007       result.unsignedp = lhs.unsignedp || rhs.unsignedp;
2008       result.overflow = false;
2009 
2010       result = num_trim (result, precision);
2011       if (!result.unsignedp)
2012 	{
2013 	  bool lhsp = num_positive (lhs, precision);
2014 	  result.overflow = (lhsp == num_positive (rhs, precision)
2015 			     && lhsp != num_positive (result, precision));
2016 	}
2017       return result;
2018 
2019       /* Comma.  */
2020     default: /* case CPP_COMMA: */
2021       if (CPP_PEDANTIC (pfile) && (!CPP_OPTION (pfile, c99)
2022 				   || !pfile->state.skip_eval))
2023 	cpp_pedwarning (pfile, CPP_W_PEDANTIC,
2024 			"comma operator in operand of #if");
2025       lhs = rhs;
2026       break;
2027     }
2028 
2029   return lhs;
2030 }
2031 
2032 /* Multiplies two unsigned cpp_num_parts to give a cpp_num.  This
2033    cannot overflow.  */
2034 static cpp_num
num_part_mul(cpp_num_part lhs,cpp_num_part rhs)2035 num_part_mul (cpp_num_part lhs, cpp_num_part rhs)
2036 {
2037   cpp_num result;
2038   cpp_num_part middle[2], temp;
2039 
2040   result.low = LOW_PART (lhs) * LOW_PART (rhs);
2041   result.high = HIGH_PART (lhs) * HIGH_PART (rhs);
2042 
2043   middle[0] = LOW_PART (lhs) * HIGH_PART (rhs);
2044   middle[1] = HIGH_PART (lhs) * LOW_PART (rhs);
2045 
2046   temp = result.low;
2047   result.low += LOW_PART (middle[0]) << (PART_PRECISION / 2);
2048   if (result.low < temp)
2049     result.high++;
2050 
2051   temp = result.low;
2052   result.low += LOW_PART (middle[1]) << (PART_PRECISION / 2);
2053   if (result.low < temp)
2054     result.high++;
2055 
2056   result.high += HIGH_PART (middle[0]);
2057   result.high += HIGH_PART (middle[1]);
2058   result.unsignedp = true;
2059   result.overflow = false;
2060 
2061   return result;
2062 }
2063 
2064 /* Multiply two preprocessing numbers.  */
2065 static cpp_num
num_mul(cpp_reader * pfile,cpp_num lhs,cpp_num rhs)2066 num_mul (cpp_reader *pfile, cpp_num lhs, cpp_num rhs)
2067 {
2068   cpp_num result, temp;
2069   bool unsignedp = lhs.unsignedp || rhs.unsignedp;
2070   bool overflow, negate = false;
2071   size_t precision = CPP_OPTION (pfile, precision);
2072 
2073   /* Prepare for unsigned multiplication.  */
2074   if (!unsignedp)
2075     {
2076       if (!num_positive (lhs, precision))
2077 	negate = !negate, lhs = num_negate (lhs, precision);
2078       if (!num_positive (rhs, precision))
2079 	negate = !negate, rhs = num_negate (rhs, precision);
2080     }
2081 
2082   overflow = lhs.high && rhs.high;
2083   result = num_part_mul (lhs.low, rhs.low);
2084 
2085   temp = num_part_mul (lhs.high, rhs.low);
2086   result.high += temp.low;
2087   if (temp.high)
2088     overflow = true;
2089 
2090   temp = num_part_mul (lhs.low, rhs.high);
2091   result.high += temp.low;
2092   if (temp.high)
2093     overflow = true;
2094 
2095   temp.low = result.low, temp.high = result.high;
2096   result = num_trim (result, precision);
2097   if (!num_eq (result, temp))
2098     overflow = true;
2099 
2100   if (negate)
2101     result = num_negate (result, precision);
2102 
2103   if (unsignedp)
2104     result.overflow = false;
2105   else
2106     result.overflow = overflow || (num_positive (result, precision) ^ !negate
2107 				   && !num_zerop (result));
2108   result.unsignedp = unsignedp;
2109 
2110   return result;
2111 }
2112 
2113 /* Divide two preprocessing numbers, LHS and RHS, returning the answer
2114    or the remainder depending upon OP. LOCATION is the source location
2115    of this operator (for diagnostics).  */
2116 
2117 static cpp_num
num_div_op(cpp_reader * pfile,cpp_num lhs,cpp_num rhs,enum cpp_ttype op,location_t location)2118 num_div_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op,
2119 	    location_t location)
2120 {
2121   cpp_num result, sub;
2122   cpp_num_part mask;
2123   bool unsignedp = lhs.unsignedp || rhs.unsignedp;
2124   bool negate = false, lhs_neg = false;
2125   size_t i, precision = CPP_OPTION (pfile, precision);
2126 
2127   /* Prepare for unsigned division.  */
2128   if (!unsignedp)
2129     {
2130       if (!num_positive (lhs, precision))
2131 	negate = !negate, lhs_neg = true, lhs = num_negate (lhs, precision);
2132       if (!num_positive (rhs, precision))
2133 	negate = !negate, rhs = num_negate (rhs, precision);
2134     }
2135 
2136   /* Find the high bit.  */
2137   if (rhs.high)
2138     {
2139       i = precision - 1;
2140       mask = (cpp_num_part) 1 << (i - PART_PRECISION);
2141       for (; ; i--, mask >>= 1)
2142 	if (rhs.high & mask)
2143 	  break;
2144     }
2145   else if (rhs.low)
2146     {
2147       if (precision > PART_PRECISION)
2148 	i = precision - PART_PRECISION - 1;
2149       else
2150 	i = precision - 1;
2151       mask = (cpp_num_part) 1 << i;
2152       for (; ; i--, mask >>= 1)
2153 	if (rhs.low & mask)
2154 	  break;
2155     }
2156   else
2157     {
2158       if (!pfile->state.skip_eval)
2159 	cpp_error_with_line (pfile, CPP_DL_ERROR, location, 0,
2160 			     "division by zero in #if");
2161       return lhs;
2162     }
2163 
2164   /* First nonzero bit of RHS is bit I.  Do naive division by
2165      shifting the RHS fully left, and subtracting from LHS if LHS is
2166      at least as big, and then repeating but with one less shift.
2167      This is not very efficient, but is easy to understand.  */
2168 
2169   rhs.unsignedp = true;
2170   lhs.unsignedp = true;
2171   i = precision - i - 1;
2172   sub = num_lshift (rhs, precision, i);
2173 
2174   result.high = result.low = 0;
2175   for (;;)
2176     {
2177       if (num_greater_eq (lhs, sub, precision))
2178 	{
2179 	  lhs = num_binary_op (pfile, lhs, sub, CPP_MINUS);
2180 	  if (i >= PART_PRECISION)
2181 	    result.high |= (cpp_num_part) 1 << (i - PART_PRECISION);
2182 	  else
2183 	    result.low |= (cpp_num_part) 1 << i;
2184 	}
2185       if (i-- == 0)
2186 	break;
2187       sub.low = (sub.low >> 1) | (sub.high << (PART_PRECISION - 1));
2188       sub.high >>= 1;
2189     }
2190 
2191   /* We divide so that the remainder has the sign of the LHS.  */
2192   if (op == CPP_DIV)
2193     {
2194       result.unsignedp = unsignedp;
2195       result.overflow = false;
2196       if (!unsignedp)
2197 	{
2198 	  if (negate)
2199 	    result = num_negate (result, precision);
2200 	  result.overflow = (num_positive (result, precision) ^ !negate
2201 			     && !num_zerop (result));
2202 	}
2203 
2204       return result;
2205     }
2206 
2207   /* CPP_MOD.  */
2208   lhs.unsignedp = unsignedp;
2209   lhs.overflow = false;
2210   if (lhs_neg)
2211     lhs = num_negate (lhs, precision);
2212 
2213   return lhs;
2214 }
2215 
2216