allocate.h: Stop needlessly returning a void value in __DO_ALLOCATOR
[smatch.git] / expression.c
blob77d665dcc56c2e89d75d7e5f432bb023aa57162f
1 /*
2 * sparse/expression.c
4 * Copyright (C) 2003 Transmeta Corp.
5 * 2003-2004 Linus Torvalds
7 * Licensed under the Open Software License version 1.1
9 * This is the expression parsing part of parsing C.
11 #include <stdarg.h>
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <string.h>
15 #include <ctype.h>
16 #include <unistd.h>
17 #include <fcntl.h>
18 #include <errno.h>
19 #include <limits.h>
21 #include "lib.h"
22 #include "allocate.h"
23 #include "token.h"
24 #include "parse.h"
25 #include "symbol.h"
26 #include "scope.h"
27 #include "expression.h"
28 #include "target.h"
30 static int match_oplist(int op, ...)
32 va_list args;
34 va_start(args, op);
35 for (;;) {
36 int nextop = va_arg(args, int);
37 if (!nextop)
38 return 0;
39 if (op == nextop)
40 return 1;
44 static struct token *comma_expression(struct token *, struct expression **);
46 struct token *parens_expression(struct token *token, struct expression **expr, const char *where)
48 token = expect(token, '(', where);
49 if (match_op(token, '{')) {
50 struct expression *e = alloc_expression(token->pos, EXPR_STATEMENT);
51 struct statement *stmt = alloc_statement(token->pos, STMT_COMPOUND);
52 *expr = e;
53 e->statement = stmt;
54 start_symbol_scope();
55 token = compound_statement(token->next, stmt);
56 end_symbol_scope();
57 token = expect(token, '}', "at end of statement expression");
58 } else
59 token = parse_expression(token, expr);
60 return expect(token, ')', where);
64 * Handle __func__, __FUNCTION__ and __PRETTY_FUNCTION__ token
65 * conversion
67 static int convert_one_fn_token(struct token *token)
69 struct symbol *sym = current_fn;
71 if (sym) {
72 struct ident *ident = sym->ident;
73 if (ident) {
74 int len = ident->len;
75 struct string *string;
77 string = __alloc_string(len+1);
78 memcpy(string->data, ident->name, len);
79 string->data[len] = 0;
80 string->length = len+1;
81 token_type(token) = TOKEN_STRING;
82 token->string = string;
83 return 1;
86 return 0;
89 static int convert_function(struct token *next)
91 int retval = 0;
92 for (;;) {
93 struct token *token = next;
94 next = next->next;
95 switch (token_type(token)) {
96 case TOKEN_STRING:
97 continue;
98 case TOKEN_IDENT:
99 if (token->ident == &__func___ident ||
100 token->ident == &__FUNCTION___ident ||
101 token->ident == &__PRETTY_FUNCTION___ident) {
102 if (!convert_one_fn_token(token))
103 break;
104 retval = 1;
105 continue;
107 /* Fall through */
108 default:
109 break;
111 break;
113 return retval;
116 static struct token *parse_type(struct token *token, struct expression **tree)
118 struct symbol *sym;
119 *tree = alloc_expression(token->pos, EXPR_TYPE);
120 (*tree)->flags = Int_const_expr; /* sic */
121 token = typename(token, &sym, 0);
122 if (sym->ident)
123 sparse_error(token->pos,
124 "type expression should not include identifier "
125 "\"%s\"", sym->ident->name);
126 (*tree)->symbol = sym;
127 return token;
130 static struct token *builtin_types_compatible_p_expr(struct token *token,
131 struct expression **tree)
133 struct expression *expr = alloc_expression(
134 token->pos, EXPR_COMPARE);
135 expr->flags = Int_const_expr;
136 expr->op = SPECIAL_EQUAL;
137 token = token->next;
138 if (!match_op(token, '('))
139 return expect(token, '(',
140 "after __builtin_types_compatible_p");
141 token = token->next;
142 token = parse_type(token, &expr->left);
143 if (!match_op(token, ','))
144 return expect(token, ',',
145 "in __builtin_types_compatible_p");
146 token = token->next;
147 token = parse_type(token, &expr->right);
148 if (!match_op(token, ')'))
149 return expect(token, ')',
150 "at end of __builtin_types_compatible_p");
151 token = token->next;
153 *tree = expr;
154 return token;
157 static struct token *builtin_offsetof_expr(struct token *token,
158 struct expression **tree)
160 struct expression *expr = NULL;
161 struct expression **p = &expr;
162 struct symbol *sym;
163 int op = '.';
165 token = token->next;
166 if (!match_op(token, '('))
167 return expect(token, '(', "after __builtin_offset");
169 token = token->next;
170 token = typename(token, &sym, 0);
171 if (sym->ident)
172 sparse_error(token->pos,
173 "type expression should not include identifier "
174 "\"%s\"", sym->ident->name);
176 if (!match_op(token, ','))
177 return expect(token, ',', "in __builtin_offset");
179 while (1) {
180 struct expression *e;
181 switch (op) {
182 case ')':
183 expr->in = sym;
184 *tree = expr;
185 default:
186 return expect(token, ')', "at end of __builtin_offset");
187 case SPECIAL_DEREFERENCE:
188 e = alloc_expression(token->pos, EXPR_OFFSETOF);
189 e->flags = Int_const_expr;
190 e->op = '[';
191 *p = e;
192 p = &e->down;
193 /* fall through */
194 case '.':
195 token = token->next;
196 e = alloc_expression(token->pos, EXPR_OFFSETOF);
197 e->flags = Int_const_expr;
198 e->op = '.';
199 if (token_type(token) != TOKEN_IDENT) {
200 sparse_error(token->pos, "Expected member name");
201 return token;
203 e->ident = token->ident;
204 token = token->next;
205 break;
206 case '[':
207 token = token->next;
208 e = alloc_expression(token->pos, EXPR_OFFSETOF);
209 e->flags = Int_const_expr;
210 e->op = '[';
211 token = parse_expression(token, &e->index);
212 token = expect(token, ']',
213 "at end of array dereference");
214 if (!e->index)
215 return token;
217 *p = e;
218 p = &e->down;
219 op = token_type(token) == TOKEN_SPECIAL ? token->special : 0;
223 static struct token *string_expression(struct token *token, struct expression *expr)
225 struct string *string = token->string;
226 struct token *next = token->next;
228 convert_function(token);
230 if (token_type(next) == TOKEN_STRING) {
231 int totlen = string->length-1;
232 char *data;
234 do {
235 totlen += next->string->length-1;
236 next = next->next;
237 } while (token_type(next) == TOKEN_STRING);
239 if (totlen > MAX_STRING) {
240 warning(token->pos, "trying to concatenate %d-character string (%d bytes max)", totlen, MAX_STRING);
241 totlen = MAX_STRING;
244 string = __alloc_string(totlen+1);
245 string->length = totlen+1;
246 data = string->data;
247 next = token;
248 do {
249 struct string *s = next->string;
250 int len = s->length-1;
252 if (len > totlen)
253 len = totlen;
254 totlen -= len;
256 next = next->next;
257 memcpy(data, s->data, len);
258 data += len;
259 } while (token_type(next) == TOKEN_STRING);
260 *data = '\0';
262 expr->string = string;
263 return next;
266 #ifndef ULLONG_MAX
267 #define ULLONG_MAX (~0ULL)
268 #endif
270 static void get_number_value(struct expression *expr, struct token *token)
272 const char *str = token->number;
273 unsigned long long value;
274 char *end;
275 unsigned long modifiers = 0;
276 int overflow = 0, do_warn = 0;
277 int try_unsigned = 1;
278 int bits;
280 errno = 0;
281 value = strtoull(str, &end, 0);
282 if (end == str)
283 goto Float;
284 if (value == ULLONG_MAX && errno == ERANGE)
285 overflow = 1;
286 while (1) {
287 unsigned long added;
288 char c = *end++;
289 if (!c) {
290 break;
291 } else if (c == 'u' || c == 'U') {
292 added = MOD_UNSIGNED;
293 } else if (c == 'l' || c == 'L') {
294 added = MOD_LONG;
295 if (*end == c) {
296 added |= MOD_LONGLONG;
297 end++;
299 } else
300 goto Float;
301 if (modifiers & added)
302 goto Enoint;
303 modifiers |= added;
305 if (overflow)
306 goto Eoverflow;
307 /* OK, it's a valid integer */
308 /* decimals can be unsigned only if directly specified as such */
309 if (str[0] != '0' && !(modifiers & MOD_UNSIGNED))
310 try_unsigned = 0;
311 if (!(modifiers & MOD_LONG)) {
312 bits = bits_in_int - 1;
313 if (!(value & (~1ULL << bits))) {
314 if (!(value & (1ULL << bits))) {
315 goto got_it;
316 } else if (try_unsigned) {
317 modifiers |= MOD_UNSIGNED;
318 goto got_it;
321 modifiers |= MOD_LONG;
322 do_warn = 1;
324 if (!(modifiers & MOD_LONGLONG)) {
325 bits = bits_in_long - 1;
326 if (!(value & (~1ULL << bits))) {
327 if (!(value & (1ULL << bits))) {
328 goto got_it;
329 } else if (try_unsigned) {
330 modifiers |= MOD_UNSIGNED;
331 goto got_it;
333 do_warn |= 2;
335 modifiers |= MOD_LONGLONG;
336 do_warn |= 1;
338 bits = bits_in_longlong - 1;
339 if (value & (~1ULL << bits))
340 goto Eoverflow;
341 if (!(value & (1ULL << bits)))
342 goto got_it;
343 if (!try_unsigned)
344 warning(expr->pos, "decimal constant %s is too big for long long",
345 show_token(token));
346 modifiers |= MOD_UNSIGNED;
347 got_it:
348 if (do_warn)
349 warning(expr->pos, "constant %s is so big it is%s%s%s",
350 show_token(token),
351 (modifiers & MOD_UNSIGNED) ? " unsigned":"",
352 (modifiers & MOD_LONG) ? " long":"",
353 (modifiers & MOD_LONGLONG) ? " long":"");
354 if (do_warn & 2)
355 warning(expr->pos,
356 "decimal constant %s is between LONG_MAX and ULONG_MAX."
357 " For C99 that means long long, C90 compilers are very "
358 "likely to produce unsigned long (and a warning) here",
359 show_token(token));
360 expr->type = EXPR_VALUE;
361 expr->flags = Int_const_expr;
362 expr->ctype = ctype_integer(modifiers);
363 expr->value = value;
364 return;
365 Eoverflow:
366 error_die(expr->pos, "constant %s is too big even for unsigned long long",
367 show_token(token));
368 return;
369 Float:
370 expr->fvalue = string_to_ld(str, &end);
371 if (str == end)
372 goto Enoint;
374 if (*end && end[1])
375 goto Enoint;
377 if (*end == 'f' || *end == 'F')
378 expr->ctype = &float_ctype;
379 else if (*end == 'l' || *end == 'L')
380 expr->ctype = &ldouble_ctype;
381 else if (!*end)
382 expr->ctype = &double_ctype;
383 else
384 goto Enoint;
386 expr->flags = Float_literal;
387 expr->type = EXPR_FVALUE;
388 return;
390 Enoint:
391 error_die(expr->pos, "constant %s is not a valid number", show_token(token));
394 struct token *primary_expression(struct token *token, struct expression **tree)
396 struct expression *expr = NULL;
398 switch (token_type(token)) {
399 case TOKEN_CHAR:
400 expr = alloc_expression(token->pos, EXPR_VALUE);
401 expr->flags = Int_const_expr;
402 expr->ctype = &int_ctype;
403 expr->value = (unsigned char) token->character;
404 token = token->next;
405 break;
407 case TOKEN_NUMBER:
408 expr = alloc_expression(token->pos, EXPR_VALUE);
409 get_number_value(expr, token); /* will see if it's an integer */
410 token = token->next;
411 break;
413 case TOKEN_ZERO_IDENT: {
414 expr = alloc_expression(token->pos, EXPR_SYMBOL);
415 expr->flags = Int_const_expr;
416 expr->ctype = &int_ctype;
417 expr->symbol = &zero_int;
418 expr->symbol_name = token->ident;
419 token = token->next;
420 break;
423 case TOKEN_IDENT: {
424 struct symbol *sym = lookup_symbol(token->ident, NS_SYMBOL | NS_TYPEDEF);
425 struct token *next = token->next;
427 if (!sym) {
428 if (convert_function(token))
429 goto handle_string;
430 if (token->ident == &__builtin_types_compatible_p_ident) {
431 token = builtin_types_compatible_p_expr(token, &expr);
432 break;
434 if (token->ident == &__builtin_offsetof_ident) {
435 token = builtin_offsetof_expr(token, &expr);
436 break;
438 } else if (sym->enum_member) {
439 expr = alloc_expression(token->pos, EXPR_VALUE);
440 *expr = *sym->initializer;
441 /* we want the right position reported, thus the copy */
442 expr->pos = token->pos;
443 expr->flags = Int_const_expr;
444 token = next;
445 break;
448 expr = alloc_expression(token->pos, EXPR_SYMBOL);
451 * We support types as real first-class citizens, with type
452 * comparisons etc:
454 * if (typeof(a) == int) ..
456 if (sym && sym->namespace == NS_TYPEDEF) {
457 sparse_error(token->pos, "typename in expression");
458 sym = NULL;
460 expr->symbol_name = token->ident;
461 expr->symbol = sym;
462 token = next;
463 break;
466 case TOKEN_STRING: {
467 handle_string:
468 expr = alloc_expression(token->pos, EXPR_STRING);
469 token = string_expression(token, expr);
470 break;
473 case TOKEN_SPECIAL:
474 if (token->special == '(') {
475 expr = alloc_expression(token->pos, EXPR_PREOP);
476 expr->op = '(';
477 token = parens_expression(token, &expr->unop, "in expression");
478 if (expr->unop)
479 expr->flags = expr->unop->flags;
480 break;
482 if (token->special == '[' && lookup_type(token->next)) {
483 expr = alloc_expression(token->pos, EXPR_TYPE);
484 expr->flags = Int_const_expr; /* sic */
485 token = typename(token->next, &expr->symbol, 0);
486 token = expect(token, ']', "in type expression");
487 break;
490 default:
493 *tree = expr;
494 return token;
497 static struct token *expression_list(struct token *token, struct expression_list **list)
499 while (!match_op(token, ')')) {
500 struct expression *expr = NULL;
501 token = assignment_expression(token, &expr);
502 if (!expr)
503 break;
504 add_expression(list, expr);
505 if (!match_op(token, ','))
506 break;
507 token = token->next;
509 return token;
513 * extend to deal with the ambiguous C grammar for parsing
514 * a cast expressions followed by an initializer.
516 static struct token *postfix_expression(struct token *token, struct expression **tree, struct expression *cast_init_expr)
518 struct expression *expr = cast_init_expr;
520 if (!expr)
521 token = primary_expression(token, &expr);
523 while (expr && token_type(token) == TOKEN_SPECIAL) {
524 switch (token->special) {
525 case '[': { /* Array dereference */
526 struct expression *deref = alloc_expression(token->pos, EXPR_PREOP);
527 struct expression *add = alloc_expression(token->pos, EXPR_BINOP);
529 deref->op = '*';
530 deref->unop = add;
532 add->op = '+';
533 add->left = expr;
534 token = parse_expression(token->next, &add->right);
535 token = expect(token, ']', "at end of array dereference");
536 expr = deref;
537 continue;
539 case SPECIAL_INCREMENT: /* Post-increment */
540 case SPECIAL_DECREMENT: { /* Post-decrement */
541 struct expression *post = alloc_expression(token->pos, EXPR_POSTOP);
542 post->op = token->special;
543 post->unop = expr;
544 expr = post;
545 token = token->next;
546 continue;
548 case SPECIAL_DEREFERENCE: { /* Structure pointer member dereference */
549 /* "x->y" is just shorthand for "(*x).y" */
550 struct expression *inner = alloc_expression(token->pos, EXPR_PREOP);
551 inner->op = '*';
552 inner->unop = expr;
553 expr = inner;
555 /* Fall through!! */
556 case '.': { /* Structure member dereference */
557 struct expression *deref = alloc_expression(token->pos, EXPR_DEREF);
558 deref->op = '.';
559 deref->deref = expr;
560 token = token->next;
561 if (token_type(token) != TOKEN_IDENT) {
562 sparse_error(token->pos, "Expected member name");
563 break;
565 deref->member = token->ident;
566 token = token->next;
567 expr = deref;
568 continue;
571 case '(': { /* Function call */
572 struct expression *call = alloc_expression(token->pos, EXPR_CALL);
573 call->op = '(';
574 call->fn = expr;
575 token = expression_list(token->next, &call->args);
576 token = expect(token, ')', "in function call");
577 expr = call;
578 continue;
581 default:
582 break;
584 break;
586 *tree = expr;
587 return token;
590 static struct token *cast_expression(struct token *token, struct expression **tree);
591 static struct token *unary_expression(struct token *token, struct expression **tree);
593 static struct token *type_info_expression(struct token *token,
594 struct expression **tree, int type)
596 struct expression *expr = alloc_expression(token->pos, type);
598 *tree = expr;
599 expr->flags = Int_const_expr; /* XXX: VLA support will need that changed */
600 token = token->next;
601 if (!match_op(token, '(') || !lookup_type(token->next))
602 return unary_expression(token, &expr->cast_expression);
603 token = typename(token->next, &expr->cast_type, 0);
605 if (!match_op(token, ')')) {
606 static const char * error[] = {
607 [EXPR_SIZEOF] = "at end of sizeof",
608 [EXPR_ALIGNOF] = "at end of __alignof__",
609 [EXPR_PTRSIZEOF] = "at end of __sizeof_ptr__"
611 return expect(token, ')', error[type]);
614 token = token->next;
616 * C99 ambiguity: the typename might have been the beginning
617 * of a typed initializer expression..
619 if (match_op(token, '{'))
620 token = initializer(&expr->cast_expression, token);
621 return token;
624 static struct token *unary_expression(struct token *token, struct expression **tree)
626 if (token_type(token) == TOKEN_IDENT) {
627 struct ident *ident = token->ident;
628 if (ident->reserved) {
629 static const struct {
630 struct ident *id;
631 int type;
632 } type_information[] = {
633 { &sizeof_ident, EXPR_SIZEOF },
634 { &__alignof___ident, EXPR_ALIGNOF },
635 { &__alignof_ident, EXPR_ALIGNOF },
636 { &__sizeof_ptr___ident, EXPR_PTRSIZEOF },
638 int i;
639 for (i = 0; i < 3; i++) {
640 if (ident == type_information[i].id)
641 return type_info_expression(token, tree, type_information[i].type);
646 if (token_type(token) == TOKEN_SPECIAL) {
647 if (match_oplist(token->special,
648 SPECIAL_INCREMENT, SPECIAL_DECREMENT,
649 '&', '*', 0)) {
650 struct expression *unop;
651 struct expression *unary;
652 struct token *next;
654 next = cast_expression(token->next, &unop);
655 if (!unop) {
656 sparse_error(token->pos, "Syntax error in unary expression");
657 return next;
659 unary = alloc_expression(token->pos, EXPR_PREOP);
660 unary->op = token->special;
661 unary->unop = unop;
662 *tree = unary;
663 return next;
665 /* possibly constant ones */
666 if (match_oplist(token->special, '+', '-', '~', '!', 0)) {
667 struct expression *unop;
668 struct expression *unary;
669 struct token *next;
671 next = cast_expression(token->next, &unop);
672 if (!unop) {
673 sparse_error(token->pos, "Syntax error in unary expression");
674 return next;
676 unary = alloc_expression(token->pos, EXPR_PREOP);
677 unary->op = token->special;
678 unary->unop = unop;
679 unary->flags = unop->flags & Int_const_expr;
680 *tree = unary;
681 return next;
683 /* Gcc extension: &&label gives the address of a label */
684 if (match_op(token, SPECIAL_LOGICAL_AND) &&
685 token_type(token->next) == TOKEN_IDENT) {
686 struct expression *label = alloc_expression(token->pos, EXPR_LABEL);
687 struct symbol *sym = label_symbol(token->next);
688 if (!(sym->ctype.modifiers & MOD_ADDRESSABLE)) {
689 sym->ctype.modifiers |= MOD_ADDRESSABLE;
690 add_symbol(&function_computed_target_list, sym);
692 label->label_symbol = sym;
693 *tree = label;
694 return token->next->next;
699 return postfix_expression(token, tree, NULL);
703 * Ambiguity: a '(' can be either a cast-expression or
704 * a primary-expression depending on whether it is followed
705 * by a type or not.
707 * additional ambiguity: a "cast expression" followed by
708 * an initializer is really a postfix-expression.
710 static struct token *cast_expression(struct token *token, struct expression **tree)
712 if (match_op(token, '(')) {
713 struct token *next = token->next;
714 if (lookup_type(next)) {
715 struct expression *cast = alloc_expression(next->pos, EXPR_CAST);
716 struct expression *v;
717 struct symbol *sym;
718 int is_force;
720 token = typename(next, &sym, MOD_FORCE);
721 cast->cast_type = sym;
722 is_force = sym->ctype.modifiers & MOD_FORCE;
723 sym->ctype.modifiers &= ~MOD_FORCE;
724 token = expect(token, ')', "at end of cast operator");
725 if (match_op(token, '{')) {
726 if (is_force)
727 warning(sym->pos,
728 "[force] in compound literal");
729 token = initializer(&cast->cast_expression, token);
730 return postfix_expression(token, tree, cast);
732 *tree = cast;
733 if (is_force)
734 cast->type = EXPR_FORCE_CAST;
735 token = cast_expression(token, &v);
736 if (!v)
737 return token;
738 cast->cast_expression = v;
739 if (v->flags & Int_const_expr)
740 cast->flags = Int_const_expr;
741 else if (v->flags & Float_literal) /* and _not_ int */
742 cast->flags = Int_const_expr | Float_literal;
743 return token;
746 return unary_expression(token, tree);
750 * Generic left-to-right binop parsing
752 * This _really_ needs to be inlined, because that makes the inner
753 * function call statically deterministic rather than a totally
754 * unpredictable indirect call. But gcc-3 is so "clever" that it
755 * doesn't do so by default even when you tell it to inline it.
757 * Making it a macro avoids the inlining problem, and also means
758 * that we can pass in the op-comparison as an expression rather
759 * than create a data structure for it.
762 #define LR_BINOP_EXPRESSION(__token, tree, type, inner, compare) \
763 struct expression *left = NULL; \
764 struct token * next = inner(__token, &left); \
766 if (left) { \
767 while (token_type(next) == TOKEN_SPECIAL) { \
768 struct expression *top, *right = NULL; \
769 int op = next->special; \
771 if (!(compare)) \
772 goto out; \
773 top = alloc_expression(next->pos, type); \
774 next = inner(next->next, &right); \
775 if (!right) { \
776 sparse_error(next->pos, "No right hand side of '%s'-expression", show_special(op)); \
777 break; \
779 top->flags = left->flags & right->flags \
780 & Int_const_expr; \
781 top->op = op; \
782 top->left = left; \
783 top->right = right; \
784 left = top; \
787 out: \
788 *tree = left; \
789 return next; \
791 static struct token *multiplicative_expression(struct token *token, struct expression **tree)
793 LR_BINOP_EXPRESSION(
794 token, tree, EXPR_BINOP, cast_expression,
795 (op == '*') || (op == '/') || (op == '%')
799 static struct token *additive_expression(struct token *token, struct expression **tree)
801 LR_BINOP_EXPRESSION(
802 token, tree, EXPR_BINOP, multiplicative_expression,
803 (op == '+') || (op == '-')
807 static struct token *shift_expression(struct token *token, struct expression **tree)
809 LR_BINOP_EXPRESSION(
810 token, tree, EXPR_BINOP, additive_expression,
811 (op == SPECIAL_LEFTSHIFT) || (op == SPECIAL_RIGHTSHIFT)
815 static struct token *relational_expression(struct token *token, struct expression **tree)
817 LR_BINOP_EXPRESSION(
818 token, tree, EXPR_COMPARE, shift_expression,
819 (op == '<') || (op == '>') ||
820 (op == SPECIAL_LTE) || (op == SPECIAL_GTE)
824 static struct token *equality_expression(struct token *token, struct expression **tree)
826 LR_BINOP_EXPRESSION(
827 token, tree, EXPR_COMPARE, relational_expression,
828 (op == SPECIAL_EQUAL) || (op == SPECIAL_NOTEQUAL)
832 static struct token *bitwise_and_expression(struct token *token, struct expression **tree)
834 LR_BINOP_EXPRESSION(
835 token, tree, EXPR_BINOP, equality_expression,
836 (op == '&')
840 static struct token *bitwise_xor_expression(struct token *token, struct expression **tree)
842 LR_BINOP_EXPRESSION(
843 token, tree, EXPR_BINOP, bitwise_and_expression,
844 (op == '^')
848 static struct token *bitwise_or_expression(struct token *token, struct expression **tree)
850 LR_BINOP_EXPRESSION(
851 token, tree, EXPR_BINOP, bitwise_xor_expression,
852 (op == '|')
856 static struct token *logical_and_expression(struct token *token, struct expression **tree)
858 LR_BINOP_EXPRESSION(
859 token, tree, EXPR_LOGICAL, bitwise_or_expression,
860 (op == SPECIAL_LOGICAL_AND)
864 static struct token *logical_or_expression(struct token *token, struct expression **tree)
866 LR_BINOP_EXPRESSION(
867 token, tree, EXPR_LOGICAL, logical_and_expression,
868 (op == SPECIAL_LOGICAL_OR)
872 struct token *conditional_expression(struct token *token, struct expression **tree)
874 token = logical_or_expression(token, tree);
875 if (*tree && match_op(token, '?')) {
876 struct expression *expr = alloc_expression(token->pos, EXPR_CONDITIONAL);
877 expr->op = token->special;
878 expr->left = *tree;
879 *tree = expr;
880 token = parse_expression(token->next, &expr->cond_true);
881 token = expect(token, ':', "in conditional expression");
882 token = conditional_expression(token, &expr->cond_false);
883 if (expr->left && expr->cond_true) {
884 int is_const = expr->left->flags &
885 expr->cond_false->flags &
886 Int_const_expr;
887 if (expr->cond_true)
888 is_const &= expr->cond_true->flags;
889 expr->flags = is_const;
892 return token;
895 struct token *assignment_expression(struct token *token, struct expression **tree)
897 token = conditional_expression(token, tree);
898 if (*tree && token_type(token) == TOKEN_SPECIAL) {
899 static const int assignments[] = {
900 '=',
901 SPECIAL_ADD_ASSIGN, SPECIAL_SUB_ASSIGN,
902 SPECIAL_MUL_ASSIGN, SPECIAL_DIV_ASSIGN,
903 SPECIAL_MOD_ASSIGN, SPECIAL_SHL_ASSIGN,
904 SPECIAL_SHR_ASSIGN, SPECIAL_AND_ASSIGN,
905 SPECIAL_OR_ASSIGN, SPECIAL_XOR_ASSIGN };
906 int i, op = token->special;
907 for (i = 0; i < sizeof(assignments)/sizeof(int); i++)
908 if (assignments[i] == op) {
909 struct expression * expr = alloc_expression(token->pos, EXPR_ASSIGNMENT);
910 expr->left = *tree;
911 expr->op = op;
912 *tree = expr;
913 return assignment_expression(token->next, &expr->right);
916 return token;
919 static struct token *comma_expression(struct token *token, struct expression **tree)
921 LR_BINOP_EXPRESSION(
922 token, tree, EXPR_COMMA, assignment_expression,
923 (op == ',')
927 struct token *parse_expression(struct token *token, struct expression **tree)
929 return comma_expression(token,tree);