xref: /netbsd-src/external/gpl3/gcc.old/dist/libcpp/expr.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
136ac495dSmrg /* Parse C expressions for cpplib.
2*8feb0f0bSmrg    Copyright (C) 1987-2020 Free Software Foundation, Inc.
336ac495dSmrg    Contributed by Per Bothner, 1994.
436ac495dSmrg 
536ac495dSmrg This program is free software; you can redistribute it and/or modify it
636ac495dSmrg under the terms of the GNU General Public License as published by the
736ac495dSmrg Free Software Foundation; either version 3, or (at your option) any
836ac495dSmrg later version.
936ac495dSmrg 
1036ac495dSmrg This program is distributed in the hope that it will be useful,
1136ac495dSmrg but WITHOUT ANY WARRANTY; without even the implied warranty of
1236ac495dSmrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1336ac495dSmrg GNU General Public License for more details.
1436ac495dSmrg 
1536ac495dSmrg You should have received a copy of the GNU General Public License
1636ac495dSmrg along with this program; see the file COPYING3.  If not see
1736ac495dSmrg <http://www.gnu.org/licenses/>.  */
1836ac495dSmrg 
1936ac495dSmrg #include "config.h"
2036ac495dSmrg #include "system.h"
2136ac495dSmrg #include "cpplib.h"
2236ac495dSmrg #include "internal.h"
2336ac495dSmrg 
2436ac495dSmrg #define PART_PRECISION (sizeof (cpp_num_part) * CHAR_BIT)
2536ac495dSmrg #define HALF_MASK (~(cpp_num_part) 0 >> (PART_PRECISION / 2))
2636ac495dSmrg #define LOW_PART(num_part) (num_part & HALF_MASK)
2736ac495dSmrg #define HIGH_PART(num_part) (num_part >> (PART_PRECISION / 2))
2836ac495dSmrg 
2936ac495dSmrg struct op
3036ac495dSmrg {
3136ac495dSmrg   const cpp_token *token;	/* The token forming op (for diagnostics).  */
3236ac495dSmrg   cpp_num value;		/* The value logically "right" of op.  */
33c0a68be4Smrg   location_t loc;          /* The location of this value.         */
3436ac495dSmrg   enum cpp_ttype op;
3536ac495dSmrg };
3636ac495dSmrg 
3736ac495dSmrg /* Some simple utility routines on double integers.  */
3836ac495dSmrg #define num_zerop(num) ((num.low | num.high) == 0)
3936ac495dSmrg #define num_eq(num1, num2) (num1.low == num2.low && num1.high == num2.high)
4036ac495dSmrg static bool num_positive (cpp_num, size_t);
4136ac495dSmrg static bool num_greater_eq (cpp_num, cpp_num, size_t);
4236ac495dSmrg static cpp_num num_trim (cpp_num, size_t);
4336ac495dSmrg static cpp_num num_part_mul (cpp_num_part, cpp_num_part);
4436ac495dSmrg 
4536ac495dSmrg static cpp_num num_unary_op (cpp_reader *, cpp_num, enum cpp_ttype);
4636ac495dSmrg static cpp_num num_binary_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype);
4736ac495dSmrg static cpp_num num_negate (cpp_num, size_t);
4836ac495dSmrg static cpp_num num_bitwise_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype);
4936ac495dSmrg static cpp_num num_inequality_op (cpp_reader *, cpp_num, cpp_num,
5036ac495dSmrg 				  enum cpp_ttype);
5136ac495dSmrg static cpp_num num_equality_op (cpp_reader *, cpp_num, cpp_num,
5236ac495dSmrg 				enum cpp_ttype);
5336ac495dSmrg static cpp_num num_mul (cpp_reader *, cpp_num, cpp_num);
5436ac495dSmrg static cpp_num num_div_op (cpp_reader *, cpp_num, cpp_num, enum cpp_ttype,
55c0a68be4Smrg 			   location_t);
5636ac495dSmrg static cpp_num num_lshift (cpp_num, size_t, size_t);
5736ac495dSmrg static cpp_num num_rshift (cpp_num, size_t, size_t);
5836ac495dSmrg 
5936ac495dSmrg static cpp_num append_digit (cpp_num, int, int, size_t);
6036ac495dSmrg static cpp_num parse_defined (cpp_reader *);
61c0a68be4Smrg static cpp_num eval_token (cpp_reader *, const cpp_token *, location_t);
6236ac495dSmrg static struct op *reduce (cpp_reader *, struct op *, enum cpp_ttype);
6336ac495dSmrg static unsigned int interpret_float_suffix (cpp_reader *, const uchar *, size_t);
6436ac495dSmrg static unsigned int interpret_int_suffix (cpp_reader *, const uchar *, size_t);
6536ac495dSmrg static void check_promotion (cpp_reader *, const struct op *);
6636ac495dSmrg 
6736ac495dSmrg /* Token type abuse to create unary plus and minus operators.  */
6836ac495dSmrg #define CPP_UPLUS ((enum cpp_ttype) (CPP_LAST_CPP_OP + 1))
6936ac495dSmrg #define CPP_UMINUS ((enum cpp_ttype) (CPP_LAST_CPP_OP + 2))
7036ac495dSmrg 
7136ac495dSmrg /* With -O2, gcc appears to produce nice code, moving the error
7236ac495dSmrg    message load and subsequent jump completely out of the main path.  */
7336ac495dSmrg #define SYNTAX_ERROR(msgid) \
7436ac495dSmrg   do { cpp_error (pfile, CPP_DL_ERROR, msgid); goto syntax_error; } while(0)
7536ac495dSmrg #define SYNTAX_ERROR2(msgid, arg) \
7636ac495dSmrg   do { cpp_error (pfile, CPP_DL_ERROR, msgid, arg); goto syntax_error; } \
7736ac495dSmrg   while(0)
7836ac495dSmrg #define SYNTAX_ERROR_AT(loc, msgid) \
7936ac495dSmrg   do { cpp_error_with_line (pfile, CPP_DL_ERROR, (loc), 0, msgid); goto syntax_error; } \
8036ac495dSmrg   while(0)
8136ac495dSmrg #define SYNTAX_ERROR2_AT(loc, msgid, arg)					\
8236ac495dSmrg   do { cpp_error_with_line (pfile, CPP_DL_ERROR, (loc), 0, msgid, arg); goto syntax_error; } \
8336ac495dSmrg   while(0)
8436ac495dSmrg 
8536ac495dSmrg /* Subroutine of cpp_classify_number.  S points to a float suffix of
8636ac495dSmrg    length LEN, possibly zero.  Returns 0 for an invalid suffix, or a
8736ac495dSmrg    flag vector (of CPP_N_* bits) describing the suffix.  */
8836ac495dSmrg static unsigned int
interpret_float_suffix(cpp_reader * pfile,const uchar * s,size_t len)8936ac495dSmrg interpret_float_suffix (cpp_reader *pfile, const uchar *s, size_t len)
9036ac495dSmrg {
91a2dc1f3fSmrg   size_t orig_len = len;
92a2dc1f3fSmrg   const uchar *orig_s = s;
9336ac495dSmrg   size_t flags;
9436ac495dSmrg   size_t f, d, l, w, q, i, fn, fnx, fn_bits;
9536ac495dSmrg 
9636ac495dSmrg   flags = 0;
9736ac495dSmrg   f = d = l = w = q = i = fn = fnx = fn_bits = 0;
9836ac495dSmrg 
99*8feb0f0bSmrg   /* The following decimal float suffixes, from TR 24732:2009, TS
100*8feb0f0bSmrg      18661-2:2015 and C2X, are supported:
10136ac495dSmrg 
10236ac495dSmrg      df, DF - _Decimal32.
10336ac495dSmrg      dd, DD - _Decimal64.
10436ac495dSmrg      dl, DL - _Decimal128.
10536ac495dSmrg 
10636ac495dSmrg      The dN and DN suffixes for _DecimalN, and dNx and DNx for
10736ac495dSmrg      _DecimalNx, defined in TS 18661-3:2015, are not supported.
10836ac495dSmrg 
10936ac495dSmrg      Fixed-point suffixes, from TR 18037:2008, are supported.  They
11036ac495dSmrg      consist of three parts, in order:
11136ac495dSmrg 
11236ac495dSmrg      (i) An optional u or U, for unsigned types.
11336ac495dSmrg 
11436ac495dSmrg      (ii) An optional h or H, for short types, or l or L, for long
11536ac495dSmrg      types, or ll or LL, for long long types.  Use of ll or LL is a
11636ac495dSmrg      GNU extension.
11736ac495dSmrg 
11836ac495dSmrg      (iii) r or R, for _Fract types, or k or K, for _Accum types.
11936ac495dSmrg 
12036ac495dSmrg      Otherwise the suffix is for a binary or standard floating-point
12136ac495dSmrg      type.  Such a suffix, or the absence of a suffix, may be preceded
12236ac495dSmrg      or followed by i, I, j or J, to indicate an imaginary number with
12336ac495dSmrg      the corresponding complex type.  The following suffixes for
12436ac495dSmrg      binary or standard floating-point types are supported:
12536ac495dSmrg 
12636ac495dSmrg      f, F - float (ISO C and C++).
12736ac495dSmrg      l, L - long double (ISO C and C++).
12836ac495dSmrg      d, D - double, even with the FLOAT_CONST_DECIMAL64 pragma in
12936ac495dSmrg 	    operation (from TR 24732:2009; the pragma and the suffix
13036ac495dSmrg 	    are not included in TS 18661-2:2015).
13136ac495dSmrg      w, W - machine-specific type such as __float80 (GNU extension).
13236ac495dSmrg      q, Q - machine-specific type such as __float128 (GNU extension).
13336ac495dSmrg      fN, FN - _FloatN (TS 18661-3:2015).
13436ac495dSmrg      fNx, FNx - _FloatNx (TS 18661-3:2015).  */
13536ac495dSmrg 
13636ac495dSmrg   /* Process decimal float suffixes, which are two letters starting
13736ac495dSmrg      with d or D.  Order and case are significant.  */
13836ac495dSmrg   if (len == 2 && (*s == 'd' || *s == 'D'))
13936ac495dSmrg     {
14036ac495dSmrg       bool uppercase = (*s == 'D');
14136ac495dSmrg       switch (s[1])
14236ac495dSmrg       {
14336ac495dSmrg       case 'f': return (!uppercase ? (CPP_N_DFLOAT | CPP_N_SMALL): 0); break;
14436ac495dSmrg       case 'F': return (uppercase ? (CPP_N_DFLOAT | CPP_N_SMALL) : 0); break;
14536ac495dSmrg       case 'd': return (!uppercase ? (CPP_N_DFLOAT | CPP_N_MEDIUM): 0); break;
14636ac495dSmrg       case 'D': return (uppercase ? (CPP_N_DFLOAT | CPP_N_MEDIUM) : 0); break;
14736ac495dSmrg       case 'l': return (!uppercase ? (CPP_N_DFLOAT | CPP_N_LARGE) : 0); break;
14836ac495dSmrg       case 'L': return (uppercase ? (CPP_N_DFLOAT | CPP_N_LARGE) : 0); break;
14936ac495dSmrg       default:
15036ac495dSmrg 	/* Additional two-character suffixes beginning with D are not
15136ac495dSmrg 	   for decimal float constants.  */
15236ac495dSmrg 	break;
15336ac495dSmrg       }
15436ac495dSmrg     }
15536ac495dSmrg 
15636ac495dSmrg   if (CPP_OPTION (pfile, ext_numeric_literals))
15736ac495dSmrg     {
15836ac495dSmrg       /* Recognize a fixed-point suffix.  */
15936ac495dSmrg       if (len != 0)
16036ac495dSmrg 	switch (s[len-1])
16136ac495dSmrg 	  {
16236ac495dSmrg 	  case 'k': case 'K': flags = CPP_N_ACCUM; break;
16336ac495dSmrg 	  case 'r': case 'R': flags = CPP_N_FRACT; break;
16436ac495dSmrg 	  default: break;
16536ac495dSmrg 	  }
16636ac495dSmrg 
16736ac495dSmrg       /* Continue processing a fixed-point suffix.  The suffix is case
16836ac495dSmrg 	 insensitive except for ll or LL.  Order is significant.  */
16936ac495dSmrg       if (flags)
17036ac495dSmrg 	{
17136ac495dSmrg 	  if (len == 1)
17236ac495dSmrg 	    return flags;
17336ac495dSmrg 	  len--;
17436ac495dSmrg 
17536ac495dSmrg 	  if (*s == 'u' || *s == 'U')
17636ac495dSmrg 	    {
17736ac495dSmrg 	      flags |= CPP_N_UNSIGNED;
17836ac495dSmrg 	      if (len == 1)
17936ac495dSmrg 		return flags;
18036ac495dSmrg 	      len--;
18136ac495dSmrg 	      s++;
18236ac495dSmrg             }
18336ac495dSmrg 
18436ac495dSmrg 	  switch (*s)
18536ac495dSmrg 	  {
18636ac495dSmrg 	  case 'h': case 'H':
18736ac495dSmrg 	    if (len == 1)
18836ac495dSmrg 	      return flags |= CPP_N_SMALL;
18936ac495dSmrg 	    break;
19036ac495dSmrg 	  case 'l':
19136ac495dSmrg 	    if (len == 1)
19236ac495dSmrg 	      return flags |= CPP_N_MEDIUM;
19336ac495dSmrg 	    if (len == 2 && s[1] == 'l')
19436ac495dSmrg 	      return flags |= CPP_N_LARGE;
19536ac495dSmrg 	    break;
19636ac495dSmrg 	  case 'L':
19736ac495dSmrg 	    if (len == 1)
19836ac495dSmrg 	      return flags |= CPP_N_MEDIUM;
19936ac495dSmrg 	    if (len == 2 && s[1] == 'L')
20036ac495dSmrg 	      return flags |= CPP_N_LARGE;
20136ac495dSmrg 	    break;
20236ac495dSmrg 	  default:
20336ac495dSmrg 	    break;
20436ac495dSmrg 	  }
20536ac495dSmrg 	  /* Anything left at this point is invalid.  */
20636ac495dSmrg 	  return 0;
20736ac495dSmrg 	}
20836ac495dSmrg     }
20936ac495dSmrg 
21036ac495dSmrg   /* In any remaining valid suffix, the case and order don't matter.  */
21136ac495dSmrg   while (len--)
21236ac495dSmrg     {
21336ac495dSmrg       switch (s[0])
21436ac495dSmrg 	{
21536ac495dSmrg 	case 'f': case 'F':
21636ac495dSmrg 	  f++;
21736ac495dSmrg 	  if (len > 0
21836ac495dSmrg 	      && !CPP_OPTION (pfile, cplusplus)
21936ac495dSmrg 	      && s[1] >= '1'
22036ac495dSmrg 	      && s[1] <= '9'
22136ac495dSmrg 	      && fn_bits == 0)
22236ac495dSmrg 	    {
22336ac495dSmrg 	      f--;
22436ac495dSmrg 	      while (len > 0
22536ac495dSmrg 		     && s[1] >= '0'
22636ac495dSmrg 		     && s[1] <= '9'
22736ac495dSmrg 		     && fn_bits < CPP_FLOATN_MAX)
22836ac495dSmrg 		{
22936ac495dSmrg 		  fn_bits = fn_bits * 10 + (s[1] - '0');
23036ac495dSmrg 		  len--;
23136ac495dSmrg 		  s++;
23236ac495dSmrg 		}
23336ac495dSmrg 	      if (len > 0 && s[1] == 'x')
23436ac495dSmrg 		{
23536ac495dSmrg 		  fnx++;
23636ac495dSmrg 		  len--;
23736ac495dSmrg 		  s++;
23836ac495dSmrg 		}
23936ac495dSmrg 	      else
24036ac495dSmrg 		fn++;
24136ac495dSmrg 	    }
24236ac495dSmrg 	  break;
24336ac495dSmrg 	case 'd': case 'D': d++; break;
24436ac495dSmrg 	case 'l': case 'L': l++; break;
24536ac495dSmrg 	case 'w': case 'W': w++; break;
24636ac495dSmrg 	case 'q': case 'Q': q++; break;
24736ac495dSmrg 	case 'i': case 'I':
24836ac495dSmrg 	case 'j': case 'J': i++; break;
24936ac495dSmrg 	default:
25036ac495dSmrg 	  return 0;
25136ac495dSmrg 	}
25236ac495dSmrg       s++;
25336ac495dSmrg     }
25436ac495dSmrg 
25536ac495dSmrg   /* Reject any case of multiple suffixes specifying types, multiple
25636ac495dSmrg      suffixes specifying an imaginary constant, _FloatN or _FloatNx
25736ac495dSmrg      suffixes for invalid values of N, and _FloatN suffixes for values
25836ac495dSmrg      of N larger than can be represented in the return value.  The
25936ac495dSmrg      caller is responsible for rejecting _FloatN suffixes where
26036ac495dSmrg      _FloatN is not supported on the chosen target.  */
26136ac495dSmrg   if (f + d + l + w + q + fn + fnx > 1 || i > 1)
26236ac495dSmrg     return 0;
26336ac495dSmrg   if (fn_bits > CPP_FLOATN_MAX)
26436ac495dSmrg     return 0;
26536ac495dSmrg   if (fnx && fn_bits != 32 && fn_bits != 64 && fn_bits != 128)
26636ac495dSmrg     return 0;
26736ac495dSmrg   if (fn && fn_bits != 16 && fn_bits % 32 != 0)
26836ac495dSmrg     return 0;
26936ac495dSmrg   if (fn && fn_bits == 96)
27036ac495dSmrg     return 0;
27136ac495dSmrg 
272a2dc1f3fSmrg   if (i)
273a2dc1f3fSmrg     {
274a2dc1f3fSmrg       if (!CPP_OPTION (pfile, ext_numeric_literals))
27536ac495dSmrg 	return 0;
27636ac495dSmrg 
277a2dc1f3fSmrg       /* In C++14 and up these suffixes are in the standard library, so treat
278a2dc1f3fSmrg 	 them as user-defined literals.  */
279a2dc1f3fSmrg       if (CPP_OPTION (pfile, cplusplus)
280a2dc1f3fSmrg 	  && CPP_OPTION (pfile, lang) > CLK_CXX11
281a2dc1f3fSmrg 	  && orig_s[0] == 'i'
282a2dc1f3fSmrg 	  && (orig_len == 1
283a2dc1f3fSmrg 	      || (orig_len == 2
284a2dc1f3fSmrg 		  && (orig_s[1] == 'f' || orig_s[1] == 'l'))))
285a2dc1f3fSmrg 	return 0;
286a2dc1f3fSmrg     }
287a2dc1f3fSmrg 
28836ac495dSmrg   if ((w || q) && !CPP_OPTION (pfile, ext_numeric_literals))
28936ac495dSmrg     return 0;
29036ac495dSmrg 
29136ac495dSmrg   return ((i ? CPP_N_IMAGINARY : 0)
29236ac495dSmrg 	  | (f ? CPP_N_SMALL :
29336ac495dSmrg 	     d ? CPP_N_MEDIUM :
29436ac495dSmrg 	     l ? CPP_N_LARGE :
29536ac495dSmrg 	     w ? CPP_N_MD_W :
29636ac495dSmrg 	     q ? CPP_N_MD_Q :
29736ac495dSmrg 	     fn ? CPP_N_FLOATN | (fn_bits << CPP_FLOATN_SHIFT) :
29836ac495dSmrg 	     fnx ? CPP_N_FLOATNX | (fn_bits << CPP_FLOATN_SHIFT) :
29936ac495dSmrg 	     CPP_N_DEFAULT));
30036ac495dSmrg }
30136ac495dSmrg 
30236ac495dSmrg /* Return the classification flags for a float suffix.  */
30336ac495dSmrg unsigned int
cpp_interpret_float_suffix(cpp_reader * pfile,const char * s,size_t len)30436ac495dSmrg cpp_interpret_float_suffix (cpp_reader *pfile, const char *s, size_t len)
30536ac495dSmrg {
30636ac495dSmrg   return interpret_float_suffix (pfile, (const unsigned char *)s, len);
30736ac495dSmrg }
30836ac495dSmrg 
30936ac495dSmrg /* Subroutine of cpp_classify_number.  S points to an integer suffix
31036ac495dSmrg    of length LEN, possibly zero. Returns 0 for an invalid suffix, or a
31136ac495dSmrg    flag vector describing the suffix.  */
31236ac495dSmrg static unsigned int
interpret_int_suffix(cpp_reader * pfile,const uchar * s,size_t len)31336ac495dSmrg interpret_int_suffix (cpp_reader *pfile, const uchar *s, size_t len)
31436ac495dSmrg {
315a2dc1f3fSmrg   size_t orig_len = len;
31636ac495dSmrg   size_t u, l, i;
31736ac495dSmrg 
31836ac495dSmrg   u = l = i = 0;
31936ac495dSmrg 
32036ac495dSmrg   while (len--)
32136ac495dSmrg     switch (s[len])
32236ac495dSmrg       {
32336ac495dSmrg       case 'u': case 'U':	u++; break;
32436ac495dSmrg       case 'i': case 'I':
32536ac495dSmrg       case 'j': case 'J':	i++; break;
32636ac495dSmrg       case 'l': case 'L':	l++;
32736ac495dSmrg 	/* If there are two Ls, they must be adjacent and the same case.  */
32836ac495dSmrg 	if (l == 2 && s[len] != s[len + 1])
32936ac495dSmrg 	  return 0;
33036ac495dSmrg 	break;
33136ac495dSmrg       default:
33236ac495dSmrg 	return 0;
33336ac495dSmrg       }
33436ac495dSmrg 
33536ac495dSmrg   if (l > 2 || u > 1 || i > 1)
33636ac495dSmrg     return 0;
33736ac495dSmrg 
338a2dc1f3fSmrg   if (i)
339a2dc1f3fSmrg     {
340a2dc1f3fSmrg       if (!CPP_OPTION (pfile, ext_numeric_literals))
34136ac495dSmrg 	return 0;
34236ac495dSmrg 
343a2dc1f3fSmrg       /* In C++14 and up these suffixes are in the standard library, so treat
344a2dc1f3fSmrg 	 them as user-defined literals.  */
345a2dc1f3fSmrg       if (CPP_OPTION (pfile, cplusplus)
346a2dc1f3fSmrg 	  && CPP_OPTION (pfile, lang) > CLK_CXX11
347a2dc1f3fSmrg 	  && s[0] == 'i'
348a2dc1f3fSmrg 	  && (orig_len == 1 || (orig_len == 2 && s[1] == 'l')))
349a2dc1f3fSmrg 	return 0;
350a2dc1f3fSmrg     }
351a2dc1f3fSmrg 
35236ac495dSmrg   return ((i ? CPP_N_IMAGINARY : 0)
35336ac495dSmrg 	  | (u ? CPP_N_UNSIGNED : 0)
35436ac495dSmrg 	  | ((l == 0) ? CPP_N_SMALL
35536ac495dSmrg 	     : (l == 1) ? CPP_N_MEDIUM : CPP_N_LARGE));
35636ac495dSmrg }
35736ac495dSmrg 
35836ac495dSmrg /* Return the classification flags for an int suffix.  */
35936ac495dSmrg unsigned int
cpp_interpret_int_suffix(cpp_reader * pfile,const char * s,size_t len)36036ac495dSmrg cpp_interpret_int_suffix (cpp_reader *pfile, const char *s, size_t len)
36136ac495dSmrg {
36236ac495dSmrg   return interpret_int_suffix (pfile, (const unsigned char *)s, len);
36336ac495dSmrg }
36436ac495dSmrg 
36536ac495dSmrg /* Return the string type corresponding to the the input user-defined string
36636ac495dSmrg    literal type.  If the input type is not a user-defined string literal
36736ac495dSmrg    type return the input type.  */
36836ac495dSmrg enum cpp_ttype
cpp_userdef_string_remove_type(enum cpp_ttype type)36936ac495dSmrg cpp_userdef_string_remove_type (enum cpp_ttype type)
37036ac495dSmrg {
37136ac495dSmrg   if (type == CPP_STRING_USERDEF)
37236ac495dSmrg     return CPP_STRING;
37336ac495dSmrg   else if (type == CPP_WSTRING_USERDEF)
37436ac495dSmrg     return CPP_WSTRING;
37536ac495dSmrg   else if (type == CPP_STRING16_USERDEF)
37636ac495dSmrg     return CPP_STRING16;
37736ac495dSmrg   else if (type == CPP_STRING32_USERDEF)
37836ac495dSmrg     return CPP_STRING32;
37936ac495dSmrg   else if (type == CPP_UTF8STRING_USERDEF)
38036ac495dSmrg     return CPP_UTF8STRING;
38136ac495dSmrg   else
38236ac495dSmrg     return type;
38336ac495dSmrg }
38436ac495dSmrg 
38536ac495dSmrg /* Return the user-defined string literal type corresponding to the input
38636ac495dSmrg    string type.  If the input type is not a string type return the input
38736ac495dSmrg    type.  */
38836ac495dSmrg enum cpp_ttype
cpp_userdef_string_add_type(enum cpp_ttype type)38936ac495dSmrg cpp_userdef_string_add_type (enum cpp_ttype type)
39036ac495dSmrg {
39136ac495dSmrg   if (type == CPP_STRING)
39236ac495dSmrg     return CPP_STRING_USERDEF;
39336ac495dSmrg   else if (type == CPP_WSTRING)
39436ac495dSmrg     return CPP_WSTRING_USERDEF;
39536ac495dSmrg   else if (type == CPP_STRING16)
39636ac495dSmrg     return CPP_STRING16_USERDEF;
39736ac495dSmrg   else if (type == CPP_STRING32)
39836ac495dSmrg     return CPP_STRING32_USERDEF;
39936ac495dSmrg   else if (type == CPP_UTF8STRING)
40036ac495dSmrg     return CPP_UTF8STRING_USERDEF;
40136ac495dSmrg   else
40236ac495dSmrg     return type;
40336ac495dSmrg }
40436ac495dSmrg 
40536ac495dSmrg /* Return the char type corresponding to the the input user-defined char
40636ac495dSmrg    literal type.  If the input type is not a user-defined char literal
40736ac495dSmrg    type return the input type.  */
40836ac495dSmrg enum cpp_ttype
cpp_userdef_char_remove_type(enum cpp_ttype type)40936ac495dSmrg cpp_userdef_char_remove_type (enum cpp_ttype type)
41036ac495dSmrg {
41136ac495dSmrg   if (type == CPP_CHAR_USERDEF)
41236ac495dSmrg     return CPP_CHAR;
41336ac495dSmrg   else if (type == CPP_WCHAR_USERDEF)
41436ac495dSmrg     return CPP_WCHAR;
41536ac495dSmrg   else if (type == CPP_CHAR16_USERDEF)
41636ac495dSmrg     return CPP_CHAR16;
41736ac495dSmrg   else if (type == CPP_CHAR32_USERDEF)
41836ac495dSmrg     return CPP_CHAR32;
41936ac495dSmrg   else if (type == CPP_UTF8CHAR_USERDEF)
42036ac495dSmrg     return CPP_UTF8CHAR;
42136ac495dSmrg   else
42236ac495dSmrg     return type;
42336ac495dSmrg }
42436ac495dSmrg 
42536ac495dSmrg /* Return the user-defined char literal type corresponding to the input
42636ac495dSmrg    char type.  If the input type is not a char type return the input
42736ac495dSmrg    type.  */
42836ac495dSmrg enum cpp_ttype
cpp_userdef_char_add_type(enum cpp_ttype type)42936ac495dSmrg cpp_userdef_char_add_type (enum cpp_ttype type)
43036ac495dSmrg {
43136ac495dSmrg   if (type == CPP_CHAR)
43236ac495dSmrg     return CPP_CHAR_USERDEF;
43336ac495dSmrg   else if (type == CPP_WCHAR)
43436ac495dSmrg     return CPP_WCHAR_USERDEF;
43536ac495dSmrg   else if (type == CPP_CHAR16)
43636ac495dSmrg     return CPP_CHAR16_USERDEF;
43736ac495dSmrg   else if (type == CPP_CHAR32)
43836ac495dSmrg     return CPP_CHAR32_USERDEF;
43936ac495dSmrg   else if (type == CPP_UTF8CHAR)
44036ac495dSmrg     return CPP_UTF8CHAR_USERDEF;
44136ac495dSmrg   else
44236ac495dSmrg     return type;
44336ac495dSmrg }
44436ac495dSmrg 
44536ac495dSmrg /* Return true if the token type is a user-defined string literal.  */
44636ac495dSmrg bool
cpp_userdef_string_p(enum cpp_ttype type)44736ac495dSmrg cpp_userdef_string_p (enum cpp_ttype type)
44836ac495dSmrg {
44936ac495dSmrg   if (type == CPP_STRING_USERDEF
45036ac495dSmrg    || type == CPP_WSTRING_USERDEF
45136ac495dSmrg    || type == CPP_STRING16_USERDEF
45236ac495dSmrg    || type == CPP_STRING32_USERDEF
45336ac495dSmrg    || type == CPP_UTF8STRING_USERDEF)
45436ac495dSmrg     return true;
45536ac495dSmrg   else
45636ac495dSmrg     return false;
45736ac495dSmrg }
45836ac495dSmrg 
45936ac495dSmrg /* Return true if the token type is a user-defined char literal.  */
46036ac495dSmrg bool
cpp_userdef_char_p(enum cpp_ttype type)46136ac495dSmrg cpp_userdef_char_p (enum cpp_ttype type)
46236ac495dSmrg {
46336ac495dSmrg   if (type == CPP_CHAR_USERDEF
46436ac495dSmrg    || type == CPP_WCHAR_USERDEF
46536ac495dSmrg    || type == CPP_CHAR16_USERDEF
46636ac495dSmrg    || type == CPP_CHAR32_USERDEF
46736ac495dSmrg    || type == CPP_UTF8CHAR_USERDEF)
46836ac495dSmrg     return true;
46936ac495dSmrg   else
47036ac495dSmrg     return false;
47136ac495dSmrg }
47236ac495dSmrg 
47336ac495dSmrg /* Extract the suffix from a user-defined literal string or char.  */
47436ac495dSmrg const char *
cpp_get_userdef_suffix(const cpp_token * tok)47536ac495dSmrg cpp_get_userdef_suffix (const cpp_token *tok)
47636ac495dSmrg {
47736ac495dSmrg   unsigned int len = tok->val.str.len;
47836ac495dSmrg   const char *text = (const char *)tok->val.str.text;
47936ac495dSmrg   char delim;
48036ac495dSmrg   unsigned int i;
48136ac495dSmrg   for (i = 0; i < len; ++i)
48236ac495dSmrg     if (text[i] == '\'' || text[i] == '"')
48336ac495dSmrg       break;
48436ac495dSmrg   if (i == len)
48536ac495dSmrg     return text + len;
48636ac495dSmrg   delim = text[i];
48736ac495dSmrg   for (i = len; i > 0; --i)
48836ac495dSmrg     if (text[i - 1] == delim)
48936ac495dSmrg       break;
49036ac495dSmrg   return text + i;
49136ac495dSmrg }
49236ac495dSmrg 
49336ac495dSmrg /* Categorize numeric constants according to their field (integer,
49436ac495dSmrg    floating point, or invalid), radix (decimal, octal, hexadecimal),
49536ac495dSmrg    and type suffixes.
49636ac495dSmrg 
49736ac495dSmrg    TOKEN is the token that represents the numeric constant to
49836ac495dSmrg    classify.
49936ac495dSmrg 
50036ac495dSmrg    In C++0X if UD_SUFFIX is non null it will be assigned
50136ac495dSmrg    any unrecognized suffix for a user-defined literal.
50236ac495dSmrg 
50336ac495dSmrg    VIRTUAL_LOCATION is the virtual location for TOKEN.  */
50436ac495dSmrg unsigned int
cpp_classify_number(cpp_reader * pfile,const cpp_token * token,const char ** ud_suffix,location_t virtual_location)50536ac495dSmrg cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
506c0a68be4Smrg 		     const char **ud_suffix, location_t virtual_location)
50736ac495dSmrg {
50836ac495dSmrg   const uchar *str = token->val.str.text;
50936ac495dSmrg   const uchar *limit;
51036ac495dSmrg   unsigned int max_digit, result, radix;
51136ac495dSmrg   enum {NOT_FLOAT = 0, AFTER_POINT, AFTER_EXPON} float_flag;
51236ac495dSmrg   bool seen_digit;
51336ac495dSmrg   bool seen_digit_sep;
51436ac495dSmrg 
51536ac495dSmrg   if (ud_suffix)
51636ac495dSmrg     *ud_suffix = NULL;
51736ac495dSmrg 
51836ac495dSmrg   /* If the lexer has done its job, length one can only be a single
51936ac495dSmrg      digit.  Fast-path this very common case.  */
52036ac495dSmrg   if (token->val.str.len == 1)
52136ac495dSmrg     return CPP_N_INTEGER | CPP_N_SMALL | CPP_N_DECIMAL;
52236ac495dSmrg 
52336ac495dSmrg   limit = str + token->val.str.len;
52436ac495dSmrg   float_flag = NOT_FLOAT;
52536ac495dSmrg   max_digit = 0;
52636ac495dSmrg   radix = 10;
52736ac495dSmrg   seen_digit = false;
52836ac495dSmrg   seen_digit_sep = false;
52936ac495dSmrg 
53036ac495dSmrg   /* First, interpret the radix.  */
53136ac495dSmrg   if (*str == '0')
53236ac495dSmrg     {
53336ac495dSmrg       radix = 8;
53436ac495dSmrg       str++;
53536ac495dSmrg 
53636ac495dSmrg       /* Require at least one hex digit to classify it as hex.  */
53736ac495dSmrg       if (*str == 'x' || *str == 'X')
53836ac495dSmrg 	{
53936ac495dSmrg 	  if (str[1] == '.' || ISXDIGIT (str[1]))
54036ac495dSmrg 	    {
54136ac495dSmrg 	      radix = 16;
54236ac495dSmrg 	      str++;
54336ac495dSmrg 	    }
54436ac495dSmrg 	  else if (DIGIT_SEP (str[1]))
54536ac495dSmrg 	    SYNTAX_ERROR_AT (virtual_location,
54636ac495dSmrg 			     "digit separator after base indicator");
54736ac495dSmrg 	}
54836ac495dSmrg       else if (*str == 'b' || *str == 'B')
54936ac495dSmrg 	{
55036ac495dSmrg 	  if (str[1] == '0' || str[1] == '1')
55136ac495dSmrg 	    {
55236ac495dSmrg 	      radix = 2;
55336ac495dSmrg 	      str++;
55436ac495dSmrg 	    }
55536ac495dSmrg 	  else if (DIGIT_SEP (str[1]))
55636ac495dSmrg 	    SYNTAX_ERROR_AT (virtual_location,
55736ac495dSmrg 			     "digit separator after base indicator");
55836ac495dSmrg 	}
55936ac495dSmrg     }
56036ac495dSmrg 
56136ac495dSmrg   /* Now scan for a well-formed integer or float.  */
56236ac495dSmrg   for (;;)
56336ac495dSmrg     {
56436ac495dSmrg       unsigned int c = *str++;
56536ac495dSmrg 
56636ac495dSmrg       if (ISDIGIT (c) || (ISXDIGIT (c) && radix == 16))
56736ac495dSmrg 	{
56836ac495dSmrg 	  seen_digit_sep = false;
56936ac495dSmrg 	  seen_digit = true;
57036ac495dSmrg 	  c = hex_value (c);
57136ac495dSmrg 	  if (c > max_digit)
57236ac495dSmrg 	    max_digit = c;
57336ac495dSmrg 	}
57436ac495dSmrg       else if (DIGIT_SEP (c))
57536ac495dSmrg 	{
57636ac495dSmrg 	  if (seen_digit_sep)
57736ac495dSmrg 	    SYNTAX_ERROR_AT (virtual_location, "adjacent digit separators");
57836ac495dSmrg 	  seen_digit_sep = true;
57936ac495dSmrg 	}
58036ac495dSmrg       else if (c == '.')
58136ac495dSmrg 	{
58236ac495dSmrg 	  if (seen_digit_sep || DIGIT_SEP (*str))
58336ac495dSmrg 	    SYNTAX_ERROR_AT (virtual_location,
58436ac495dSmrg 			     "digit separator adjacent to decimal point");
58536ac495dSmrg 	  seen_digit_sep = false;
58636ac495dSmrg 	  if (float_flag == NOT_FLOAT)
58736ac495dSmrg 	    float_flag = AFTER_POINT;
58836ac495dSmrg 	  else
58936ac495dSmrg 	    SYNTAX_ERROR_AT (virtual_location,
59036ac495dSmrg 			     "too many decimal points in number");
59136ac495dSmrg 	}
59236ac495dSmrg       else if ((radix <= 10 && (c == 'e' || c == 'E'))
59336ac495dSmrg 	       || (radix == 16 && (c == 'p' || c == 'P')))
59436ac495dSmrg 	{
59536ac495dSmrg 	  if (seen_digit_sep || DIGIT_SEP (*str))
59636ac495dSmrg 	    SYNTAX_ERROR_AT (virtual_location,
59736ac495dSmrg 			     "digit separator adjacent to exponent");
59836ac495dSmrg 	  float_flag = AFTER_EXPON;
59936ac495dSmrg 	  break;
60036ac495dSmrg 	}
60136ac495dSmrg       else
60236ac495dSmrg 	{
60336ac495dSmrg 	  /* Start of suffix.  */
60436ac495dSmrg 	  str--;
60536ac495dSmrg 	  break;
60636ac495dSmrg 	}
60736ac495dSmrg     }
60836ac495dSmrg 
60936ac495dSmrg   if (seen_digit_sep && float_flag != AFTER_EXPON)
61036ac495dSmrg     SYNTAX_ERROR_AT (virtual_location,
61136ac495dSmrg 		     "digit separator outside digit sequence");
61236ac495dSmrg 
61336ac495dSmrg   /* The suffix may be for decimal fixed-point constants without exponent.  */
61436ac495dSmrg   if (radix != 16 && float_flag == NOT_FLOAT)
61536ac495dSmrg     {
61636ac495dSmrg       result = interpret_float_suffix (pfile, str, limit - str);
61736ac495dSmrg       if ((result & CPP_N_FRACT) || (result & CPP_N_ACCUM))
61836ac495dSmrg 	{
61936ac495dSmrg 	  result |= CPP_N_FLOATING;
62036ac495dSmrg 	  /* We need to restore the radix to 10, if the radix is 8.  */
62136ac495dSmrg 	  if (radix == 8)
62236ac495dSmrg 	    radix = 10;
62336ac495dSmrg 
62436ac495dSmrg 	  if (CPP_PEDANTIC (pfile))
62536ac495dSmrg 	    cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
62636ac495dSmrg 				 "fixed-point constants are a GCC extension");
62736ac495dSmrg 	  goto syntax_ok;
62836ac495dSmrg 	}
62936ac495dSmrg       else
63036ac495dSmrg 	result = 0;
63136ac495dSmrg     }
63236ac495dSmrg 
63336ac495dSmrg   if (float_flag != NOT_FLOAT && radix == 8)
63436ac495dSmrg     radix = 10;
63536ac495dSmrg 
63636ac495dSmrg   if (max_digit >= radix)
63736ac495dSmrg     {
63836ac495dSmrg       if (radix == 2)
63936ac495dSmrg 	SYNTAX_ERROR2_AT (virtual_location,
64036ac495dSmrg 			  "invalid digit \"%c\" in binary constant", '0' + max_digit);
64136ac495dSmrg       else
64236ac495dSmrg 	SYNTAX_ERROR2_AT (virtual_location,
64336ac495dSmrg 			  "invalid digit \"%c\" in octal constant", '0' + max_digit);
64436ac495dSmrg     }
64536ac495dSmrg 
64636ac495dSmrg   if (float_flag != NOT_FLOAT)
64736ac495dSmrg     {
64836ac495dSmrg       if (radix == 2)
64936ac495dSmrg 	{
65036ac495dSmrg 	  cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0,
65136ac495dSmrg 			       "invalid prefix \"0b\" for floating constant");
65236ac495dSmrg 	  return CPP_N_INVALID;
65336ac495dSmrg 	}
65436ac495dSmrg 
65536ac495dSmrg       if (radix == 16 && !seen_digit)
65636ac495dSmrg 	SYNTAX_ERROR_AT (virtual_location,
65736ac495dSmrg 			 "no digits in hexadecimal floating constant");
65836ac495dSmrg 
65936ac495dSmrg       if (radix == 16 && CPP_PEDANTIC (pfile)
66036ac495dSmrg 	  && !CPP_OPTION (pfile, extended_numbers))
66136ac495dSmrg 	{
66236ac495dSmrg 	  if (CPP_OPTION (pfile, cplusplus))
66336ac495dSmrg 	    cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
664a2dc1f3fSmrg 				 "use of C++17 hexadecimal floating constant");
66536ac495dSmrg 	  else
66636ac495dSmrg 	    cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
66736ac495dSmrg 				 "use of C99 hexadecimal floating constant");
66836ac495dSmrg 	}
66936ac495dSmrg 
67036ac495dSmrg       if (float_flag == AFTER_EXPON)
67136ac495dSmrg 	{
67236ac495dSmrg 	  if (*str == '+' || *str == '-')
67336ac495dSmrg 	    str++;
67436ac495dSmrg 
67536ac495dSmrg 	  /* Exponent is decimal, even if string is a hex float.  */
67636ac495dSmrg 	  if (!ISDIGIT (*str))
67736ac495dSmrg 	    {
67836ac495dSmrg 	      if (DIGIT_SEP (*str))
67936ac495dSmrg 		SYNTAX_ERROR_AT (virtual_location,
68036ac495dSmrg 				 "digit separator adjacent to exponent");
68136ac495dSmrg 	      else
68236ac495dSmrg 		SYNTAX_ERROR_AT (virtual_location, "exponent has no digits");
68336ac495dSmrg 	    }
68436ac495dSmrg 	  do
68536ac495dSmrg 	    {
68636ac495dSmrg 	      seen_digit_sep = DIGIT_SEP (*str);
68736ac495dSmrg 	      str++;
68836ac495dSmrg 	    }
68936ac495dSmrg 	  while (ISDIGIT (*str) || DIGIT_SEP (*str));
69036ac495dSmrg 	}
69136ac495dSmrg       else if (radix == 16)
69236ac495dSmrg 	SYNTAX_ERROR_AT (virtual_location,
69336ac495dSmrg 			 "hexadecimal floating constants require an exponent");
69436ac495dSmrg 
69536ac495dSmrg       if (seen_digit_sep)
69636ac495dSmrg 	SYNTAX_ERROR_AT (virtual_location,
69736ac495dSmrg 			 "digit separator outside digit sequence");
69836ac495dSmrg 
69936ac495dSmrg       result = interpret_float_suffix (pfile, str, limit - str);
70036ac495dSmrg       if (result == 0)
70136ac495dSmrg 	{
70236ac495dSmrg 	  if (CPP_OPTION (pfile, user_literals))
70336ac495dSmrg 	    {
70436ac495dSmrg 	      if (ud_suffix)
70536ac495dSmrg 		*ud_suffix = (const char *) str;
70636ac495dSmrg 	      result = CPP_N_LARGE | CPP_N_USERDEF;
70736ac495dSmrg 	    }
70836ac495dSmrg 	  else
70936ac495dSmrg 	    {
71036ac495dSmrg 	      cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0,
71136ac495dSmrg 				   "invalid suffix \"%.*s\" on floating constant",
71236ac495dSmrg 				   (int) (limit - str), str);
71336ac495dSmrg 	      return CPP_N_INVALID;
71436ac495dSmrg 	    }
71536ac495dSmrg 	}
71636ac495dSmrg 
71736ac495dSmrg       /* Traditional C didn't accept any floating suffixes.  */
71836ac495dSmrg       if (limit != str
71936ac495dSmrg 	  && CPP_WTRADITIONAL (pfile)
72036ac495dSmrg 	  && ! cpp_sys_macro_p (pfile))
72136ac495dSmrg 	cpp_warning_with_line (pfile, CPP_W_TRADITIONAL, virtual_location, 0,
72236ac495dSmrg 			       "traditional C rejects the \"%.*s\" suffix",
72336ac495dSmrg 			       (int) (limit - str), str);
72436ac495dSmrg 
72536ac495dSmrg       /* A suffix for double is a GCC extension via decimal float support.
72636ac495dSmrg 	 If the suffix also specifies an imaginary value we'll catch that
72736ac495dSmrg 	 later.  */
72836ac495dSmrg       if ((result == CPP_N_MEDIUM) && CPP_PEDANTIC (pfile))
72936ac495dSmrg 	cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
73036ac495dSmrg 			     "suffix for double constant is a GCC extension");
73136ac495dSmrg 
73236ac495dSmrg       /* Radix must be 10 for decimal floats.  */
73336ac495dSmrg       if ((result & CPP_N_DFLOAT) && radix != 10)
73436ac495dSmrg         {
73536ac495dSmrg           cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0,
73636ac495dSmrg 			       "invalid suffix \"%.*s\" with hexadecimal floating constant",
73736ac495dSmrg 			       (int) (limit - str), str);
73836ac495dSmrg           return CPP_N_INVALID;
73936ac495dSmrg         }
74036ac495dSmrg 
74136ac495dSmrg       if ((result & (CPP_N_FRACT | CPP_N_ACCUM)) && CPP_PEDANTIC (pfile))
74236ac495dSmrg 	cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
74336ac495dSmrg 			     "fixed-point constants are a GCC extension");
74436ac495dSmrg 
745*8feb0f0bSmrg       if (result & CPP_N_DFLOAT)
746*8feb0f0bSmrg 	{
747*8feb0f0bSmrg 	  if (CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, dfp_constants))
74836ac495dSmrg 	    cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
749*8feb0f0bSmrg 				 "decimal float constants are a C2X feature");
750*8feb0f0bSmrg 	  else if (CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) > 0)
751*8feb0f0bSmrg 	    cpp_warning_with_line (pfile, CPP_W_C11_C2X_COMPAT,
752*8feb0f0bSmrg 				   virtual_location, 0,
753*8feb0f0bSmrg 				   "decimal float constants are a C2X feature");
754*8feb0f0bSmrg 	}
75536ac495dSmrg 
75636ac495dSmrg       result |= CPP_N_FLOATING;
75736ac495dSmrg     }
75836ac495dSmrg   else
75936ac495dSmrg     {
76036ac495dSmrg       result = interpret_int_suffix (pfile, str, limit - str);
76136ac495dSmrg       if (result == 0)
76236ac495dSmrg 	{
76336ac495dSmrg 	  if (CPP_OPTION (pfile, user_literals))
76436ac495dSmrg 	    {
76536ac495dSmrg 	      if (ud_suffix)
76636ac495dSmrg 		*ud_suffix = (const char *) str;
76736ac495dSmrg 	      result = CPP_N_UNSIGNED | CPP_N_LARGE | CPP_N_USERDEF;
76836ac495dSmrg 	    }
76936ac495dSmrg 	  else
77036ac495dSmrg 	    {
77136ac495dSmrg 	      cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0,
77236ac495dSmrg 				   "invalid suffix \"%.*s\" on integer constant",
77336ac495dSmrg 				   (int) (limit - str), str);
77436ac495dSmrg 	      return CPP_N_INVALID;
77536ac495dSmrg 	    }
77636ac495dSmrg 	}
77736ac495dSmrg 
77836ac495dSmrg       /* Traditional C only accepted the 'L' suffix.
77936ac495dSmrg          Suppress warning about 'LL' with -Wno-long-long.  */
78036ac495dSmrg       if (CPP_WTRADITIONAL (pfile) && ! cpp_sys_macro_p (pfile))
78136ac495dSmrg 	{
78236ac495dSmrg 	  int u_or_i = (result & (CPP_N_UNSIGNED|CPP_N_IMAGINARY));
78336ac495dSmrg 	  int large = (result & CPP_N_WIDTH) == CPP_N_LARGE
78436ac495dSmrg 		       && CPP_OPTION (pfile, cpp_warn_long_long);
78536ac495dSmrg 
78636ac495dSmrg 	  if (u_or_i || large)
78736ac495dSmrg 	    cpp_warning_with_line (pfile, large ? CPP_W_LONG_LONG : CPP_W_TRADITIONAL,
78836ac495dSmrg 				   virtual_location, 0,
78936ac495dSmrg 				   "traditional C rejects the \"%.*s\" suffix",
79036ac495dSmrg 				   (int) (limit - str), str);
79136ac495dSmrg 	}
79236ac495dSmrg 
79336ac495dSmrg       if ((result & CPP_N_WIDTH) == CPP_N_LARGE
79436ac495dSmrg 	  && CPP_OPTION (pfile, cpp_warn_long_long))
79536ac495dSmrg         {
79636ac495dSmrg           const char *message = CPP_OPTION (pfile, cplusplus)
79736ac495dSmrg 				? N_("use of C++11 long long integer constant")
79836ac495dSmrg 		                : N_("use of C99 long long integer constant");
79936ac495dSmrg 
80036ac495dSmrg 	  if (CPP_OPTION (pfile, c99))
80136ac495dSmrg             cpp_warning_with_line (pfile, CPP_W_LONG_LONG, virtual_location,
80236ac495dSmrg 				   0, message);
80336ac495dSmrg           else
80436ac495dSmrg             cpp_pedwarning_with_line (pfile, CPP_W_LONG_LONG,
80536ac495dSmrg 				      virtual_location, 0, message);
80636ac495dSmrg         }
80736ac495dSmrg 
80836ac495dSmrg       result |= CPP_N_INTEGER;
80936ac495dSmrg     }
81036ac495dSmrg 
81136ac495dSmrg  syntax_ok:
81236ac495dSmrg   if ((result & CPP_N_IMAGINARY) && CPP_PEDANTIC (pfile))
81336ac495dSmrg     cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
81436ac495dSmrg 			 "imaginary constants are a GCC extension");
81536ac495dSmrg   if (radix == 2
81636ac495dSmrg       && !CPP_OPTION (pfile, binary_constants)
81736ac495dSmrg       && CPP_PEDANTIC (pfile))
81836ac495dSmrg     cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
81936ac495dSmrg 			 CPP_OPTION (pfile, cplusplus)
82036ac495dSmrg 			 ? N_("binary constants are a C++14 feature "
82136ac495dSmrg 			      "or GCC extension")
82236ac495dSmrg 			 : N_("binary constants are a GCC extension"));
82336ac495dSmrg 
82436ac495dSmrg   if (radix == 10)
82536ac495dSmrg     result |= CPP_N_DECIMAL;
82636ac495dSmrg   else if (radix == 16)
82736ac495dSmrg     result |= CPP_N_HEX;
82836ac495dSmrg   else if (radix == 2)
82936ac495dSmrg     result |= CPP_N_BINARY;
83036ac495dSmrg   else
83136ac495dSmrg     result |= CPP_N_OCTAL;
83236ac495dSmrg 
83336ac495dSmrg   return result;
83436ac495dSmrg 
83536ac495dSmrg  syntax_error:
83636ac495dSmrg   return CPP_N_INVALID;
83736ac495dSmrg }
83836ac495dSmrg 
83936ac495dSmrg /* cpp_interpret_integer converts an integer constant into a cpp_num,
84036ac495dSmrg    of precision options->precision.
84136ac495dSmrg 
84236ac495dSmrg    We do not provide any interface for decimal->float conversion,
84336ac495dSmrg    because the preprocessor doesn't need it and we don't want to
84436ac495dSmrg    drag in GCC's floating point emulator.  */
84536ac495dSmrg cpp_num
cpp_interpret_integer(cpp_reader * pfile,const cpp_token * token,unsigned int type)84636ac495dSmrg cpp_interpret_integer (cpp_reader *pfile, const cpp_token *token,
84736ac495dSmrg 		       unsigned int type)
84836ac495dSmrg {
84936ac495dSmrg   const uchar *p, *end;
85036ac495dSmrg   cpp_num result;
85136ac495dSmrg 
85236ac495dSmrg   result.low = 0;
85336ac495dSmrg   result.high = 0;
85436ac495dSmrg   result.unsignedp = !!(type & CPP_N_UNSIGNED);
85536ac495dSmrg   result.overflow = false;
85636ac495dSmrg 
85736ac495dSmrg   p = token->val.str.text;
85836ac495dSmrg   end = p + token->val.str.len;
85936ac495dSmrg 
86036ac495dSmrg   /* Common case of a single digit.  */
86136ac495dSmrg   if (token->val.str.len == 1)
86236ac495dSmrg     result.low = p[0] - '0';
86336ac495dSmrg   else
86436ac495dSmrg     {
86536ac495dSmrg       cpp_num_part max;
86636ac495dSmrg       size_t precision = CPP_OPTION (pfile, precision);
86736ac495dSmrg       unsigned int base = 10, c = 0;
86836ac495dSmrg       bool overflow = false;
86936ac495dSmrg 
87036ac495dSmrg       if ((type & CPP_N_RADIX) == CPP_N_OCTAL)
87136ac495dSmrg 	{
87236ac495dSmrg 	  base = 8;
87336ac495dSmrg 	  p++;
87436ac495dSmrg 	}
87536ac495dSmrg       else if ((type & CPP_N_RADIX) == CPP_N_HEX)
87636ac495dSmrg 	{
87736ac495dSmrg 	  base = 16;
87836ac495dSmrg 	  p += 2;
87936ac495dSmrg 	}
88036ac495dSmrg       else if ((type & CPP_N_RADIX) == CPP_N_BINARY)
88136ac495dSmrg 	{
88236ac495dSmrg 	  base = 2;
88336ac495dSmrg 	  p += 2;
88436ac495dSmrg 	}
88536ac495dSmrg 
88636ac495dSmrg       /* We can add a digit to numbers strictly less than this without
88736ac495dSmrg 	 needing the precision and slowness of double integers.  */
88836ac495dSmrg       max = ~(cpp_num_part) 0;
88936ac495dSmrg       if (precision < PART_PRECISION)
89036ac495dSmrg 	max >>= PART_PRECISION - precision;
89136ac495dSmrg       max = (max - base + 1) / base + 1;
89236ac495dSmrg 
89336ac495dSmrg       for (; p < end; p++)
89436ac495dSmrg 	{
89536ac495dSmrg 	  c = *p;
89636ac495dSmrg 
89736ac495dSmrg 	  if (ISDIGIT (c) || (base == 16 && ISXDIGIT (c)))
89836ac495dSmrg 	    c = hex_value (c);
89936ac495dSmrg 	  else if (DIGIT_SEP (c))
90036ac495dSmrg 	    continue;
90136ac495dSmrg 	  else
90236ac495dSmrg 	    break;
90336ac495dSmrg 
90436ac495dSmrg 	  /* Strict inequality for when max is set to zero.  */
90536ac495dSmrg 	  if (result.low < max)
90636ac495dSmrg 	    result.low = result.low * base + c;
90736ac495dSmrg 	  else
90836ac495dSmrg 	    {
90936ac495dSmrg 	      result = append_digit (result, c, base, precision);
91036ac495dSmrg 	      overflow |= result.overflow;
91136ac495dSmrg 	      max = 0;
91236ac495dSmrg 	    }
91336ac495dSmrg 	}
91436ac495dSmrg 
91536ac495dSmrg       if (overflow && !(type & CPP_N_USERDEF))
91636ac495dSmrg 	cpp_error (pfile, CPP_DL_PEDWARN,
91736ac495dSmrg 		   "integer constant is too large for its type");
91836ac495dSmrg       /* If too big to be signed, consider it unsigned.  Only warn for
91936ac495dSmrg 	 decimal numbers.  Traditional numbers were always signed (but
92036ac495dSmrg 	 we still honor an explicit U suffix); but we only have
92136ac495dSmrg 	 traditional semantics in directives.  */
92236ac495dSmrg       else if (!result.unsignedp
92336ac495dSmrg 	       && !(CPP_OPTION (pfile, traditional)
92436ac495dSmrg 		    && pfile->state.in_directive)
92536ac495dSmrg 	       && !num_positive (result, precision))
92636ac495dSmrg 	{
92736ac495dSmrg 	  /* This is for constants within the range of uintmax_t but
92836ac495dSmrg 	     not that of intmax_t.  For such decimal constants, a
92936ac495dSmrg 	     diagnostic is required for C99 as the selected type must
93036ac495dSmrg 	     be signed and not having a type is a constraint violation
93136ac495dSmrg 	     (DR#298, TC3), so this must be a pedwarn.  For C90,
93236ac495dSmrg 	     unsigned long is specified to be used for a constant that
93336ac495dSmrg 	     does not fit in signed long; if uintmax_t has the same
93436ac495dSmrg 	     range as unsigned long this means only a warning is
93536ac495dSmrg 	     appropriate here.  C90 permits the preprocessor to use a
93636ac495dSmrg 	     wider range than unsigned long in the compiler, so if
93736ac495dSmrg 	     uintmax_t is wider than unsigned long no diagnostic is
93836ac495dSmrg 	     required for such constants in preprocessor #if
93936ac495dSmrg 	     expressions and the compiler will pedwarn for such
94036ac495dSmrg 	     constants outside the range of unsigned long that reach
94136ac495dSmrg 	     the compiler so a diagnostic is not required there
94236ac495dSmrg 	     either; thus, pedwarn for C99 but use a plain warning for
94336ac495dSmrg 	     C90.  */
94436ac495dSmrg 	  if (base == 10)
94536ac495dSmrg 	    cpp_error (pfile, (CPP_OPTION (pfile, c99)
94636ac495dSmrg 			       ? CPP_DL_PEDWARN
94736ac495dSmrg 			       : CPP_DL_WARNING),
94836ac495dSmrg 		       "integer constant is so large that it is unsigned");
94936ac495dSmrg 	  result.unsignedp = true;
95036ac495dSmrg 	}
95136ac495dSmrg     }
95236ac495dSmrg 
95336ac495dSmrg   return result;
95436ac495dSmrg }
95536ac495dSmrg 
95636ac495dSmrg /* Append DIGIT to NUM, a number of PRECISION bits being read in base BASE.  */
95736ac495dSmrg static cpp_num
append_digit(cpp_num num,int digit,int base,size_t precision)95836ac495dSmrg append_digit (cpp_num num, int digit, int base, size_t precision)
95936ac495dSmrg {
96036ac495dSmrg   cpp_num result;
96136ac495dSmrg   unsigned int shift;
96236ac495dSmrg   bool overflow;
96336ac495dSmrg   cpp_num_part add_high, add_low;
96436ac495dSmrg 
96536ac495dSmrg   /* Multiply by 2, 8 or 16.  Catching this overflow here means we don't
96636ac495dSmrg      need to worry about add_high overflowing.  */
96736ac495dSmrg   switch (base)
96836ac495dSmrg     {
96936ac495dSmrg     case 2:
97036ac495dSmrg       shift = 1;
97136ac495dSmrg       break;
97236ac495dSmrg 
97336ac495dSmrg     case 16:
97436ac495dSmrg       shift = 4;
97536ac495dSmrg       break;
97636ac495dSmrg 
97736ac495dSmrg     default:
97836ac495dSmrg       shift = 3;
97936ac495dSmrg     }
98036ac495dSmrg   overflow = !!(num.high >> (PART_PRECISION - shift));
98136ac495dSmrg   result.high = num.high << shift;
98236ac495dSmrg   result.low = num.low << shift;
98336ac495dSmrg   result.high |= num.low >> (PART_PRECISION - shift);
98436ac495dSmrg   result.unsignedp = num.unsignedp;
98536ac495dSmrg 
98636ac495dSmrg   if (base == 10)
98736ac495dSmrg     {
98836ac495dSmrg       add_low = num.low << 1;
98936ac495dSmrg       add_high = (num.high << 1) + (num.low >> (PART_PRECISION - 1));
99036ac495dSmrg     }
99136ac495dSmrg   else
99236ac495dSmrg     add_high = add_low = 0;
99336ac495dSmrg 
99436ac495dSmrg   if (add_low + digit < add_low)
99536ac495dSmrg     add_high++;
99636ac495dSmrg   add_low += digit;
99736ac495dSmrg 
99836ac495dSmrg   if (result.low + add_low < result.low)
99936ac495dSmrg     add_high++;
100036ac495dSmrg   if (result.high + add_high < result.high)
100136ac495dSmrg     overflow = true;
100236ac495dSmrg 
100336ac495dSmrg   result.low += add_low;
100436ac495dSmrg   result.high += add_high;
100536ac495dSmrg   result.overflow = overflow;
100636ac495dSmrg 
100736ac495dSmrg   /* The above code catches overflow of a cpp_num type.  This catches
100836ac495dSmrg      overflow of the (possibly shorter) target precision.  */
100936ac495dSmrg   num.low = result.low;
101036ac495dSmrg   num.high = result.high;
101136ac495dSmrg   result = num_trim (result, precision);
101236ac495dSmrg   if (!num_eq (result, num))
101336ac495dSmrg     result.overflow = true;
101436ac495dSmrg 
101536ac495dSmrg   return result;
101636ac495dSmrg }
101736ac495dSmrg 
101836ac495dSmrg /* Handle meeting "defined" in a preprocessor expression.  */
101936ac495dSmrg static cpp_num
parse_defined(cpp_reader * pfile)102036ac495dSmrg parse_defined (cpp_reader *pfile)
102136ac495dSmrg {
102236ac495dSmrg   cpp_num result;
102336ac495dSmrg   int paren = 0;
102436ac495dSmrg   cpp_hashnode *node = 0;
102536ac495dSmrg   const cpp_token *token;
102636ac495dSmrg   cpp_context *initial_context = pfile->context;
102736ac495dSmrg 
102836ac495dSmrg   /* Don't expand macros.  */
102936ac495dSmrg   pfile->state.prevent_expansion++;
103036ac495dSmrg 
103136ac495dSmrg   token = cpp_get_token (pfile);
103236ac495dSmrg   if (token->type == CPP_OPEN_PAREN)
103336ac495dSmrg     {
103436ac495dSmrg       paren = 1;
103536ac495dSmrg       token = cpp_get_token (pfile);
103636ac495dSmrg     }
103736ac495dSmrg 
103836ac495dSmrg   if (token->type == CPP_NAME)
103936ac495dSmrg     {
104036ac495dSmrg       node = token->val.node.node;
104136ac495dSmrg       if (paren && cpp_get_token (pfile)->type != CPP_CLOSE_PAREN)
104236ac495dSmrg 	{
104336ac495dSmrg 	  cpp_error (pfile, CPP_DL_ERROR, "missing ')' after \"defined\"");
104436ac495dSmrg 	  node = 0;
104536ac495dSmrg 	}
104636ac495dSmrg     }
104736ac495dSmrg   else
104836ac495dSmrg     {
104936ac495dSmrg       cpp_error (pfile, CPP_DL_ERROR,
105036ac495dSmrg 		 "operator \"defined\" requires an identifier");
105136ac495dSmrg       if (token->flags & NAMED_OP)
105236ac495dSmrg 	{
105336ac495dSmrg 	  cpp_token op;
105436ac495dSmrg 
105536ac495dSmrg 	  op.flags = 0;
105636ac495dSmrg 	  op.type = token->type;
105736ac495dSmrg 	  cpp_error (pfile, CPP_DL_ERROR,
105836ac495dSmrg 		     "(\"%s\" is an alternative token for \"%s\" in C++)",
105936ac495dSmrg 		     cpp_token_as_text (pfile, token),
106036ac495dSmrg 		     cpp_token_as_text (pfile, &op));
106136ac495dSmrg 	}
106236ac495dSmrg     }
106336ac495dSmrg 
106436ac495dSmrg   if (node)
106536ac495dSmrg     {
106636ac495dSmrg       if ((pfile->context != initial_context
106736ac495dSmrg 	   || initial_context != &pfile->base_context)
106836ac495dSmrg 	  && CPP_OPTION (pfile, warn_expansion_to_defined))
106936ac495dSmrg         cpp_pedwarning (pfile, CPP_W_EXPANSION_TO_DEFINED,
107036ac495dSmrg 		        "this use of \"defined\" may not be portable");
107136ac495dSmrg 
107236ac495dSmrg       _cpp_mark_macro_used (node);
1073c0a68be4Smrg       _cpp_maybe_notify_macro_use (pfile, node);
107436ac495dSmrg 
107536ac495dSmrg       /* A possible controlling macro of the form #if !defined ().
107636ac495dSmrg 	 _cpp_parse_expr checks there was no other junk on the line.  */
107736ac495dSmrg       pfile->mi_ind_cmacro = node;
107836ac495dSmrg     }
107936ac495dSmrg 
108036ac495dSmrg   pfile->state.prevent_expansion--;
108136ac495dSmrg 
108236ac495dSmrg   /* Do not treat conditional macros as being defined.  This is due to the
1083*8feb0f0bSmrg      powerpc port using conditional macros for 'vector', 'bool', and 'pixel'
1084*8feb0f0bSmrg      to act as conditional keywords.  This messes up tests like #ifndef
108536ac495dSmrg      bool.  */
108636ac495dSmrg   result.unsignedp = false;
108736ac495dSmrg   result.high = 0;
108836ac495dSmrg   result.overflow = false;
1089*8feb0f0bSmrg   result.low = node && _cpp_defined_macro_p (node);
109036ac495dSmrg   return result;
109136ac495dSmrg }
109236ac495dSmrg 
109336ac495dSmrg /* Convert a token into a CPP_NUMBER (an interpreted preprocessing
109436ac495dSmrg    number or character constant, or the result of the "defined" or "#"
109536ac495dSmrg    operators).  */
109636ac495dSmrg static cpp_num
eval_token(cpp_reader * pfile,const cpp_token * token,location_t virtual_location)109736ac495dSmrg eval_token (cpp_reader *pfile, const cpp_token *token,
1098c0a68be4Smrg 	    location_t virtual_location)
109936ac495dSmrg {
110036ac495dSmrg   cpp_num result;
110136ac495dSmrg   unsigned int temp;
110236ac495dSmrg   int unsignedp = 0;
110336ac495dSmrg 
110436ac495dSmrg   result.unsignedp = false;
110536ac495dSmrg   result.overflow = false;
110636ac495dSmrg 
110736ac495dSmrg   switch (token->type)
110836ac495dSmrg     {
110936ac495dSmrg     case CPP_NUMBER:
111036ac495dSmrg       temp = cpp_classify_number (pfile, token, NULL, virtual_location);
111136ac495dSmrg       if (temp & CPP_N_USERDEF)
111236ac495dSmrg 	cpp_error (pfile, CPP_DL_ERROR,
111336ac495dSmrg 		   "user-defined literal in preprocessor expression");
111436ac495dSmrg       switch (temp & CPP_N_CATEGORY)
111536ac495dSmrg 	{
111636ac495dSmrg 	case CPP_N_FLOATING:
111736ac495dSmrg 	  cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0,
111836ac495dSmrg 			       "floating constant in preprocessor expression");
111936ac495dSmrg 	  break;
112036ac495dSmrg 	case CPP_N_INTEGER:
112136ac495dSmrg 	  if (!(temp & CPP_N_IMAGINARY))
112236ac495dSmrg 	    return cpp_interpret_integer (pfile, token, temp);
112336ac495dSmrg 	  cpp_error_with_line (pfile, CPP_DL_ERROR, virtual_location, 0,
112436ac495dSmrg 			       "imaginary number in preprocessor expression");
112536ac495dSmrg 	  break;
112636ac495dSmrg 
112736ac495dSmrg 	case CPP_N_INVALID:
112836ac495dSmrg 	  /* Error already issued.  */
112936ac495dSmrg 	  break;
113036ac495dSmrg 	}
113136ac495dSmrg       result.high = result.low = 0;
113236ac495dSmrg       break;
113336ac495dSmrg 
113436ac495dSmrg     case CPP_WCHAR:
113536ac495dSmrg     case CPP_CHAR:
113636ac495dSmrg     case CPP_CHAR16:
113736ac495dSmrg     case CPP_CHAR32:
113836ac495dSmrg     case CPP_UTF8CHAR:
113936ac495dSmrg       {
114036ac495dSmrg 	cppchar_t cc = cpp_interpret_charconst (pfile, token,
114136ac495dSmrg 						&temp, &unsignedp);
114236ac495dSmrg 
114336ac495dSmrg 	result.high = 0;
114436ac495dSmrg 	result.low = cc;
114536ac495dSmrg 	/* Sign-extend the result if necessary.  */
114636ac495dSmrg 	if (!unsignedp && (cppchar_signed_t) cc < 0)
114736ac495dSmrg 	  {
114836ac495dSmrg 	    if (PART_PRECISION > BITS_PER_CPPCHAR_T)
114936ac495dSmrg 	      result.low |= ~(~(cpp_num_part) 0
115036ac495dSmrg 			      >> (PART_PRECISION - BITS_PER_CPPCHAR_T));
115136ac495dSmrg 	    result.high = ~(cpp_num_part) 0;
115236ac495dSmrg 	    result = num_trim (result, CPP_OPTION (pfile, precision));
115336ac495dSmrg 	  }
115436ac495dSmrg       }
115536ac495dSmrg       break;
115636ac495dSmrg 
115736ac495dSmrg     case CPP_NAME:
115836ac495dSmrg       if (token->val.node.node == pfile->spec_nodes.n_defined)
115936ac495dSmrg 	return parse_defined (pfile);
116036ac495dSmrg       else if (CPP_OPTION (pfile, cplusplus)
116136ac495dSmrg 	       && (token->val.node.node == pfile->spec_nodes.n_true
116236ac495dSmrg 		   || token->val.node.node == pfile->spec_nodes.n_false))
116336ac495dSmrg 	{
116436ac495dSmrg 	  result.high = 0;
116536ac495dSmrg 	  result.low = (token->val.node.node == pfile->spec_nodes.n_true);
116636ac495dSmrg 	}
116736ac495dSmrg       else
116836ac495dSmrg 	{
116936ac495dSmrg 	  result.high = 0;
117036ac495dSmrg 	  result.low = 0;
117136ac495dSmrg 	  if (CPP_OPTION (pfile, warn_undef) && !pfile->state.skip_eval)
117236ac495dSmrg 	    cpp_warning_with_line (pfile, CPP_W_UNDEF, virtual_location, 0,
117336ac495dSmrg 				   "\"%s\" is not defined, evaluates to 0",
117436ac495dSmrg 				   NODE_NAME (token->val.node.node));
117536ac495dSmrg 	}
117636ac495dSmrg       break;
117736ac495dSmrg 
117836ac495dSmrg     case CPP_HASH:
117936ac495dSmrg       if (!pfile->state.skipping)
118036ac495dSmrg 	{
118136ac495dSmrg 	  /* A pedantic warning takes precedence over a deprecated
118236ac495dSmrg 	     warning here.  */
118336ac495dSmrg 	  if (CPP_PEDANTIC (pfile))
118436ac495dSmrg 	    cpp_error_with_line (pfile, CPP_DL_PEDWARN,
118536ac495dSmrg 				 virtual_location, 0,
118636ac495dSmrg 				 "assertions are a GCC extension");
118736ac495dSmrg 	  else if (CPP_OPTION (pfile, cpp_warn_deprecated))
118836ac495dSmrg 	    cpp_warning_with_line (pfile, CPP_W_DEPRECATED, virtual_location, 0,
118936ac495dSmrg 				   "assertions are a deprecated extension");
119036ac495dSmrg 	}
119136ac495dSmrg       _cpp_test_assertion (pfile, &temp);
119236ac495dSmrg       result.high = 0;
119336ac495dSmrg       result.low = temp;
119436ac495dSmrg       break;
119536ac495dSmrg 
119636ac495dSmrg     default:
119736ac495dSmrg       abort ();
119836ac495dSmrg     }
119936ac495dSmrg 
120036ac495dSmrg   result.unsignedp = !!unsignedp;
120136ac495dSmrg   return result;
120236ac495dSmrg }
120336ac495dSmrg 
120436ac495dSmrg /* Operator precedence and flags table.
120536ac495dSmrg 
120636ac495dSmrg After an operator is returned from the lexer, if it has priority less
120736ac495dSmrg than the operator on the top of the stack, we reduce the stack by one
120836ac495dSmrg operator and repeat the test.  Since equal priorities do not reduce,
120936ac495dSmrg this is naturally right-associative.
121036ac495dSmrg 
121136ac495dSmrg We handle left-associative operators by decrementing the priority of
121236ac495dSmrg just-lexed operators by one, but retaining the priority of operators
121336ac495dSmrg already on the stack.
121436ac495dSmrg 
121536ac495dSmrg The remaining cases are '(' and ')'.  We handle '(' by skipping the
121636ac495dSmrg reduction phase completely.  ')' is given lower priority than
121736ac495dSmrg everything else, including '(', effectively forcing a reduction of the
121836ac495dSmrg parenthesized expression.  If there is a matching '(', the routine
121936ac495dSmrg reduce() exits immediately.  If the normal exit route sees a ')', then
122036ac495dSmrg there cannot have been a matching '(' and an error message is output.
122136ac495dSmrg 
122236ac495dSmrg The parser assumes all shifted operators require a left operand unless
122336ac495dSmrg the flag NO_L_OPERAND is set.  These semantics are automatic; any
122436ac495dSmrg extra semantics need to be handled with operator-specific code.  */
122536ac495dSmrg 
122636ac495dSmrg /* Flags.  If CHECK_PROMOTION, we warn if the effective sign of an
122736ac495dSmrg    operand changes because of integer promotions.  */
122836ac495dSmrg #define NO_L_OPERAND	(1 << 0)
122936ac495dSmrg #define LEFT_ASSOC	(1 << 1)
123036ac495dSmrg #define CHECK_PROMOTION	(1 << 2)
123136ac495dSmrg 
123236ac495dSmrg /* Operator to priority map.  Must be in the same order as the first
123336ac495dSmrg    N entries of enum cpp_ttype.  */
123436ac495dSmrg static const struct cpp_operator
123536ac495dSmrg {
123636ac495dSmrg   uchar prio;
123736ac495dSmrg   uchar flags;
123836ac495dSmrg } optab[] =
123936ac495dSmrg {
124036ac495dSmrg   /* EQ */		{0, 0},	/* Shouldn't happen.  */
124136ac495dSmrg   /* NOT */		{16, NO_L_OPERAND},
124236ac495dSmrg   /* GREATER */		{12, LEFT_ASSOC | CHECK_PROMOTION},
124336ac495dSmrg   /* LESS */		{12, LEFT_ASSOC | CHECK_PROMOTION},
124436ac495dSmrg   /* PLUS */		{14, LEFT_ASSOC | CHECK_PROMOTION},
124536ac495dSmrg   /* MINUS */		{14, LEFT_ASSOC | CHECK_PROMOTION},
124636ac495dSmrg   /* MULT */		{15, LEFT_ASSOC | CHECK_PROMOTION},
124736ac495dSmrg   /* DIV */		{15, LEFT_ASSOC | CHECK_PROMOTION},
124836ac495dSmrg   /* MOD */		{15, LEFT_ASSOC | CHECK_PROMOTION},
124936ac495dSmrg   /* AND */		{9, LEFT_ASSOC | CHECK_PROMOTION},
125036ac495dSmrg   /* OR */		{7, LEFT_ASSOC | CHECK_PROMOTION},
125136ac495dSmrg   /* XOR */		{8, LEFT_ASSOC | CHECK_PROMOTION},
125236ac495dSmrg   /* RSHIFT */		{13, LEFT_ASSOC},
125336ac495dSmrg   /* LSHIFT */		{13, LEFT_ASSOC},
125436ac495dSmrg 
125536ac495dSmrg   /* COMPL */		{16, NO_L_OPERAND},
125636ac495dSmrg   /* AND_AND */		{6, LEFT_ASSOC},
125736ac495dSmrg   /* OR_OR */		{5, LEFT_ASSOC},
125836ac495dSmrg   /* Note that QUERY, COLON, and COMMA must have the same precedence.
125936ac495dSmrg      However, there are some special cases for these in reduce().  */
126036ac495dSmrg   /* QUERY */		{4, 0},
126136ac495dSmrg   /* COLON */		{4, LEFT_ASSOC | CHECK_PROMOTION},
126236ac495dSmrg   /* COMMA */		{4, LEFT_ASSOC},
126336ac495dSmrg   /* OPEN_PAREN */	{1, NO_L_OPERAND},
126436ac495dSmrg   /* CLOSE_PAREN */	{0, 0},
126536ac495dSmrg   /* EOF */		{0, 0},
126636ac495dSmrg   /* EQ_EQ */		{11, LEFT_ASSOC},
126736ac495dSmrg   /* NOT_EQ */		{11, LEFT_ASSOC},
126836ac495dSmrg   /* GREATER_EQ */	{12, LEFT_ASSOC | CHECK_PROMOTION},
126936ac495dSmrg   /* LESS_EQ */		{12, LEFT_ASSOC | CHECK_PROMOTION},
127036ac495dSmrg   /* UPLUS */		{16, NO_L_OPERAND},
127136ac495dSmrg   /* UMINUS */		{16, NO_L_OPERAND}
127236ac495dSmrg };
127336ac495dSmrg 
127436ac495dSmrg /* Parse and evaluate a C expression, reading from PFILE.
127536ac495dSmrg    Returns the truth value of the expression.
127636ac495dSmrg 
127736ac495dSmrg    The implementation is an operator precedence parser, i.e. a
127836ac495dSmrg    bottom-up parser, using a stack for not-yet-reduced tokens.
127936ac495dSmrg 
128036ac495dSmrg    The stack base is op_stack, and the current stack pointer is 'top'.
128136ac495dSmrg    There is a stack element for each operator (only), and the most
128236ac495dSmrg    recently pushed operator is 'top->op'.  An operand (value) is
128336ac495dSmrg    stored in the 'value' field of the stack element of the operator
128436ac495dSmrg    that precedes it.  */
128536ac495dSmrg bool
_cpp_parse_expr(cpp_reader * pfile,bool is_if)128636ac495dSmrg _cpp_parse_expr (cpp_reader *pfile, bool is_if)
128736ac495dSmrg {
128836ac495dSmrg   struct op *top = pfile->op_stack;
128936ac495dSmrg   unsigned int lex_count;
129036ac495dSmrg   bool saw_leading_not, want_value = true;
1291c0a68be4Smrg   location_t virtual_location = 0;
129236ac495dSmrg 
129336ac495dSmrg   pfile->state.skip_eval = 0;
129436ac495dSmrg 
129536ac495dSmrg   /* Set up detection of #if ! defined().  */
129636ac495dSmrg   pfile->mi_ind_cmacro = 0;
129736ac495dSmrg   saw_leading_not = false;
129836ac495dSmrg   lex_count = 0;
129936ac495dSmrg 
130036ac495dSmrg   /* Lowest priority operator prevents further reductions.  */
130136ac495dSmrg   top->op = CPP_EOF;
130236ac495dSmrg 
130336ac495dSmrg   for (;;)
130436ac495dSmrg     {
130536ac495dSmrg       struct op op;
130636ac495dSmrg 
130736ac495dSmrg       lex_count++;
130836ac495dSmrg       op.token = cpp_get_token_with_location (pfile, &virtual_location);
130936ac495dSmrg       op.op = op.token->type;
131036ac495dSmrg       op.loc = virtual_location;
131136ac495dSmrg 
131236ac495dSmrg       switch (op.op)
131336ac495dSmrg 	{
131436ac495dSmrg 	  /* These tokens convert into values.  */
131536ac495dSmrg 	case CPP_NUMBER:
131636ac495dSmrg 	case CPP_CHAR:
131736ac495dSmrg 	case CPP_WCHAR:
131836ac495dSmrg 	case CPP_CHAR16:
131936ac495dSmrg 	case CPP_CHAR32:
132036ac495dSmrg 	case CPP_UTF8CHAR:
132136ac495dSmrg 	case CPP_NAME:
132236ac495dSmrg 	case CPP_HASH:
132336ac495dSmrg 	  if (!want_value)
132436ac495dSmrg 	    SYNTAX_ERROR2_AT (op.loc,
132536ac495dSmrg 			      "missing binary operator before token \"%s\"",
132636ac495dSmrg 			      cpp_token_as_text (pfile, op.token));
132736ac495dSmrg 	  want_value = false;
132836ac495dSmrg 	  top->value = eval_token (pfile, op.token, op.loc);
132936ac495dSmrg 	  continue;
133036ac495dSmrg 
133136ac495dSmrg 	case CPP_NOT:
133236ac495dSmrg 	  saw_leading_not = lex_count == 1;
133336ac495dSmrg 	  break;
133436ac495dSmrg 	case CPP_PLUS:
133536ac495dSmrg 	  if (want_value)
133636ac495dSmrg 	    op.op = CPP_UPLUS;
133736ac495dSmrg 	  break;
133836ac495dSmrg 	case CPP_MINUS:
133936ac495dSmrg 	  if (want_value)
134036ac495dSmrg 	    op.op = CPP_UMINUS;
134136ac495dSmrg 	  break;
134236ac495dSmrg 
1343*8feb0f0bSmrg 	case CPP_PADDING:
1344*8feb0f0bSmrg 	  lex_count--;
1345*8feb0f0bSmrg 	  continue;
1346*8feb0f0bSmrg 
134736ac495dSmrg 	default:
134836ac495dSmrg 	  if ((int) op.op <= (int) CPP_EQ || (int) op.op >= (int) CPP_PLUS_EQ)
134936ac495dSmrg 	    SYNTAX_ERROR2_AT (op.loc,
135036ac495dSmrg 			      "token \"%s\" is not valid in preprocessor expressions",
135136ac495dSmrg 			      cpp_token_as_text (pfile, op.token));
135236ac495dSmrg 	  break;
135336ac495dSmrg 	}
135436ac495dSmrg 
135536ac495dSmrg       /* Check we have a value or operator as appropriate.  */
135636ac495dSmrg       if (optab[op.op].flags & NO_L_OPERAND)
135736ac495dSmrg 	{
135836ac495dSmrg 	  if (!want_value)
135936ac495dSmrg 	    SYNTAX_ERROR2_AT (op.loc,
136036ac495dSmrg 			      "missing binary operator before token \"%s\"",
136136ac495dSmrg 			      cpp_token_as_text (pfile, op.token));
136236ac495dSmrg 	}
136336ac495dSmrg       else if (want_value)
136436ac495dSmrg 	{
136536ac495dSmrg 	  /* We want a number (or expression) and haven't got one.
136636ac495dSmrg 	     Try to emit a specific diagnostic.  */
136736ac495dSmrg 	  if (op.op == CPP_CLOSE_PAREN && top->op == CPP_OPEN_PAREN)
136836ac495dSmrg 	    SYNTAX_ERROR_AT (op.loc,
136936ac495dSmrg 			     "missing expression between '(' and ')'");
137036ac495dSmrg 
137136ac495dSmrg 	  if (op.op == CPP_EOF && top->op == CPP_EOF)
137236ac495dSmrg  	    SYNTAX_ERROR2_AT (op.loc,
137336ac495dSmrg 			      "%s with no expression", is_if ? "#if" : "#elif");
137436ac495dSmrg 
137536ac495dSmrg  	  if (top->op != CPP_EOF && top->op != CPP_OPEN_PAREN)
137636ac495dSmrg  	    SYNTAX_ERROR2_AT (op.loc,
137736ac495dSmrg 			      "operator '%s' has no right operand",
137836ac495dSmrg 			      cpp_token_as_text (pfile, top->token));
137936ac495dSmrg 	  else if (op.op == CPP_CLOSE_PAREN || op.op == CPP_EOF)
138036ac495dSmrg 	    /* Complain about missing paren during reduction.  */;
138136ac495dSmrg 	  else
138236ac495dSmrg 	    SYNTAX_ERROR2_AT (op.loc,
138336ac495dSmrg 			      "operator '%s' has no left operand",
138436ac495dSmrg 			      cpp_token_as_text (pfile, op.token));
138536ac495dSmrg 	}
138636ac495dSmrg 
138736ac495dSmrg       top = reduce (pfile, top, op.op);
138836ac495dSmrg       if (!top)
138936ac495dSmrg 	goto syntax_error;
139036ac495dSmrg 
139136ac495dSmrg       if (op.op == CPP_EOF)
139236ac495dSmrg 	break;
139336ac495dSmrg 
139436ac495dSmrg       switch (op.op)
139536ac495dSmrg 	{
139636ac495dSmrg 	case CPP_CLOSE_PAREN:
139736ac495dSmrg 	  continue;
139836ac495dSmrg 	case CPP_OR_OR:
139936ac495dSmrg 	  if (!num_zerop (top->value))
140036ac495dSmrg 	    pfile->state.skip_eval++;
140136ac495dSmrg 	  break;
140236ac495dSmrg 	case CPP_AND_AND:
140336ac495dSmrg 	case CPP_QUERY:
140436ac495dSmrg 	  if (num_zerop (top->value))
140536ac495dSmrg 	    pfile->state.skip_eval++;
140636ac495dSmrg 	  break;
140736ac495dSmrg 	case CPP_COLON:
140836ac495dSmrg 	  if (top->op != CPP_QUERY)
140936ac495dSmrg 	    SYNTAX_ERROR_AT (op.loc,
141036ac495dSmrg 			     " ':' without preceding '?'");
141136ac495dSmrg 	  if (!num_zerop (top[-1].value)) /* Was '?' condition true?  */
141236ac495dSmrg 	    pfile->state.skip_eval++;
141336ac495dSmrg 	  else
141436ac495dSmrg 	    pfile->state.skip_eval--;
141536ac495dSmrg 	default:
141636ac495dSmrg 	  break;
141736ac495dSmrg 	}
141836ac495dSmrg 
141936ac495dSmrg       want_value = true;
142036ac495dSmrg 
142136ac495dSmrg       /* Check for and handle stack overflow.  */
142236ac495dSmrg       if (++top == pfile->op_limit)
142336ac495dSmrg 	top = _cpp_expand_op_stack (pfile);
142436ac495dSmrg 
142536ac495dSmrg       top->op = op.op;
142636ac495dSmrg       top->token = op.token;
142736ac495dSmrg       top->loc = op.loc;
142836ac495dSmrg     }
142936ac495dSmrg 
143036ac495dSmrg   /* The controlling macro expression is only valid if we called lex 3
143136ac495dSmrg      times: <!> <defined expression> and <EOF>.  push_conditional ()
143236ac495dSmrg      checks that we are at top-of-file.  */
143336ac495dSmrg   if (pfile->mi_ind_cmacro && !(saw_leading_not && lex_count == 3))
143436ac495dSmrg     pfile->mi_ind_cmacro = 0;
143536ac495dSmrg 
143636ac495dSmrg   if (top != pfile->op_stack)
143736ac495dSmrg     {
143836ac495dSmrg       cpp_error_with_line (pfile, CPP_DL_ICE, top->loc, 0,
143936ac495dSmrg 			   "unbalanced stack in %s",
144036ac495dSmrg 			   is_if ? "#if" : "#elif");
144136ac495dSmrg     syntax_error:
144236ac495dSmrg       return false;  /* Return false on syntax error.  */
144336ac495dSmrg     }
144436ac495dSmrg 
144536ac495dSmrg   return !num_zerop (top->value);
144636ac495dSmrg }
144736ac495dSmrg 
144836ac495dSmrg /* Reduce the operator / value stack if possible, in preparation for
144936ac495dSmrg    pushing operator OP.  Returns NULL on error, otherwise the top of
145036ac495dSmrg    the stack.  */
145136ac495dSmrg static struct op *
reduce(cpp_reader * pfile,struct op * top,enum cpp_ttype op)145236ac495dSmrg reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op)
145336ac495dSmrg {
145436ac495dSmrg   unsigned int prio;
145536ac495dSmrg 
145636ac495dSmrg   if (top->op <= CPP_EQ || top->op > CPP_LAST_CPP_OP + 2)
145736ac495dSmrg     {
145836ac495dSmrg     bad_op:
145936ac495dSmrg       cpp_error (pfile, CPP_DL_ICE, "impossible operator '%u'", top->op);
146036ac495dSmrg       return 0;
146136ac495dSmrg     }
146236ac495dSmrg 
146336ac495dSmrg   if (op == CPP_OPEN_PAREN)
146436ac495dSmrg     return top;
146536ac495dSmrg 
146636ac495dSmrg   /* Decrement the priority of left-associative operators to force a
146736ac495dSmrg      reduction with operators of otherwise equal priority.  */
146836ac495dSmrg   prio = optab[op].prio - ((optab[op].flags & LEFT_ASSOC) != 0);
146936ac495dSmrg   while (prio < optab[top->op].prio)
147036ac495dSmrg     {
147136ac495dSmrg       if (CPP_OPTION (pfile, warn_num_sign_change)
147236ac495dSmrg 	  && optab[top->op].flags & CHECK_PROMOTION)
147336ac495dSmrg 	check_promotion (pfile, top);
147436ac495dSmrg 
147536ac495dSmrg       switch (top->op)
147636ac495dSmrg 	{
147736ac495dSmrg 	case CPP_UPLUS:
147836ac495dSmrg 	case CPP_UMINUS:
147936ac495dSmrg 	case CPP_NOT:
148036ac495dSmrg 	case CPP_COMPL:
148136ac495dSmrg 	  top[-1].value = num_unary_op (pfile, top->value, top->op);
148236ac495dSmrg 	  top[-1].loc = top->loc;
148336ac495dSmrg 	  break;
148436ac495dSmrg 
148536ac495dSmrg 	case CPP_PLUS:
148636ac495dSmrg 	case CPP_MINUS:
148736ac495dSmrg 	case CPP_RSHIFT:
148836ac495dSmrg 	case CPP_LSHIFT:
148936ac495dSmrg 	case CPP_COMMA:
149036ac495dSmrg 	  top[-1].value = num_binary_op (pfile, top[-1].value,
149136ac495dSmrg 					 top->value, top->op);
149236ac495dSmrg 	  top[-1].loc = top->loc;
149336ac495dSmrg 	  break;
149436ac495dSmrg 
149536ac495dSmrg 	case CPP_GREATER:
149636ac495dSmrg 	case CPP_LESS:
149736ac495dSmrg 	case CPP_GREATER_EQ:
149836ac495dSmrg 	case CPP_LESS_EQ:
149936ac495dSmrg 	  top[-1].value
150036ac495dSmrg 	    = num_inequality_op (pfile, top[-1].value, top->value, top->op);
150136ac495dSmrg 	  top[-1].loc = top->loc;
150236ac495dSmrg 	  break;
150336ac495dSmrg 
150436ac495dSmrg 	case CPP_EQ_EQ:
150536ac495dSmrg 	case CPP_NOT_EQ:
150636ac495dSmrg 	  top[-1].value
150736ac495dSmrg 	    = num_equality_op (pfile, top[-1].value, top->value, top->op);
150836ac495dSmrg 	  top[-1].loc = top->loc;
150936ac495dSmrg 	  break;
151036ac495dSmrg 
151136ac495dSmrg 	case CPP_AND:
151236ac495dSmrg 	case CPP_OR:
151336ac495dSmrg 	case CPP_XOR:
151436ac495dSmrg 	  top[-1].value
151536ac495dSmrg 	    = num_bitwise_op (pfile, top[-1].value, top->value, top->op);
151636ac495dSmrg 	  top[-1].loc = top->loc;
151736ac495dSmrg 	  break;
151836ac495dSmrg 
151936ac495dSmrg 	case CPP_MULT:
152036ac495dSmrg 	  top[-1].value = num_mul (pfile, top[-1].value, top->value);
152136ac495dSmrg 	  top[-1].loc = top->loc;
152236ac495dSmrg 	  break;
152336ac495dSmrg 
152436ac495dSmrg 	case CPP_DIV:
152536ac495dSmrg 	case CPP_MOD:
152636ac495dSmrg 	  top[-1].value = num_div_op (pfile, top[-1].value,
152736ac495dSmrg 				      top->value, top->op, top->loc);
152836ac495dSmrg 	  top[-1].loc = top->loc;
152936ac495dSmrg 	  break;
153036ac495dSmrg 
153136ac495dSmrg 	case CPP_OR_OR:
153236ac495dSmrg 	  top--;
153336ac495dSmrg 	  if (!num_zerop (top->value))
153436ac495dSmrg 	    pfile->state.skip_eval--;
153536ac495dSmrg 	  top->value.low = (!num_zerop (top->value)
153636ac495dSmrg 			    || !num_zerop (top[1].value));
153736ac495dSmrg 	  top->value.high = 0;
153836ac495dSmrg 	  top->value.unsignedp = false;
153936ac495dSmrg 	  top->value.overflow = false;
154036ac495dSmrg 	  top->loc = top[1].loc;
154136ac495dSmrg 	  continue;
154236ac495dSmrg 
154336ac495dSmrg 	case CPP_AND_AND:
154436ac495dSmrg 	  top--;
154536ac495dSmrg 	  if (num_zerop (top->value))
154636ac495dSmrg 	    pfile->state.skip_eval--;
154736ac495dSmrg 	  top->value.low = (!num_zerop (top->value)
154836ac495dSmrg 			    && !num_zerop (top[1].value));
154936ac495dSmrg 	  top->value.high = 0;
155036ac495dSmrg 	  top->value.unsignedp = false;
155136ac495dSmrg 	  top->value.overflow = false;
155236ac495dSmrg 	  top->loc = top[1].loc;
155336ac495dSmrg 	  continue;
155436ac495dSmrg 
155536ac495dSmrg 	case CPP_OPEN_PAREN:
155636ac495dSmrg 	  if (op != CPP_CLOSE_PAREN)
155736ac495dSmrg 	    {
155836ac495dSmrg 	      cpp_error_with_line (pfile, CPP_DL_ERROR,
155936ac495dSmrg 				   top->token->src_loc,
156036ac495dSmrg 				   0, "missing ')' in expression");
156136ac495dSmrg 	      return 0;
156236ac495dSmrg 	    }
156336ac495dSmrg 	  top--;
156436ac495dSmrg 	  top->value = top[1].value;
156536ac495dSmrg 	  top->loc = top[1].loc;
156636ac495dSmrg 	  return top;
156736ac495dSmrg 
156836ac495dSmrg 	case CPP_COLON:
156936ac495dSmrg 	  top -= 2;
157036ac495dSmrg 	  if (!num_zerop (top->value))
157136ac495dSmrg 	    {
157236ac495dSmrg 	      pfile->state.skip_eval--;
157336ac495dSmrg 	      top->value = top[1].value;
157436ac495dSmrg 	      top->loc = top[1].loc;
157536ac495dSmrg 	    }
157636ac495dSmrg 	  else
157736ac495dSmrg 	    {
157836ac495dSmrg 	      top->value = top[2].value;
157936ac495dSmrg 	      top->loc = top[2].loc;
158036ac495dSmrg 	    }
158136ac495dSmrg 	  top->value.unsignedp = (top[1].value.unsignedp
158236ac495dSmrg 				  || top[2].value.unsignedp);
158336ac495dSmrg 	  continue;
158436ac495dSmrg 
158536ac495dSmrg 	case CPP_QUERY:
158636ac495dSmrg 	  /* COMMA and COLON should not reduce a QUERY operator.  */
158736ac495dSmrg 	  if (op == CPP_COMMA || op == CPP_COLON)
158836ac495dSmrg 	    return top;
158936ac495dSmrg 	  cpp_error (pfile, CPP_DL_ERROR, "'?' without following ':'");
159036ac495dSmrg 	  return 0;
159136ac495dSmrg 
159236ac495dSmrg 	default:
159336ac495dSmrg 	  goto bad_op;
159436ac495dSmrg 	}
159536ac495dSmrg 
159636ac495dSmrg       top--;
159736ac495dSmrg       if (top->value.overflow && !pfile->state.skip_eval)
159836ac495dSmrg 	cpp_error (pfile, CPP_DL_PEDWARN,
159936ac495dSmrg 		   "integer overflow in preprocessor expression");
160036ac495dSmrg     }
160136ac495dSmrg 
160236ac495dSmrg   if (op == CPP_CLOSE_PAREN)
160336ac495dSmrg     {
160436ac495dSmrg       cpp_error (pfile, CPP_DL_ERROR, "missing '(' in expression");
160536ac495dSmrg       return 0;
160636ac495dSmrg     }
160736ac495dSmrg 
160836ac495dSmrg   return top;
160936ac495dSmrg }
161036ac495dSmrg 
161136ac495dSmrg /* Returns the position of the old top of stack after expansion.  */
161236ac495dSmrg struct op *
_cpp_expand_op_stack(cpp_reader * pfile)161336ac495dSmrg _cpp_expand_op_stack (cpp_reader *pfile)
161436ac495dSmrg {
161536ac495dSmrg   size_t old_size = (size_t) (pfile->op_limit - pfile->op_stack);
161636ac495dSmrg   size_t new_size = old_size * 2 + 20;
161736ac495dSmrg 
161836ac495dSmrg   pfile->op_stack = XRESIZEVEC (struct op, pfile->op_stack, new_size);
161936ac495dSmrg   pfile->op_limit = pfile->op_stack + new_size;
162036ac495dSmrg 
162136ac495dSmrg   return pfile->op_stack + old_size;
162236ac495dSmrg }
162336ac495dSmrg 
162436ac495dSmrg /* Emits a warning if the effective sign of either operand of OP
162536ac495dSmrg    changes because of integer promotions.  */
162636ac495dSmrg static void
check_promotion(cpp_reader * pfile,const struct op * op)162736ac495dSmrg check_promotion (cpp_reader *pfile, const struct op *op)
162836ac495dSmrg {
162936ac495dSmrg   if (op->value.unsignedp == op[-1].value.unsignedp)
163036ac495dSmrg     return;
163136ac495dSmrg 
163236ac495dSmrg   if (op->value.unsignedp)
163336ac495dSmrg     {
163436ac495dSmrg       if (!num_positive (op[-1].value, CPP_OPTION (pfile, precision)))
163536ac495dSmrg 	cpp_error_with_line (pfile, CPP_DL_WARNING, op[-1].loc, 0,
163636ac495dSmrg 			     "the left operand of \"%s\" changes sign when promoted",
163736ac495dSmrg 			     cpp_token_as_text (pfile, op->token));
163836ac495dSmrg     }
163936ac495dSmrg   else if (!num_positive (op->value, CPP_OPTION (pfile, precision)))
164036ac495dSmrg     cpp_error_with_line (pfile, CPP_DL_WARNING, op->loc, 0,
164136ac495dSmrg 	       "the right operand of \"%s\" changes sign when promoted",
164236ac495dSmrg 	       cpp_token_as_text (pfile, op->token));
164336ac495dSmrg }
164436ac495dSmrg 
164536ac495dSmrg /* Clears the unused high order bits of the number pointed to by PNUM.  */
164636ac495dSmrg static cpp_num
num_trim(cpp_num num,size_t precision)164736ac495dSmrg num_trim (cpp_num num, size_t precision)
164836ac495dSmrg {
164936ac495dSmrg   if (precision > PART_PRECISION)
165036ac495dSmrg     {
165136ac495dSmrg       precision -= PART_PRECISION;
165236ac495dSmrg       if (precision < PART_PRECISION)
165336ac495dSmrg 	num.high &= ((cpp_num_part) 1 << precision) - 1;
165436ac495dSmrg     }
165536ac495dSmrg   else
165636ac495dSmrg     {
165736ac495dSmrg       if (precision < PART_PRECISION)
165836ac495dSmrg 	num.low &= ((cpp_num_part) 1 << precision) - 1;
165936ac495dSmrg       num.high = 0;
166036ac495dSmrg     }
166136ac495dSmrg 
166236ac495dSmrg   return num;
166336ac495dSmrg }
166436ac495dSmrg 
166536ac495dSmrg /* True iff A (presumed signed) >= 0.  */
166636ac495dSmrg static bool
num_positive(cpp_num num,size_t precision)166736ac495dSmrg num_positive (cpp_num num, size_t precision)
166836ac495dSmrg {
166936ac495dSmrg   if (precision > PART_PRECISION)
167036ac495dSmrg     {
167136ac495dSmrg       precision -= PART_PRECISION;
167236ac495dSmrg       return (num.high & (cpp_num_part) 1 << (precision - 1)) == 0;
167336ac495dSmrg     }
167436ac495dSmrg 
167536ac495dSmrg   return (num.low & (cpp_num_part) 1 << (precision - 1)) == 0;
167636ac495dSmrg }
167736ac495dSmrg 
167836ac495dSmrg /* Sign extend a number, with PRECISION significant bits and all
167936ac495dSmrg    others assumed clear, to fill out a cpp_num structure.  */
168036ac495dSmrg cpp_num
cpp_num_sign_extend(cpp_num num,size_t precision)168136ac495dSmrg cpp_num_sign_extend (cpp_num num, size_t precision)
168236ac495dSmrg {
168336ac495dSmrg   if (!num.unsignedp)
168436ac495dSmrg     {
168536ac495dSmrg       if (precision > PART_PRECISION)
168636ac495dSmrg 	{
168736ac495dSmrg 	  precision -= PART_PRECISION;
168836ac495dSmrg 	  if (precision < PART_PRECISION
168936ac495dSmrg 	      && (num.high & (cpp_num_part) 1 << (precision - 1)))
169036ac495dSmrg 	    num.high |= ~(~(cpp_num_part) 0 >> (PART_PRECISION - precision));
169136ac495dSmrg 	}
169236ac495dSmrg       else if (num.low & (cpp_num_part) 1 << (precision - 1))
169336ac495dSmrg 	{
169436ac495dSmrg 	  if (precision < PART_PRECISION)
169536ac495dSmrg 	    num.low |= ~(~(cpp_num_part) 0 >> (PART_PRECISION - precision));
169636ac495dSmrg 	  num.high = ~(cpp_num_part) 0;
169736ac495dSmrg 	}
169836ac495dSmrg     }
169936ac495dSmrg 
170036ac495dSmrg   return num;
170136ac495dSmrg }
170236ac495dSmrg 
170336ac495dSmrg /* Returns the negative of NUM.  */
170436ac495dSmrg static cpp_num
num_negate(cpp_num num,size_t precision)170536ac495dSmrg num_negate (cpp_num num, size_t precision)
170636ac495dSmrg {
170736ac495dSmrg   cpp_num copy;
170836ac495dSmrg 
170936ac495dSmrg   copy = num;
171036ac495dSmrg   num.high = ~num.high;
171136ac495dSmrg   num.low = ~num.low;
171236ac495dSmrg   if (++num.low == 0)
171336ac495dSmrg     num.high++;
171436ac495dSmrg   num = num_trim (num, precision);
171536ac495dSmrg   num.overflow = (!num.unsignedp && num_eq (num, copy) && !num_zerop (num));
171636ac495dSmrg 
171736ac495dSmrg   return num;
171836ac495dSmrg }
171936ac495dSmrg 
172036ac495dSmrg /* Returns true if A >= B.  */
172136ac495dSmrg static bool
num_greater_eq(cpp_num pa,cpp_num pb,size_t precision)172236ac495dSmrg num_greater_eq (cpp_num pa, cpp_num pb, size_t precision)
172336ac495dSmrg {
172436ac495dSmrg   bool unsignedp;
172536ac495dSmrg 
172636ac495dSmrg   unsignedp = pa.unsignedp || pb.unsignedp;
172736ac495dSmrg 
172836ac495dSmrg   if (!unsignedp)
172936ac495dSmrg     {
173036ac495dSmrg       /* Both numbers have signed type.  If they are of different
173136ac495dSmrg        sign, the answer is the sign of A.  */
173236ac495dSmrg       unsignedp = num_positive (pa, precision);
173336ac495dSmrg 
173436ac495dSmrg       if (unsignedp != num_positive (pb, precision))
173536ac495dSmrg 	return unsignedp;
173636ac495dSmrg 
173736ac495dSmrg       /* Otherwise we can do an unsigned comparison.  */
173836ac495dSmrg     }
173936ac495dSmrg 
174036ac495dSmrg   return (pa.high > pb.high) || (pa.high == pb.high && pa.low >= pb.low);
174136ac495dSmrg }
174236ac495dSmrg 
174336ac495dSmrg /* Returns LHS OP RHS, where OP is a bit-wise operation.  */
174436ac495dSmrg static cpp_num
num_bitwise_op(cpp_reader * pfile ATTRIBUTE_UNUSED,cpp_num lhs,cpp_num rhs,enum cpp_ttype op)174536ac495dSmrg num_bitwise_op (cpp_reader *pfile ATTRIBUTE_UNUSED,
174636ac495dSmrg 		cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
174736ac495dSmrg {
174836ac495dSmrg   lhs.overflow = false;
174936ac495dSmrg   lhs.unsignedp = lhs.unsignedp || rhs.unsignedp;
175036ac495dSmrg 
175136ac495dSmrg   /* As excess precision is zeroed, there is no need to num_trim () as
175236ac495dSmrg      these operations cannot introduce a set bit there.  */
175336ac495dSmrg   if (op == CPP_AND)
175436ac495dSmrg     {
175536ac495dSmrg       lhs.low &= rhs.low;
175636ac495dSmrg       lhs.high &= rhs.high;
175736ac495dSmrg     }
175836ac495dSmrg   else if (op == CPP_OR)
175936ac495dSmrg     {
176036ac495dSmrg       lhs.low |= rhs.low;
176136ac495dSmrg       lhs.high |= rhs.high;
176236ac495dSmrg     }
176336ac495dSmrg   else
176436ac495dSmrg     {
176536ac495dSmrg       lhs.low ^= rhs.low;
176636ac495dSmrg       lhs.high ^= rhs.high;
176736ac495dSmrg     }
176836ac495dSmrg 
176936ac495dSmrg   return lhs;
177036ac495dSmrg }
177136ac495dSmrg 
177236ac495dSmrg /* Returns LHS OP RHS, where OP is an inequality.  */
177336ac495dSmrg static cpp_num
num_inequality_op(cpp_reader * pfile,cpp_num lhs,cpp_num rhs,enum cpp_ttype op)177436ac495dSmrg num_inequality_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs,
177536ac495dSmrg 		   enum cpp_ttype op)
177636ac495dSmrg {
177736ac495dSmrg   bool gte = num_greater_eq (lhs, rhs, CPP_OPTION (pfile, precision));
177836ac495dSmrg 
177936ac495dSmrg   if (op == CPP_GREATER_EQ)
178036ac495dSmrg     lhs.low = gte;
178136ac495dSmrg   else if (op == CPP_LESS)
178236ac495dSmrg     lhs.low = !gte;
178336ac495dSmrg   else if (op == CPP_GREATER)
178436ac495dSmrg     lhs.low = gte && !num_eq (lhs, rhs);
178536ac495dSmrg   else /* CPP_LESS_EQ.  */
178636ac495dSmrg     lhs.low = !gte || num_eq (lhs, rhs);
178736ac495dSmrg 
178836ac495dSmrg   lhs.high = 0;
178936ac495dSmrg   lhs.overflow = false;
179036ac495dSmrg   lhs.unsignedp = false;
179136ac495dSmrg   return lhs;
179236ac495dSmrg }
179336ac495dSmrg 
179436ac495dSmrg /* Returns LHS OP RHS, where OP is == or !=.  */
179536ac495dSmrg static cpp_num
num_equality_op(cpp_reader * pfile ATTRIBUTE_UNUSED,cpp_num lhs,cpp_num rhs,enum cpp_ttype op)179636ac495dSmrg num_equality_op (cpp_reader *pfile ATTRIBUTE_UNUSED,
179736ac495dSmrg 		 cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
179836ac495dSmrg {
179936ac495dSmrg   /* Work around a 3.0.4 bug; see PR 6950.  */
180036ac495dSmrg   bool eq = num_eq (lhs, rhs);
180136ac495dSmrg   if (op == CPP_NOT_EQ)
180236ac495dSmrg     eq = !eq;
180336ac495dSmrg   lhs.low = eq;
180436ac495dSmrg   lhs.high = 0;
180536ac495dSmrg   lhs.overflow = false;
180636ac495dSmrg   lhs.unsignedp = false;
180736ac495dSmrg   return lhs;
180836ac495dSmrg }
180936ac495dSmrg 
181036ac495dSmrg /* Shift NUM, of width PRECISION, right by N bits.  */
181136ac495dSmrg static cpp_num
num_rshift(cpp_num num,size_t precision,size_t n)181236ac495dSmrg num_rshift (cpp_num num, size_t precision, size_t n)
181336ac495dSmrg {
181436ac495dSmrg   cpp_num_part sign_mask;
181536ac495dSmrg   bool x = num_positive (num, precision);
181636ac495dSmrg 
181736ac495dSmrg   if (num.unsignedp || x)
181836ac495dSmrg     sign_mask = 0;
181936ac495dSmrg   else
182036ac495dSmrg     sign_mask = ~(cpp_num_part) 0;
182136ac495dSmrg 
182236ac495dSmrg   if (n >= precision)
182336ac495dSmrg     num.high = num.low = sign_mask;
182436ac495dSmrg   else
182536ac495dSmrg     {
182636ac495dSmrg       /* Sign-extend.  */
182736ac495dSmrg       if (precision < PART_PRECISION)
182836ac495dSmrg 	num.high = sign_mask, num.low |= sign_mask << precision;
182936ac495dSmrg       else if (precision < 2 * PART_PRECISION)
183036ac495dSmrg 	num.high |= sign_mask << (precision - PART_PRECISION);
183136ac495dSmrg 
183236ac495dSmrg       if (n >= PART_PRECISION)
183336ac495dSmrg 	{
183436ac495dSmrg 	  n -= PART_PRECISION;
183536ac495dSmrg 	  num.low = num.high;
183636ac495dSmrg 	  num.high = sign_mask;
183736ac495dSmrg 	}
183836ac495dSmrg 
183936ac495dSmrg       if (n)
184036ac495dSmrg 	{
184136ac495dSmrg 	  num.low = (num.low >> n) | (num.high << (PART_PRECISION - n));
184236ac495dSmrg 	  num.high = (num.high >> n) | (sign_mask << (PART_PRECISION - n));
184336ac495dSmrg 	}
184436ac495dSmrg     }
184536ac495dSmrg 
184636ac495dSmrg   num = num_trim (num, precision);
184736ac495dSmrg   num.overflow = false;
184836ac495dSmrg   return num;
184936ac495dSmrg }
185036ac495dSmrg 
185136ac495dSmrg /* Shift NUM, of width PRECISION, left by N bits.  */
185236ac495dSmrg static cpp_num
num_lshift(cpp_num num,size_t precision,size_t n)185336ac495dSmrg num_lshift (cpp_num num, size_t precision, size_t n)
185436ac495dSmrg {
185536ac495dSmrg   if (n >= precision)
185636ac495dSmrg     {
185736ac495dSmrg       num.overflow = !num.unsignedp && !num_zerop (num);
185836ac495dSmrg       num.high = num.low = 0;
185936ac495dSmrg     }
186036ac495dSmrg   else
186136ac495dSmrg     {
186236ac495dSmrg       cpp_num orig, maybe_orig;
186336ac495dSmrg       size_t m = n;
186436ac495dSmrg 
186536ac495dSmrg       orig = num;
186636ac495dSmrg       if (m >= PART_PRECISION)
186736ac495dSmrg 	{
186836ac495dSmrg 	  m -= PART_PRECISION;
186936ac495dSmrg 	  num.high = num.low;
187036ac495dSmrg 	  num.low = 0;
187136ac495dSmrg 	}
187236ac495dSmrg       if (m)
187336ac495dSmrg 	{
187436ac495dSmrg 	  num.high = (num.high << m) | (num.low >> (PART_PRECISION - m));
187536ac495dSmrg 	  num.low <<= m;
187636ac495dSmrg 	}
187736ac495dSmrg       num = num_trim (num, precision);
187836ac495dSmrg 
187936ac495dSmrg       if (num.unsignedp)
188036ac495dSmrg 	num.overflow = false;
188136ac495dSmrg       else
188236ac495dSmrg 	{
188336ac495dSmrg 	  maybe_orig = num_rshift (num, precision, n);
188436ac495dSmrg 	  num.overflow = !num_eq (orig, maybe_orig);
188536ac495dSmrg 	}
188636ac495dSmrg     }
188736ac495dSmrg 
188836ac495dSmrg   return num;
188936ac495dSmrg }
189036ac495dSmrg 
189136ac495dSmrg /* The four unary operators: +, -, ! and ~.  */
189236ac495dSmrg static cpp_num
num_unary_op(cpp_reader * pfile,cpp_num num,enum cpp_ttype op)189336ac495dSmrg num_unary_op (cpp_reader *pfile, cpp_num num, enum cpp_ttype op)
189436ac495dSmrg {
189536ac495dSmrg   switch (op)
189636ac495dSmrg     {
189736ac495dSmrg     case CPP_UPLUS:
189836ac495dSmrg       if (CPP_WTRADITIONAL (pfile) && !pfile->state.skip_eval)
189936ac495dSmrg 	cpp_warning (pfile, CPP_W_TRADITIONAL,
190036ac495dSmrg 		     "traditional C rejects the unary plus operator");
190136ac495dSmrg       num.overflow = false;
190236ac495dSmrg       break;
190336ac495dSmrg 
190436ac495dSmrg     case CPP_UMINUS:
190536ac495dSmrg       num = num_negate (num, CPP_OPTION (pfile, precision));
190636ac495dSmrg       break;
190736ac495dSmrg 
190836ac495dSmrg     case CPP_COMPL:
190936ac495dSmrg       num.high = ~num.high;
191036ac495dSmrg       num.low = ~num.low;
191136ac495dSmrg       num = num_trim (num, CPP_OPTION (pfile, precision));
191236ac495dSmrg       num.overflow = false;
191336ac495dSmrg       break;
191436ac495dSmrg 
191536ac495dSmrg     default: /* case CPP_NOT: */
191636ac495dSmrg       num.low = num_zerop (num);
191736ac495dSmrg       num.high = 0;
191836ac495dSmrg       num.overflow = false;
191936ac495dSmrg       num.unsignedp = false;
192036ac495dSmrg       break;
192136ac495dSmrg     }
192236ac495dSmrg 
192336ac495dSmrg   return num;
192436ac495dSmrg }
192536ac495dSmrg 
192636ac495dSmrg /* The various binary operators.  */
192736ac495dSmrg static cpp_num
num_binary_op(cpp_reader * pfile,cpp_num lhs,cpp_num rhs,enum cpp_ttype op)192836ac495dSmrg num_binary_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
192936ac495dSmrg {
193036ac495dSmrg   cpp_num result;
193136ac495dSmrg   size_t precision = CPP_OPTION (pfile, precision);
193236ac495dSmrg   size_t n;
193336ac495dSmrg 
193436ac495dSmrg   switch (op)
193536ac495dSmrg     {
193636ac495dSmrg       /* Shifts.  */
193736ac495dSmrg     case CPP_LSHIFT:
193836ac495dSmrg     case CPP_RSHIFT:
193936ac495dSmrg       if (!rhs.unsignedp && !num_positive (rhs, precision))
194036ac495dSmrg 	{
194136ac495dSmrg 	  /* A negative shift is a positive shift the other way.  */
194236ac495dSmrg 	  if (op == CPP_LSHIFT)
194336ac495dSmrg 	    op = CPP_RSHIFT;
194436ac495dSmrg 	  else
194536ac495dSmrg 	    op = CPP_LSHIFT;
194636ac495dSmrg 	  rhs = num_negate (rhs, precision);
194736ac495dSmrg 	}
194836ac495dSmrg       if (rhs.high)
194936ac495dSmrg 	n = ~0;			/* Maximal.  */
195036ac495dSmrg       else
195136ac495dSmrg 	n = rhs.low;
195236ac495dSmrg       if (op == CPP_LSHIFT)
195336ac495dSmrg 	lhs = num_lshift (lhs, precision, n);
195436ac495dSmrg       else
195536ac495dSmrg 	lhs = num_rshift (lhs, precision, n);
195636ac495dSmrg       break;
195736ac495dSmrg 
195836ac495dSmrg       /* Arithmetic.  */
195936ac495dSmrg     case CPP_MINUS:
196036ac495dSmrg       result.low = lhs.low - rhs.low;
196136ac495dSmrg       result.high = lhs.high - rhs.high;
196236ac495dSmrg       if (result.low > lhs.low)
196336ac495dSmrg 	result.high--;
196436ac495dSmrg       result.unsignedp = lhs.unsignedp || rhs.unsignedp;
196536ac495dSmrg       result.overflow = false;
196636ac495dSmrg 
196736ac495dSmrg       result = num_trim (result, precision);
196836ac495dSmrg       if (!result.unsignedp)
196936ac495dSmrg 	{
197036ac495dSmrg 	  bool lhsp = num_positive (lhs, precision);
197136ac495dSmrg 	  result.overflow = (lhsp != num_positive (rhs, precision)
197236ac495dSmrg 			     && lhsp != num_positive (result, precision));
197336ac495dSmrg 	}
197436ac495dSmrg       return result;
197536ac495dSmrg 
197636ac495dSmrg     case CPP_PLUS:
197736ac495dSmrg       result.low = lhs.low + rhs.low;
197836ac495dSmrg       result.high = lhs.high + rhs.high;
197936ac495dSmrg       if (result.low < lhs.low)
198036ac495dSmrg 	result.high++;
198136ac495dSmrg       result.unsignedp = lhs.unsignedp || rhs.unsignedp;
198236ac495dSmrg       result.overflow = false;
198336ac495dSmrg 
198436ac495dSmrg       result = num_trim (result, precision);
198536ac495dSmrg       if (!result.unsignedp)
198636ac495dSmrg 	{
198736ac495dSmrg 	  bool lhsp = num_positive (lhs, precision);
198836ac495dSmrg 	  result.overflow = (lhsp == num_positive (rhs, precision)
198936ac495dSmrg 			     && lhsp != num_positive (result, precision));
199036ac495dSmrg 	}
199136ac495dSmrg       return result;
199236ac495dSmrg 
199336ac495dSmrg       /* Comma.  */
199436ac495dSmrg     default: /* case CPP_COMMA: */
199536ac495dSmrg       if (CPP_PEDANTIC (pfile) && (!CPP_OPTION (pfile, c99)
199636ac495dSmrg 				   || !pfile->state.skip_eval))
199736ac495dSmrg 	cpp_pedwarning (pfile, CPP_W_PEDANTIC,
199836ac495dSmrg 			"comma operator in operand of #if");
199936ac495dSmrg       lhs = rhs;
200036ac495dSmrg       break;
200136ac495dSmrg     }
200236ac495dSmrg 
200336ac495dSmrg   return lhs;
200436ac495dSmrg }
200536ac495dSmrg 
200636ac495dSmrg /* Multiplies two unsigned cpp_num_parts to give a cpp_num.  This
200736ac495dSmrg    cannot overflow.  */
200836ac495dSmrg static cpp_num
num_part_mul(cpp_num_part lhs,cpp_num_part rhs)200936ac495dSmrg num_part_mul (cpp_num_part lhs, cpp_num_part rhs)
201036ac495dSmrg {
201136ac495dSmrg   cpp_num result;
201236ac495dSmrg   cpp_num_part middle[2], temp;
201336ac495dSmrg 
201436ac495dSmrg   result.low = LOW_PART (lhs) * LOW_PART (rhs);
201536ac495dSmrg   result.high = HIGH_PART (lhs) * HIGH_PART (rhs);
201636ac495dSmrg 
201736ac495dSmrg   middle[0] = LOW_PART (lhs) * HIGH_PART (rhs);
201836ac495dSmrg   middle[1] = HIGH_PART (lhs) * LOW_PART (rhs);
201936ac495dSmrg 
202036ac495dSmrg   temp = result.low;
202136ac495dSmrg   result.low += LOW_PART (middle[0]) << (PART_PRECISION / 2);
202236ac495dSmrg   if (result.low < temp)
202336ac495dSmrg     result.high++;
202436ac495dSmrg 
202536ac495dSmrg   temp = result.low;
202636ac495dSmrg   result.low += LOW_PART (middle[1]) << (PART_PRECISION / 2);
202736ac495dSmrg   if (result.low < temp)
202836ac495dSmrg     result.high++;
202936ac495dSmrg 
203036ac495dSmrg   result.high += HIGH_PART (middle[0]);
203136ac495dSmrg   result.high += HIGH_PART (middle[1]);
203236ac495dSmrg   result.unsignedp = true;
203336ac495dSmrg   result.overflow = false;
203436ac495dSmrg 
203536ac495dSmrg   return result;
203636ac495dSmrg }
203736ac495dSmrg 
203836ac495dSmrg /* Multiply two preprocessing numbers.  */
203936ac495dSmrg static cpp_num
num_mul(cpp_reader * pfile,cpp_num lhs,cpp_num rhs)204036ac495dSmrg num_mul (cpp_reader *pfile, cpp_num lhs, cpp_num rhs)
204136ac495dSmrg {
204236ac495dSmrg   cpp_num result, temp;
204336ac495dSmrg   bool unsignedp = lhs.unsignedp || rhs.unsignedp;
204436ac495dSmrg   bool overflow, negate = false;
204536ac495dSmrg   size_t precision = CPP_OPTION (pfile, precision);
204636ac495dSmrg 
204736ac495dSmrg   /* Prepare for unsigned multiplication.  */
204836ac495dSmrg   if (!unsignedp)
204936ac495dSmrg     {
205036ac495dSmrg       if (!num_positive (lhs, precision))
205136ac495dSmrg 	negate = !negate, lhs = num_negate (lhs, precision);
205236ac495dSmrg       if (!num_positive (rhs, precision))
205336ac495dSmrg 	negate = !negate, rhs = num_negate (rhs, precision);
205436ac495dSmrg     }
205536ac495dSmrg 
205636ac495dSmrg   overflow = lhs.high && rhs.high;
205736ac495dSmrg   result = num_part_mul (lhs.low, rhs.low);
205836ac495dSmrg 
205936ac495dSmrg   temp = num_part_mul (lhs.high, rhs.low);
206036ac495dSmrg   result.high += temp.low;
206136ac495dSmrg   if (temp.high)
206236ac495dSmrg     overflow = true;
206336ac495dSmrg 
206436ac495dSmrg   temp = num_part_mul (lhs.low, rhs.high);
206536ac495dSmrg   result.high += temp.low;
206636ac495dSmrg   if (temp.high)
206736ac495dSmrg     overflow = true;
206836ac495dSmrg 
206936ac495dSmrg   temp.low = result.low, temp.high = result.high;
207036ac495dSmrg   result = num_trim (result, precision);
207136ac495dSmrg   if (!num_eq (result, temp))
207236ac495dSmrg     overflow = true;
207336ac495dSmrg 
207436ac495dSmrg   if (negate)
207536ac495dSmrg     result = num_negate (result, precision);
207636ac495dSmrg 
207736ac495dSmrg   if (unsignedp)
207836ac495dSmrg     result.overflow = false;
207936ac495dSmrg   else
208036ac495dSmrg     result.overflow = overflow || (num_positive (result, precision) ^ !negate
208136ac495dSmrg 				   && !num_zerop (result));
208236ac495dSmrg   result.unsignedp = unsignedp;
208336ac495dSmrg 
208436ac495dSmrg   return result;
208536ac495dSmrg }
208636ac495dSmrg 
208736ac495dSmrg /* Divide two preprocessing numbers, LHS and RHS, returning the answer
208836ac495dSmrg    or the remainder depending upon OP. LOCATION is the source location
208936ac495dSmrg    of this operator (for diagnostics).  */
209036ac495dSmrg 
209136ac495dSmrg static cpp_num
num_div_op(cpp_reader * pfile,cpp_num lhs,cpp_num rhs,enum cpp_ttype op,location_t location)209236ac495dSmrg num_div_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op,
2093c0a68be4Smrg 	    location_t location)
209436ac495dSmrg {
209536ac495dSmrg   cpp_num result, sub;
209636ac495dSmrg   cpp_num_part mask;
209736ac495dSmrg   bool unsignedp = lhs.unsignedp || rhs.unsignedp;
209836ac495dSmrg   bool negate = false, lhs_neg = false;
209936ac495dSmrg   size_t i, precision = CPP_OPTION (pfile, precision);
210036ac495dSmrg 
210136ac495dSmrg   /* Prepare for unsigned division.  */
210236ac495dSmrg   if (!unsignedp)
210336ac495dSmrg     {
210436ac495dSmrg       if (!num_positive (lhs, precision))
210536ac495dSmrg 	negate = !negate, lhs_neg = true, lhs = num_negate (lhs, precision);
210636ac495dSmrg       if (!num_positive (rhs, precision))
210736ac495dSmrg 	negate = !negate, rhs = num_negate (rhs, precision);
210836ac495dSmrg     }
210936ac495dSmrg 
211036ac495dSmrg   /* Find the high bit.  */
211136ac495dSmrg   if (rhs.high)
211236ac495dSmrg     {
211336ac495dSmrg       i = precision - 1;
211436ac495dSmrg       mask = (cpp_num_part) 1 << (i - PART_PRECISION);
211536ac495dSmrg       for (; ; i--, mask >>= 1)
211636ac495dSmrg 	if (rhs.high & mask)
211736ac495dSmrg 	  break;
211836ac495dSmrg     }
211936ac495dSmrg   else if (rhs.low)
212036ac495dSmrg     {
212136ac495dSmrg       if (precision > PART_PRECISION)
212236ac495dSmrg 	i = precision - PART_PRECISION - 1;
212336ac495dSmrg       else
212436ac495dSmrg 	i = precision - 1;
212536ac495dSmrg       mask = (cpp_num_part) 1 << i;
212636ac495dSmrg       for (; ; i--, mask >>= 1)
212736ac495dSmrg 	if (rhs.low & mask)
212836ac495dSmrg 	  break;
212936ac495dSmrg     }
213036ac495dSmrg   else
213136ac495dSmrg     {
213236ac495dSmrg       if (!pfile->state.skip_eval)
213336ac495dSmrg 	cpp_error_with_line (pfile, CPP_DL_ERROR, location, 0,
213436ac495dSmrg 			     "division by zero in #if");
213536ac495dSmrg       return lhs;
213636ac495dSmrg     }
213736ac495dSmrg 
213836ac495dSmrg   /* First nonzero bit of RHS is bit I.  Do naive division by
213936ac495dSmrg      shifting the RHS fully left, and subtracting from LHS if LHS is
214036ac495dSmrg      at least as big, and then repeating but with one less shift.
214136ac495dSmrg      This is not very efficient, but is easy to understand.  */
214236ac495dSmrg 
214336ac495dSmrg   rhs.unsignedp = true;
214436ac495dSmrg   lhs.unsignedp = true;
214536ac495dSmrg   i = precision - i - 1;
214636ac495dSmrg   sub = num_lshift (rhs, precision, i);
214736ac495dSmrg 
214836ac495dSmrg   result.high = result.low = 0;
214936ac495dSmrg   for (;;)
215036ac495dSmrg     {
215136ac495dSmrg       if (num_greater_eq (lhs, sub, precision))
215236ac495dSmrg 	{
215336ac495dSmrg 	  lhs = num_binary_op (pfile, lhs, sub, CPP_MINUS);
215436ac495dSmrg 	  if (i >= PART_PRECISION)
215536ac495dSmrg 	    result.high |= (cpp_num_part) 1 << (i - PART_PRECISION);
215636ac495dSmrg 	  else
215736ac495dSmrg 	    result.low |= (cpp_num_part) 1 << i;
215836ac495dSmrg 	}
215936ac495dSmrg       if (i-- == 0)
216036ac495dSmrg 	break;
216136ac495dSmrg       sub.low = (sub.low >> 1) | (sub.high << (PART_PRECISION - 1));
216236ac495dSmrg       sub.high >>= 1;
216336ac495dSmrg     }
216436ac495dSmrg 
216536ac495dSmrg   /* We divide so that the remainder has the sign of the LHS.  */
216636ac495dSmrg   if (op == CPP_DIV)
216736ac495dSmrg     {
216836ac495dSmrg       result.unsignedp = unsignedp;
216936ac495dSmrg       result.overflow = false;
217036ac495dSmrg       if (!unsignedp)
217136ac495dSmrg 	{
217236ac495dSmrg 	  if (negate)
217336ac495dSmrg 	    result = num_negate (result, precision);
217436ac495dSmrg 	  result.overflow = (num_positive (result, precision) ^ !negate
217536ac495dSmrg 			     && !num_zerop (result));
217636ac495dSmrg 	}
217736ac495dSmrg 
217836ac495dSmrg       return result;
217936ac495dSmrg     }
218036ac495dSmrg 
218136ac495dSmrg   /* CPP_MOD.  */
218236ac495dSmrg   lhs.unsignedp = unsignedp;
218336ac495dSmrg   lhs.overflow = false;
218436ac495dSmrg   if (lhs_neg)
218536ac495dSmrg     lhs = num_negate (lhs, precision);
218636ac495dSmrg 
218736ac495dSmrg   return lhs;
218836ac495dSmrg }
218936ac495dSmrg 
2190