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