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