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