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