1 /* Parse C expressions for cpplib.
2 Copyright (C) 1987, 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2001,
3 2002, 2004 Free Software Foundation.
4 Contributed by Per Bothner, 1994.
6 This program is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
26 #define PART_PRECISION (sizeof (cpp_num_part) * CHAR_BIT)
27 #define HALF_MASK (~(cpp_num_part) 0 >> (PART_PRECISION / 2))
28 #define LOW_PART(num_part) (num_part & HALF_MASK)
29 #define HIGH_PART(num_part) (num_part >> (PART_PRECISION / 2))
33 const cpp_token
*token
; /* The token forming op (for diagnostics). */
34 cpp_num value
; /* The value logically "right" of op. */
38 /* Some simple utility routines on double integers. */
39 #define num_zerop(num) ((num.low | num.high) == 0)
40 #define num_eq(num1, num2) (num1.low == num2.low && num1.high == num2.high)
41 static bool num_positive (cpp_num
, size_t);
42 static bool num_greater_eq (cpp_num
, cpp_num
, size_t);
43 static cpp_num
num_trim (cpp_num
, size_t);
44 static cpp_num
num_part_mul (cpp_num_part
, cpp_num_part
);
46 static cpp_num
num_unary_op (cpp_reader
*, cpp_num
, enum cpp_ttype
);
47 static cpp_num
num_binary_op (cpp_reader
*, cpp_num
, cpp_num
, enum cpp_ttype
);
48 static cpp_num
num_negate (cpp_num
, size_t);
49 static cpp_num
num_bitwise_op (cpp_reader
*, cpp_num
, cpp_num
, enum cpp_ttype
);
50 static cpp_num
num_inequality_op (cpp_reader
*, cpp_num
, cpp_num
,
52 static cpp_num
num_equality_op (cpp_reader
*, cpp_num
, cpp_num
,
54 static cpp_num
num_mul (cpp_reader
*, cpp_num
, cpp_num
);
55 static cpp_num
num_div_op (cpp_reader
*, cpp_num
, cpp_num
, enum cpp_ttype
);
56 static cpp_num
num_lshift (cpp_num
, size_t, size_t);
57 static cpp_num
num_rshift (cpp_num
, size_t, size_t);
59 static cpp_num
append_digit (cpp_num
, int, int, size_t);
60 static cpp_num
parse_defined (cpp_reader
*);
61 static cpp_num
eval_token (cpp_reader
*, const cpp_token
*);
62 static struct op
*reduce (cpp_reader
*, struct op
*, enum cpp_ttype
);
63 static unsigned int interpret_float_suffix (const uchar
*, size_t);
64 static unsigned int interpret_int_suffix (const uchar
*, size_t);
65 static void check_promotion (cpp_reader
*, const struct op
*);
67 /* Token type abuse to create unary plus and minus operators. */
68 #define CPP_UPLUS (CPP_LAST_CPP_OP + 1)
69 #define CPP_UMINUS (CPP_LAST_CPP_OP + 2)
71 /* With -O2, gcc appears to produce nice code, moving the error
72 message load and subsequent jump completely out of the main path. */
73 #define SYNTAX_ERROR(msgid) \
74 do { cpp_error (pfile, CPP_DL_ERROR, msgid); goto syntax_error; } while(0)
75 #define SYNTAX_ERROR2(msgid, arg) \
76 do { cpp_error (pfile, CPP_DL_ERROR, msgid, arg); goto syntax_error; } \
79 /* Subroutine of cpp_classify_number. S points to a float suffix of
80 length LEN, possibly zero. Returns 0 for an invalid suffix, or a
81 flag vector describing the suffix. */
83 interpret_float_suffix (const uchar
*s
, size_t len
)
85 size_t f
= 0, l
= 0, i
= 0;
90 case 'f': case 'F': f
++; break;
91 case 'l': case 'L': l
++; break;
93 case 'j': case 'J': i
++; break;
98 if (f
+ l
> 1 || i
> 1)
101 return ((i
? CPP_N_IMAGINARY
: 0)
103 l
? CPP_N_LARGE
: CPP_N_MEDIUM
));
106 /* Subroutine of cpp_classify_number. S points to an integer suffix
107 of length LEN, possibly zero. Returns 0 for an invalid suffix, or a
108 flag vector describing the suffix. */
110 interpret_int_suffix (const uchar
*s
, size_t len
)
119 case 'u': case 'U': u
++; break;
121 case 'j': case 'J': i
++; break;
122 case 'l': case 'L': l
++;
123 /* If there are two Ls, they must be adjacent and the same case. */
124 if (l
== 2 && s
[len
] != s
[len
+ 1])
131 if (l
> 2 || u
> 1 || i
> 1)
134 return ((i
? CPP_N_IMAGINARY
: 0)
135 | (u
? CPP_N_UNSIGNED
: 0)
136 | ((l
== 0) ? CPP_N_SMALL
137 : (l
== 1) ? CPP_N_MEDIUM
: CPP_N_LARGE
));
140 /* Categorize numeric constants according to their field (integer,
141 floating point, or invalid), radix (decimal, octal, hexadecimal),
142 and type suffixes. */
144 cpp_classify_number (cpp_reader
*pfile
, const cpp_token
*token
)
146 const uchar
*str
= token
->val
.str
.text
;
148 unsigned int max_digit
, result
, radix
;
149 enum {NOT_FLOAT
= 0, AFTER_POINT
, AFTER_EXPON
} float_flag
;
151 /* If the lexer has done its job, length one can only be a single
152 digit. Fast-path this very common case. */
153 if (token
->val
.str
.len
== 1)
154 return CPP_N_INTEGER
| CPP_N_SMALL
| CPP_N_DECIMAL
;
156 limit
= str
+ token
->val
.str
.len
;
157 float_flag
= NOT_FLOAT
;
161 /* First, interpret the radix. */
167 /* Require at least one hex digit to classify it as hex. */
168 if ((*str
== 'x' || *str
== 'X')
169 && (str
[1] == '.' || ISXDIGIT (str
[1])))
176 /* Now scan for a well-formed integer or float. */
179 unsigned int c
= *str
++;
181 if (ISDIGIT (c
) || (ISXDIGIT (c
) && radix
== 16))
189 if (float_flag
== NOT_FLOAT
)
190 float_flag
= AFTER_POINT
;
192 SYNTAX_ERROR ("too many decimal points in number");
194 else if ((radix
<= 10 && (c
== 'e' || c
== 'E'))
195 || (radix
== 16 && (c
== 'p' || c
== 'P')))
197 float_flag
= AFTER_EXPON
;
202 /* Start of suffix. */
208 if (float_flag
!= NOT_FLOAT
&& radix
== 8)
211 if (max_digit
>= radix
)
212 SYNTAX_ERROR2 ("invalid digit \"%c\" in octal constant", '0' + max_digit
);
214 if (float_flag
!= NOT_FLOAT
)
216 if (radix
== 16 && CPP_PEDANTIC (pfile
) && !CPP_OPTION (pfile
, c99
))
217 cpp_error (pfile
, CPP_DL_PEDWARN
,
218 "use of C99 hexadecimal floating constant");
220 if (float_flag
== AFTER_EXPON
)
222 if (*str
== '+' || *str
== '-')
225 /* Exponent is decimal, even if string is a hex float. */
227 SYNTAX_ERROR ("exponent has no digits");
231 while (ISDIGIT (*str
));
233 else if (radix
== 16)
234 SYNTAX_ERROR ("hexadecimal floating constants require an exponent");
236 result
= interpret_float_suffix (str
, limit
- str
);
239 cpp_error (pfile
, CPP_DL_ERROR
,
240 "invalid suffix \"%.*s\" on floating constant",
241 (int) (limit
- str
), str
);
242 return CPP_N_INVALID
;
245 /* Traditional C didn't accept any floating suffixes. */
247 && CPP_WTRADITIONAL (pfile
)
248 && ! cpp_sys_macro_p (pfile
))
249 cpp_error (pfile
, CPP_DL_WARNING
,
250 "traditional C rejects the \"%.*s\" suffix",
251 (int) (limit
- str
), str
);
253 result
|= CPP_N_FLOATING
;
257 result
= interpret_int_suffix (str
, limit
- str
);
260 cpp_error (pfile
, CPP_DL_ERROR
,
261 "invalid suffix \"%.*s\" on integer constant",
262 (int) (limit
- str
), str
);
263 return CPP_N_INVALID
;
266 /* Traditional C only accepted the 'L' suffix.
267 Suppress warning about 'LL' with -Wno-long-long. */
268 if (CPP_WTRADITIONAL (pfile
) && ! cpp_sys_macro_p (pfile
))
270 int u_or_i
= (result
& (CPP_N_UNSIGNED
|CPP_N_IMAGINARY
));
271 int large
= (result
& CPP_N_WIDTH
) == CPP_N_LARGE
;
273 if (u_or_i
|| (large
&& CPP_OPTION (pfile
, warn_long_long
)))
274 cpp_error (pfile
, CPP_DL_WARNING
,
275 "traditional C rejects the \"%.*s\" suffix",
276 (int) (limit
- str
), str
);
279 if ((result
& CPP_N_WIDTH
) == CPP_N_LARGE
280 && ! CPP_OPTION (pfile
, c99
)
281 && CPP_OPTION (pfile
, warn_long_long
))
282 cpp_error (pfile
, CPP_DL_PEDWARN
,
283 "use of C99 long long integer constant");
285 result
|= CPP_N_INTEGER
;
288 if ((result
& CPP_N_IMAGINARY
) && CPP_PEDANTIC (pfile
))
289 cpp_error (pfile
, CPP_DL_PEDWARN
,
290 "imaginary constants are a GCC extension");
293 result
|= CPP_N_DECIMAL
;
294 else if (radix
== 16)
297 result
|= CPP_N_OCTAL
;
302 return CPP_N_INVALID
;
305 /* cpp_interpret_integer converts an integer constant into a cpp_num,
306 of precision options->precision.
308 We do not provide any interface for decimal->float conversion,
309 because the preprocessor doesn't need it and we don't want to
310 drag in GCC's floating point emulator. */
312 cpp_interpret_integer (cpp_reader
*pfile
, const cpp_token
*token
,
315 const uchar
*p
, *end
;
320 result
.unsignedp
= !!(type
& CPP_N_UNSIGNED
);
321 result
.overflow
= false;
323 p
= token
->val
.str
.text
;
324 end
= p
+ token
->val
.str
.len
;
326 /* Common case of a single digit. */
327 if (token
->val
.str
.len
== 1)
328 result
.low
= p
[0] - '0';
332 size_t precision
= CPP_OPTION (pfile
, precision
);
333 unsigned int base
= 10, c
= 0;
334 bool overflow
= false;
336 if ((type
& CPP_N_RADIX
) == CPP_N_OCTAL
)
341 else if ((type
& CPP_N_RADIX
) == CPP_N_HEX
)
347 /* We can add a digit to numbers strictly less than this without
348 needing the precision and slowness of double integers. */
349 max
= ~(cpp_num_part
) 0;
350 if (precision
< PART_PRECISION
)
351 max
>>= PART_PRECISION
- precision
;
352 max
= (max
- base
+ 1) / base
+ 1;
358 if (ISDIGIT (c
) || (base
== 16 && ISXDIGIT (c
)))
363 /* Strict inequality for when max is set to zero. */
364 if (result
.low
< max
)
365 result
.low
= result
.low
* base
+ c
;
368 result
= append_digit (result
, c
, base
, precision
);
369 overflow
|= result
.overflow
;
375 cpp_error (pfile
, CPP_DL_PEDWARN
,
376 "integer constant is too large for its type");
377 /* If too big to be signed, consider it unsigned. Only warn for
378 decimal numbers. Traditional numbers were always signed (but
379 we still honor an explicit U suffix); but we only have
380 traditional semantics in directives. */
381 else if (!result
.unsignedp
382 && !(CPP_OPTION (pfile
, traditional
)
383 && pfile
->state
.in_directive
)
384 && !num_positive (result
, precision
))
387 cpp_error (pfile
, CPP_DL_WARNING
,
388 "integer constant is so large that it is unsigned");
389 result
.unsignedp
= true;
396 /* Append DIGIT to NUM, a number of PRECISION bits being read in base BASE. */
398 append_digit (cpp_num num
, int digit
, int base
, size_t precision
)
401 unsigned int shift
= 3 + (base
== 16);
403 cpp_num_part add_high
, add_low
;
405 /* Multiply by 8 or 16. Catching this overflow here means we don't
406 need to worry about add_high overflowing. */
407 overflow
= !!(num
.high
>> (PART_PRECISION
- shift
));
408 result
.high
= num
.high
<< shift
;
409 result
.low
= num
.low
<< shift
;
410 result
.high
|= num
.low
>> (PART_PRECISION
- shift
);
411 result
.unsignedp
= num
.unsignedp
;
415 add_low
= num
.low
<< 1;
416 add_high
= (num
.high
<< 1) + (num
.low
>> (PART_PRECISION
- 1));
419 add_high
= add_low
= 0;
421 if (add_low
+ digit
< add_low
)
425 if (result
.low
+ add_low
< result
.low
)
427 if (result
.high
+ add_high
< result
.high
)
430 result
.low
+= add_low
;
431 result
.high
+= add_high
;
432 result
.overflow
= overflow
;
434 /* The above code catches overflow of a cpp_num type. This catches
435 overflow of the (possibly shorter) target precision. */
436 num
.low
= result
.low
;
437 num
.high
= result
.high
;
438 result
= num_trim (result
, precision
);
439 if (!num_eq (result
, num
))
440 result
.overflow
= true;
445 /* Handle meeting "defined" in a preprocessor expression. */
447 parse_defined (cpp_reader
*pfile
)
451 cpp_hashnode
*node
= 0;
452 const cpp_token
*token
;
453 cpp_context
*initial_context
= pfile
->context
;
455 /* Don't expand macros. */
456 pfile
->state
.prevent_expansion
++;
458 token
= cpp_get_token (pfile
);
459 if (token
->type
== CPP_OPEN_PAREN
)
462 token
= cpp_get_token (pfile
);
465 if (token
->type
== CPP_NAME
)
467 node
= token
->val
.node
;
468 if (paren
&& cpp_get_token (pfile
)->type
!= CPP_CLOSE_PAREN
)
470 cpp_error (pfile
, CPP_DL_ERROR
, "missing ')' after \"defined\"");
476 cpp_error (pfile
, CPP_DL_ERROR
,
477 "operator \"defined\" requires an identifier");
478 if (token
->flags
& NAMED_OP
)
483 op
.type
= token
->type
;
484 cpp_error (pfile
, CPP_DL_ERROR
,
485 "(\"%s\" is an alternative token for \"%s\" in C++)",
486 cpp_token_as_text (pfile
, token
),
487 cpp_token_as_text (pfile
, &op
));
493 if (pfile
->context
!= initial_context
&& CPP_PEDANTIC (pfile
))
494 cpp_error (pfile
, CPP_DL_WARNING
,
495 "this use of \"defined\" may not be portable");
497 _cpp_mark_macro_used (node
);
499 /* A possible controlling macro of the form #if !defined ().
500 _cpp_parse_expr checks there was no other junk on the line. */
501 pfile
->mi_ind_cmacro
= node
;
504 pfile
->state
.prevent_expansion
--;
506 result
.unsignedp
= false;
508 result
.overflow
= false;
509 result
.low
= node
&& node
->type
== NT_MACRO
;
513 /* Convert a token into a CPP_NUMBER (an interpreted preprocessing
514 number or character constant, or the result of the "defined" or "#"
517 eval_token (cpp_reader
*pfile
, const cpp_token
*token
)
523 result
.unsignedp
= false;
524 result
.overflow
= false;
529 temp
= cpp_classify_number (pfile
, token
);
530 switch (temp
& CPP_N_CATEGORY
)
533 cpp_error (pfile
, CPP_DL_ERROR
,
534 "floating constant in preprocessor expression");
537 if (!(temp
& CPP_N_IMAGINARY
))
538 return cpp_interpret_integer (pfile
, token
, temp
);
539 cpp_error (pfile
, CPP_DL_ERROR
,
540 "imaginary number in preprocessor expression");
544 /* Error already issued. */
547 result
.high
= result
.low
= 0;
553 cppchar_t cc
= cpp_interpret_charconst (pfile
, token
,
558 /* Sign-extend the result if necessary. */
559 if (!unsignedp
&& (cppchar_signed_t
) cc
< 0)
561 if (PART_PRECISION
> BITS_PER_CPPCHAR_T
)
562 result
.low
|= ~(~(cpp_num_part
) 0
563 >> (PART_PRECISION
- BITS_PER_CPPCHAR_T
));
564 result
.high
= ~(cpp_num_part
) 0;
565 result
= num_trim (result
, CPP_OPTION (pfile
, precision
));
571 if (token
->val
.node
== pfile
->spec_nodes
.n_defined
)
572 return parse_defined (pfile
);
573 else if (CPP_OPTION (pfile
, cplusplus
)
574 && (token
->val
.node
== pfile
->spec_nodes
.n_true
575 || token
->val
.node
== pfile
->spec_nodes
.n_false
))
578 result
.low
= (token
->val
.node
== pfile
->spec_nodes
.n_true
);
584 if (CPP_OPTION (pfile
, warn_undef
) && !pfile
->state
.skip_eval
)
585 cpp_error (pfile
, CPP_DL_WARNING
, "\"%s\" is not defined",
586 NODE_NAME (token
->val
.node
));
590 default: /* CPP_HASH */
591 _cpp_test_assertion (pfile
, &temp
);
596 result
.unsignedp
= !!unsignedp
;
600 /* Operator precedence and flags table.
602 After an operator is returned from the lexer, if it has priority less
603 than the operator on the top of the stack, we reduce the stack by one
604 operator and repeat the test. Since equal priorities do not reduce,
605 this is naturally right-associative.
607 We handle left-associative operators by decrementing the priority of
608 just-lexed operators by one, but retaining the priority of operators
609 already on the stack.
611 The remaining cases are '(' and ')'. We handle '(' by skipping the
612 reduction phase completely. ')' is given lower priority than
613 everything else, including '(', effectively forcing a reduction of the
614 parenthesized expression. If there is a matching '(', the routine
615 reduce() exits immediately. If the normal exit route sees a ')', then
616 there cannot have been a matching '(' and an error message is output.
618 The parser assumes all shifted operators require a left operand unless
619 the flag NO_L_OPERAND is set. These semantics are automatic; any
620 extra semantics need to be handled with operator-specific code. */
622 /* Flags. If CHECK_PROMOTION, we warn if the effective sign of an
623 operand changes because of integer promotions. */
624 #define NO_L_OPERAND (1 << 0)
625 #define LEFT_ASSOC (1 << 1)
626 #define CHECK_PROMOTION (1 << 2)
628 /* Operator to priority map. Must be in the same order as the first
629 N entries of enum cpp_ttype. */
630 static const struct operator
636 /* EQ */ {0, 0}, /* Shouldn't happen. */
637 /* NOT */ {16, NO_L_OPERAND
},
638 /* GREATER */ {12, LEFT_ASSOC
| CHECK_PROMOTION
},
639 /* LESS */ {12, LEFT_ASSOC
| CHECK_PROMOTION
},
640 /* PLUS */ {14, LEFT_ASSOC
| CHECK_PROMOTION
},
641 /* MINUS */ {14, LEFT_ASSOC
| CHECK_PROMOTION
},
642 /* MULT */ {15, LEFT_ASSOC
| CHECK_PROMOTION
},
643 /* DIV */ {15, LEFT_ASSOC
| CHECK_PROMOTION
},
644 /* MOD */ {15, LEFT_ASSOC
| CHECK_PROMOTION
},
645 /* AND */ {9, LEFT_ASSOC
| CHECK_PROMOTION
},
646 /* OR */ {7, LEFT_ASSOC
| CHECK_PROMOTION
},
647 /* XOR */ {8, LEFT_ASSOC
| CHECK_PROMOTION
},
648 /* RSHIFT */ {13, LEFT_ASSOC
},
649 /* LSHIFT */ {13, LEFT_ASSOC
},
651 /* MIN */ {10, LEFT_ASSOC
| CHECK_PROMOTION
},
652 /* MAX */ {10, LEFT_ASSOC
| CHECK_PROMOTION
},
654 /* COMPL */ {16, NO_L_OPERAND
},
655 /* AND_AND */ {6, LEFT_ASSOC
},
656 /* OR_OR */ {5, LEFT_ASSOC
},
658 /* COLON */ {4, LEFT_ASSOC
| CHECK_PROMOTION
},
659 /* COMMA */ {2, LEFT_ASSOC
},
660 /* OPEN_PAREN */ {1, NO_L_OPERAND
},
661 /* CLOSE_PAREN */ {0, 0},
663 /* EQ_EQ */ {11, LEFT_ASSOC
},
664 /* NOT_EQ */ {11, LEFT_ASSOC
},
665 /* GREATER_EQ */ {12, LEFT_ASSOC
| CHECK_PROMOTION
},
666 /* LESS_EQ */ {12, LEFT_ASSOC
| CHECK_PROMOTION
},
667 /* UPLUS */ {16, NO_L_OPERAND
},
668 /* UMINUS */ {16, NO_L_OPERAND
}
671 /* Parse and evaluate a C expression, reading from PFILE.
672 Returns the truth value of the expression.
674 The implementation is an operator precedence parser, i.e. a
675 bottom-up parser, using a stack for not-yet-reduced tokens.
677 The stack base is op_stack, and the current stack pointer is 'top'.
678 There is a stack element for each operator (only), and the most
679 recently pushed operator is 'top->op'. An operand (value) is
680 stored in the 'value' field of the stack element of the operator
683 _cpp_parse_expr (cpp_reader
*pfile
)
685 struct op
*top
= pfile
->op_stack
;
686 unsigned int lex_count
;
687 bool saw_leading_not
, want_value
= true;
689 pfile
->state
.skip_eval
= 0;
691 /* Set up detection of #if ! defined(). */
692 pfile
->mi_ind_cmacro
= 0;
693 saw_leading_not
= false;
696 /* Lowest priority operator prevents further reductions. */
704 op
.token
= cpp_get_token (pfile
);
705 op
.op
= op
.token
->type
;
709 /* These tokens convert into values. */
716 SYNTAX_ERROR2 ("missing binary operator before token \"%s\"",
717 cpp_token_as_text (pfile
, op
.token
));
719 top
->value
= eval_token (pfile
, op
.token
);
723 saw_leading_not
= lex_count
== 1;
735 if ((int) op
.op
<= (int) CPP_EQ
|| (int) op
.op
>= (int) CPP_PLUS_EQ
)
736 SYNTAX_ERROR2 ("token \"%s\" is not valid in preprocessor expressions",
737 cpp_token_as_text (pfile
, op
.token
));
741 /* Check we have a value or operator as appropriate. */
742 if (optab
[op
.op
].flags
& NO_L_OPERAND
)
745 SYNTAX_ERROR2 ("missing binary operator before token \"%s\"",
746 cpp_token_as_text (pfile
, op
.token
));
750 /* Ordering here is subtle and intended to favor the
751 missing parenthesis diagnostics over alternatives. */
752 if (op
.op
== CPP_CLOSE_PAREN
)
754 if (top
->op
== CPP_OPEN_PAREN
)
755 SYNTAX_ERROR ("void expression between '(' and ')'");
757 else if (top
->op
== CPP_EOF
)
758 SYNTAX_ERROR ("#if with no expression");
759 if (top
->op
!= CPP_EOF
&& top
->op
!= CPP_OPEN_PAREN
)
760 SYNTAX_ERROR2 ("operator '%s' has no right operand",
761 cpp_token_as_text (pfile
, top
->token
));
764 top
= reduce (pfile
, top
, op
.op
);
768 if (op
.op
== CPP_EOF
)
773 case CPP_CLOSE_PAREN
:
776 if (!num_zerop (top
->value
))
777 pfile
->state
.skip_eval
++;
781 if (num_zerop (top
->value
))
782 pfile
->state
.skip_eval
++;
785 if (top
->op
!= CPP_QUERY
)
786 SYNTAX_ERROR (" ':' without preceding '?'");
787 if (!num_zerop (top
[-1].value
)) /* Was '?' condition true? */
788 pfile
->state
.skip_eval
++;
790 pfile
->state
.skip_eval
--;
797 /* Check for and handle stack overflow. */
798 if (++top
== pfile
->op_limit
)
799 top
= _cpp_expand_op_stack (pfile
);
802 top
->token
= op
.token
;
805 /* The controlling macro expression is only valid if we called lex 3
806 times: <!> <defined expression> and <EOF>. push_conditional ()
807 checks that we are at top-of-file. */
808 if (pfile
->mi_ind_cmacro
&& !(saw_leading_not
&& lex_count
== 3))
809 pfile
->mi_ind_cmacro
= 0;
811 if (top
!= pfile
->op_stack
)
813 cpp_error (pfile
, CPP_DL_ICE
, "unbalanced stack in #if");
815 return false; /* Return false on syntax error. */
818 return !num_zerop (top
->value
);
821 /* Reduce the operator / value stack if possible, in preparation for
822 pushing operator OP. Returns NULL on error, otherwise the top of
825 reduce (cpp_reader
*pfile
, struct op
*top
, enum cpp_ttype op
)
829 if (top
->op
<= CPP_EQ
|| top
->op
> CPP_LAST_CPP_OP
+ 2)
832 cpp_error (pfile
, CPP_DL_ICE
, "impossible operator '%u'", top
->op
);
836 if (op
== CPP_OPEN_PAREN
)
839 /* Decrement the priority of left-associative operators to force a
840 reduction with operators of otherwise equal priority. */
841 prio
= optab
[op
].prio
- ((optab
[op
].flags
& LEFT_ASSOC
) != 0);
842 while (prio
< optab
[top
->op
].prio
)
844 if (CPP_OPTION (pfile
, warn_num_sign_change
)
845 && optab
[top
->op
].flags
& CHECK_PROMOTION
)
846 check_promotion (pfile
, top
);
854 top
[-1].value
= num_unary_op (pfile
, top
->value
, top
->op
);
864 top
[-1].value
= num_binary_op (pfile
, top
[-1].value
,
865 top
->value
, top
->op
);
873 = num_inequality_op (pfile
, top
[-1].value
, top
->value
, top
->op
);
879 = num_equality_op (pfile
, top
[-1].value
, top
->value
, top
->op
);
886 = num_bitwise_op (pfile
, top
[-1].value
, top
->value
, top
->op
);
890 top
[-1].value
= num_mul (pfile
, top
[-1].value
, top
->value
);
895 top
[-1].value
= num_div_op (pfile
, top
[-1].value
,
896 top
->value
, top
->op
);
901 if (!num_zerop (top
->value
))
902 pfile
->state
.skip_eval
--;
903 top
->value
.low
= (!num_zerop (top
->value
)
904 || !num_zerop (top
[1].value
));
906 top
->value
.unsignedp
= false;
907 top
->value
.overflow
= false;
912 if (num_zerop (top
->value
))
913 pfile
->state
.skip_eval
--;
914 top
->value
.low
= (!num_zerop (top
->value
)
915 && !num_zerop (top
[1].value
));
917 top
->value
.unsignedp
= false;
918 top
->value
.overflow
= false;
922 if (op
!= CPP_CLOSE_PAREN
)
924 cpp_error (pfile
, CPP_DL_ERROR
, "missing ')' in expression");
928 top
->value
= top
[1].value
;
933 if (!num_zerop (top
->value
))
935 pfile
->state
.skip_eval
--;
936 top
->value
= top
[1].value
;
939 top
->value
= top
[2].value
;
940 top
->value
.unsignedp
= (top
[1].value
.unsignedp
941 || top
[2].value
.unsignedp
);
945 cpp_error (pfile
, CPP_DL_ERROR
, "'?' without following ':'");
953 if (top
->value
.overflow
&& !pfile
->state
.skip_eval
)
954 cpp_error (pfile
, CPP_DL_PEDWARN
,
955 "integer overflow in preprocessor expression");
958 if (op
== CPP_CLOSE_PAREN
)
960 cpp_error (pfile
, CPP_DL_ERROR
, "missing '(' in expression");
967 /* Returns the position of the old top of stack after expansion. */
969 _cpp_expand_op_stack (cpp_reader
*pfile
)
971 size_t old_size
= (size_t) (pfile
->op_limit
- pfile
->op_stack
);
972 size_t new_size
= old_size
* 2 + 20;
974 pfile
->op_stack
= xrealloc (pfile
->op_stack
, new_size
* sizeof (struct op
));
975 pfile
->op_limit
= pfile
->op_stack
+ new_size
;
977 return pfile
->op_stack
+ old_size
;
980 /* Emits a warning if the effective sign of either operand of OP
981 changes because of integer promotions. */
983 check_promotion (cpp_reader
*pfile
, const struct op
*op
)
985 if (op
->value
.unsignedp
== op
[-1].value
.unsignedp
)
988 if (op
->value
.unsignedp
)
990 if (!num_positive (op
[-1].value
, CPP_OPTION (pfile
, precision
)))
991 cpp_error (pfile
, CPP_DL_WARNING
,
992 "the left operand of \"%s\" changes sign when promoted",
993 cpp_token_as_text (pfile
, op
->token
));
995 else if (!num_positive (op
->value
, CPP_OPTION (pfile
, precision
)))
996 cpp_error (pfile
, CPP_DL_WARNING
,
997 "the right operand of \"%s\" changes sign when promoted",
998 cpp_token_as_text (pfile
, op
->token
));
1001 /* Clears the unused high order bits of the number pointed to by PNUM. */
1003 num_trim (cpp_num num
, size_t precision
)
1005 if (precision
> PART_PRECISION
)
1007 precision
-= PART_PRECISION
;
1008 if (precision
< PART_PRECISION
)
1009 num
.high
&= ((cpp_num_part
) 1 << precision
) - 1;
1013 if (precision
< PART_PRECISION
)
1014 num
.low
&= ((cpp_num_part
) 1 << precision
) - 1;
1021 /* True iff A (presumed signed) >= 0. */
1023 num_positive (cpp_num num
, size_t precision
)
1025 if (precision
> PART_PRECISION
)
1027 precision
-= PART_PRECISION
;
1028 return (num
.high
& (cpp_num_part
) 1 << (precision
- 1)) == 0;
1031 return (num
.low
& (cpp_num_part
) 1 << (precision
- 1)) == 0;
1034 /* Sign extend a number, with PRECISION significant bits and all
1035 others assumed clear, to fill out a cpp_num structure. */
1037 cpp_num_sign_extend (cpp_num num
, size_t precision
)
1041 if (precision
> PART_PRECISION
)
1043 precision
-= PART_PRECISION
;
1044 if (precision
< PART_PRECISION
1045 && (num
.high
& (cpp_num_part
) 1 << (precision
- 1)))
1046 num
.high
|= ~(~(cpp_num_part
) 0 >> (PART_PRECISION
- precision
));
1048 else if (num
.low
& (cpp_num_part
) 1 << (precision
- 1))
1050 if (precision
< PART_PRECISION
)
1051 num
.low
|= ~(~(cpp_num_part
) 0 >> (PART_PRECISION
- precision
));
1052 num
.high
= ~(cpp_num_part
) 0;
1059 /* Returns the negative of NUM. */
1061 num_negate (cpp_num num
, size_t precision
)
1066 num
.high
= ~num
.high
;
1070 num
= num_trim (num
, precision
);
1071 num
.overflow
= (!num
.unsignedp
&& num_eq (num
, copy
) && !num_zerop (num
));
1076 /* Returns true if A >= B. */
1078 num_greater_eq (cpp_num pa
, cpp_num pb
, size_t precision
)
1082 unsignedp
= pa
.unsignedp
|| pb
.unsignedp
;
1086 /* Both numbers have signed type. If they are of different
1087 sign, the answer is the sign of A. */
1088 unsignedp
= num_positive (pa
, precision
);
1090 if (unsignedp
!= num_positive (pb
, precision
))
1093 /* Otherwise we can do an unsigned comparison. */
1096 return (pa
.high
> pb
.high
) || (pa
.high
== pb
.high
&& pa
.low
>= pb
.low
);
1099 /* Returns LHS OP RHS, where OP is a bit-wise operation. */
1101 num_bitwise_op (cpp_reader
*pfile ATTRIBUTE_UNUSED
,
1102 cpp_num lhs
, cpp_num rhs
, enum cpp_ttype op
)
1104 lhs
.overflow
= false;
1105 lhs
.unsignedp
= lhs
.unsignedp
|| rhs
.unsignedp
;
1107 /* As excess precision is zeroed, there is no need to num_trim () as
1108 these operations cannot introduce a set bit there. */
1112 lhs
.high
&= rhs
.high
;
1114 else if (op
== CPP_OR
)
1117 lhs
.high
|= rhs
.high
;
1122 lhs
.high
^= rhs
.high
;
1128 /* Returns LHS OP RHS, where OP is an inequality. */
1130 num_inequality_op (cpp_reader
*pfile
, cpp_num lhs
, cpp_num rhs
,
1133 bool gte
= num_greater_eq (lhs
, rhs
, CPP_OPTION (pfile
, precision
));
1135 if (op
== CPP_GREATER_EQ
)
1137 else if (op
== CPP_LESS
)
1139 else if (op
== CPP_GREATER
)
1140 lhs
.low
= gte
&& !num_eq (lhs
, rhs
);
1141 else /* CPP_LESS_EQ. */
1142 lhs
.low
= !gte
|| num_eq (lhs
, rhs
);
1145 lhs
.overflow
= false;
1146 lhs
.unsignedp
= false;
1150 /* Returns LHS OP RHS, where OP is == or !=. */
1152 num_equality_op (cpp_reader
*pfile ATTRIBUTE_UNUSED
,
1153 cpp_num lhs
, cpp_num rhs
, enum cpp_ttype op
)
1155 /* Work around a 3.0.4 bug; see PR 6950. */
1156 bool eq
= num_eq (lhs
, rhs
);
1157 if (op
== CPP_NOT_EQ
)
1161 lhs
.overflow
= false;
1162 lhs
.unsignedp
= false;
1166 /* Shift NUM, of width PRECISION, right by N bits. */
1168 num_rshift (cpp_num num
, size_t precision
, size_t n
)
1170 cpp_num_part sign_mask
;
1171 bool x
= num_positive (num
, precision
);
1173 if (num
.unsignedp
|| x
)
1176 sign_mask
= ~(cpp_num_part
) 0;
1179 num
.high
= num
.low
= sign_mask
;
1183 if (precision
< PART_PRECISION
)
1184 num
.high
= sign_mask
, num
.low
|= sign_mask
<< precision
;
1185 else if (precision
< 2 * PART_PRECISION
)
1186 num
.high
|= sign_mask
<< (precision
- PART_PRECISION
);
1188 if (n
>= PART_PRECISION
)
1190 n
-= PART_PRECISION
;
1192 num
.high
= sign_mask
;
1197 num
.low
= (num
.low
>> n
) | (num
.high
<< (PART_PRECISION
- n
));
1198 num
.high
= (num
.high
>> n
) | (sign_mask
<< (PART_PRECISION
- n
));
1202 num
= num_trim (num
, precision
);
1203 num
.overflow
= false;
1207 /* Shift NUM, of width PRECISION, left by N bits. */
1209 num_lshift (cpp_num num
, size_t precision
, size_t n
)
1213 num
.overflow
= !num
.unsignedp
&& !num_zerop (num
);
1214 num
.high
= num
.low
= 0;
1218 cpp_num orig
, maybe_orig
;
1222 if (m
>= PART_PRECISION
)
1224 m
-= PART_PRECISION
;
1230 num
.high
= (num
.high
<< m
) | (num
.low
>> (PART_PRECISION
- m
));
1233 num
= num_trim (num
, precision
);
1236 num
.overflow
= false;
1239 maybe_orig
= num_rshift (num
, precision
, n
);
1240 num
.overflow
= !num_eq (orig
, maybe_orig
);
1247 /* The four unary operators: +, -, ! and ~. */
1249 num_unary_op (cpp_reader
*pfile
, cpp_num num
, enum cpp_ttype op
)
1254 if (CPP_WTRADITIONAL (pfile
) && !pfile
->state
.skip_eval
)
1255 cpp_error (pfile
, CPP_DL_WARNING
,
1256 "traditional C rejects the unary plus operator");
1257 num
.overflow
= false;
1261 num
= num_negate (num
, CPP_OPTION (pfile
, precision
));
1265 num
.high
= ~num
.high
;
1267 num
= num_trim (num
, CPP_OPTION (pfile
, precision
));
1268 num
.overflow
= false;
1271 default: /* case CPP_NOT: */
1272 num
.low
= num_zerop (num
);
1274 num
.overflow
= false;
1275 num
.unsignedp
= false;
1282 /* The various binary operators. */
1284 num_binary_op (cpp_reader
*pfile
, cpp_num lhs
, cpp_num rhs
, enum cpp_ttype op
)
1287 size_t precision
= CPP_OPTION (pfile
, precision
);
1296 if (!rhs
.unsignedp
&& !num_positive (rhs
, precision
))
1298 /* A negative shift is a positive shift the other way. */
1299 if (op
== CPP_LSHIFT
)
1303 rhs
= num_negate (rhs
, precision
);
1306 n
= ~0; /* Maximal. */
1309 if (op
== CPP_LSHIFT
)
1310 lhs
= num_lshift (lhs
, precision
, n
);
1312 lhs
= num_rshift (lhs
, precision
, n
);
1319 bool unsignedp
= lhs
.unsignedp
|| rhs
.unsignedp
;
1321 gte
= num_greater_eq (lhs
, rhs
, precision
);
1326 lhs
.unsignedp
= unsignedp
;
1332 rhs
= num_negate (rhs
, precision
);
1334 result
.low
= lhs
.low
+ rhs
.low
;
1335 result
.high
= lhs
.high
+ rhs
.high
;
1336 if (result
.low
< lhs
.low
)
1338 result
.unsignedp
= lhs
.unsignedp
|| rhs
.unsignedp
;
1339 result
.overflow
= false;
1341 result
= num_trim (result
, precision
);
1342 if (!result
.unsignedp
)
1344 bool lhsp
= num_positive (lhs
, precision
);
1345 result
.overflow
= (lhsp
== num_positive (rhs
, precision
)
1346 && lhsp
!= num_positive (result
, precision
));
1351 default: /* case CPP_COMMA: */
1352 if (CPP_PEDANTIC (pfile
) && (!CPP_OPTION (pfile
, c99
)
1353 || !pfile
->state
.skip_eval
))
1354 cpp_error (pfile
, CPP_DL_PEDWARN
,
1355 "comma operator in operand of #if");
1363 /* Multiplies two unsigned cpp_num_parts to give a cpp_num. This
1366 num_part_mul (cpp_num_part lhs
, cpp_num_part rhs
)
1369 cpp_num_part middle
[2], temp
;
1371 result
.low
= LOW_PART (lhs
) * LOW_PART (rhs
);
1372 result
.high
= HIGH_PART (lhs
) * HIGH_PART (rhs
);
1374 middle
[0] = LOW_PART (lhs
) * HIGH_PART (rhs
);
1375 middle
[1] = HIGH_PART (lhs
) * LOW_PART (rhs
);
1378 result
.low
+= LOW_PART (middle
[0]) << (PART_PRECISION
/ 2);
1379 if (result
.low
< temp
)
1383 result
.low
+= LOW_PART (middle
[1]) << (PART_PRECISION
/ 2);
1384 if (result
.low
< temp
)
1387 result
.high
+= HIGH_PART (middle
[0]);
1388 result
.high
+= HIGH_PART (middle
[1]);
1389 result
.unsignedp
= true;
1390 result
.overflow
= false;
1395 /* Multiply two preprocessing numbers. */
1397 num_mul (cpp_reader
*pfile
, cpp_num lhs
, cpp_num rhs
)
1399 cpp_num result
, temp
;
1400 bool unsignedp
= lhs
.unsignedp
|| rhs
.unsignedp
;
1401 bool overflow
, negate
= false;
1402 size_t precision
= CPP_OPTION (pfile
, precision
);
1404 /* Prepare for unsigned multiplication. */
1407 if (!num_positive (lhs
, precision
))
1408 negate
= !negate
, lhs
= num_negate (lhs
, precision
);
1409 if (!num_positive (rhs
, precision
))
1410 negate
= !negate
, rhs
= num_negate (rhs
, precision
);
1413 overflow
= lhs
.high
&& rhs
.high
;
1414 result
= num_part_mul (lhs
.low
, rhs
.low
);
1416 temp
= num_part_mul (lhs
.high
, rhs
.low
);
1417 result
.high
+= temp
.low
;
1421 temp
= num_part_mul (lhs
.low
, rhs
.high
);
1422 result
.high
+= temp
.low
;
1426 temp
.low
= result
.low
, temp
.high
= result
.high
;
1427 result
= num_trim (result
, precision
);
1428 if (!num_eq (result
, temp
))
1432 result
= num_negate (result
, precision
);
1435 result
.overflow
= false;
1437 result
.overflow
= overflow
|| (num_positive (result
, precision
) ^ !negate
1438 && !num_zerop (result
));
1439 result
.unsignedp
= unsignedp
;
1444 /* Divide two preprocessing numbers, returning the answer or the
1445 remainder depending upon OP. */
1447 num_div_op (cpp_reader
*pfile
, cpp_num lhs
, cpp_num rhs
, enum cpp_ttype op
)
1449 cpp_num result
, sub
;
1451 bool unsignedp
= lhs
.unsignedp
|| rhs
.unsignedp
;
1452 bool negate
= false, lhs_neg
= false;
1453 size_t i
, precision
= CPP_OPTION (pfile
, precision
);
1455 /* Prepare for unsigned division. */
1458 if (!num_positive (lhs
, precision
))
1459 negate
= !negate
, lhs_neg
= true, lhs
= num_negate (lhs
, precision
);
1460 if (!num_positive (rhs
, precision
))
1461 negate
= !negate
, rhs
= num_negate (rhs
, precision
);
1464 /* Find the high bit. */
1468 mask
= (cpp_num_part
) 1 << (i
- PART_PRECISION
);
1469 for (; ; i
--, mask
>>= 1)
1470 if (rhs
.high
& mask
)
1475 if (precision
> PART_PRECISION
)
1476 i
= precision
- PART_PRECISION
- 1;
1479 mask
= (cpp_num_part
) 1 << i
;
1480 for (; ; i
--, mask
>>= 1)
1486 if (!pfile
->state
.skip_eval
)
1487 cpp_error (pfile
, CPP_DL_ERROR
, "division by zero in #if");
1491 /* First nonzero bit of RHS is bit I. Do naive division by
1492 shifting the RHS fully left, and subtracting from LHS if LHS is
1493 at least as big, and then repeating but with one less shift.
1494 This is not very efficient, but is easy to understand. */
1496 rhs
.unsignedp
= true;
1497 lhs
.unsignedp
= true;
1498 i
= precision
- i
- 1;
1499 sub
= num_lshift (rhs
, precision
, i
);
1501 result
.high
= result
.low
= 0;
1504 if (num_greater_eq (lhs
, sub
, precision
))
1506 lhs
= num_binary_op (pfile
, lhs
, sub
, CPP_MINUS
);
1507 if (i
>= PART_PRECISION
)
1508 result
.high
|= (cpp_num_part
) 1 << (i
- PART_PRECISION
);
1510 result
.low
|= (cpp_num_part
) 1 << i
;
1514 sub
.low
= (sub
.low
>> 1) | (sub
.high
<< (PART_PRECISION
- 1));
1518 /* We divide so that the remainder has the sign of the LHS. */
1521 result
.unsignedp
= unsignedp
;
1522 result
.overflow
= false;
1526 result
= num_negate (result
, precision
);
1527 result
.overflow
= num_positive (result
, precision
) ^ !negate
;
1534 lhs
.unsignedp
= unsignedp
;
1535 lhs
.overflow
= false;
1537 lhs
= num_negate (lhs
, precision
);