1 /*
2  * sparse/expression.c
3  *
4  * Copyright (C) 2003 Transmeta Corp.
5  *               2003-2004 Linus Torvalds
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy
8  * of this software and associated documentation files (the "Software"), to deal
9  * in the Software without restriction, including without limitation the rights
10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11  * copies of the Software, and to permit persons to whom the Software is
12  * furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in
15  * all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23  * THE SOFTWARE.
24  *
25  * This is the expression parsing part of parsing C.
26  */
27 #include <stdarg.h>
28 #include <stdlib.h>
29 #include <stdio.h>
30 #include <string.h>
31 #include <ctype.h>
32 #include <unistd.h>
33 #include <fcntl.h>
34 #include <errno.h>
35 #include <limits.h>
36 
37 #include "lib.h"
38 #include "allocate.h"
39 #include "token.h"
40 #include "parse.h"
41 #include "symbol.h"
42 #include "scope.h"
43 #include "expression.h"
44 #include "target.h"
45 #include "char.h"
46 
47 static int match_oplist(int op, ...)
48 {
49 	va_list args;
50 	int nextop;
51 
52 	va_start(args, op);
53 	do {
54 		nextop = va_arg(args, int);
55 	} while (nextop != 0 && nextop != op);
56 	va_end(args);
57 
58 	return nextop != 0;
59 }
60 
61 static struct token *comma_expression(struct token *, struct expression **);
62 
63 struct token *parens_expression(struct token *token, struct expression **expr, const char *where)
64 {
65 	token = expect(token, '(', where);
66 	if (match_op(token, '{')) {
67 		struct expression *e = alloc_expression(token->pos, EXPR_STATEMENT);
68 		struct statement *stmt = alloc_statement(token->pos, STMT_COMPOUND);
69 		*expr = e;
70 		e->statement = stmt;
71 		start_symbol_scope(e->pos);
72 		token = compound_statement(token->next, stmt);
73 		end_symbol_scope();
74 		token = expect(token, '}', "at end of statement expression");
75 	} else
76 		token = parse_expression(token, expr);
77 	return expect(token, ')', where);
78 }
79 
80 /*
81  * Handle __func__, __FUNCTION__ and __PRETTY_FUNCTION__ token
82  * conversion
83  */
84 static struct symbol *handle_func(struct token *token)
85 {
86 	struct ident *ident = token->ident;
87 	struct symbol *decl, *array;
88 	struct string *string;
89 	int len;
90 
91 	if (ident != &__func___ident &&
92 	    ident != &__FUNCTION___ident &&
93 	    ident != &__PRETTY_FUNCTION___ident)
94 		return NULL;
95 
96 	if (!current_fn || !current_fn->ident)
97 		return NULL;
98 
99 	/* OK, it's one of ours */
100 	array = alloc_symbol(token->pos, SYM_ARRAY);
101 	array->ctype.base_type = &char_ctype;
102 	array->ctype.alignment = 1;
103 	array->endpos = token->pos;
104 	decl = alloc_symbol(token->pos, SYM_NODE);
105 	decl->ctype.base_type = array;
106 	decl->ctype.alignment = 1;
107 	decl->ctype.modifiers = MOD_STATIC;
108 	decl->endpos = token->pos;
109 
110 	/* function-scope, but in NS_SYMBOL */
111 	bind_symbol(decl, ident, NS_LABEL);
112 	decl->namespace = NS_SYMBOL;
113 
114 	len = current_fn->ident->len;
115 	string = __alloc_string(len + 1);
116 	memcpy(string->data, current_fn->ident->name, len);
117 	string->data[len] = 0;
118 	string->length = len + 1;
119 
120 	decl->initializer = alloc_expression(token->pos, EXPR_STRING);
121 	decl->initializer->string = string;
122 	decl->initializer->ctype = decl;
123 	decl->array_size = alloc_const_expression(token->pos, len + 1);
124 	array->array_size = decl->array_size;
125 	decl->bit_size = array->bit_size = bytes_to_bits(len + 1);
126 
127 	return decl;
128 }
129 
130 static struct token *parse_type(struct token *token, struct expression **tree)
131 {
132 	struct symbol *sym;
133 	*tree = alloc_expression(token->pos, EXPR_TYPE);
134 	token = typename(token, &sym, NULL);
135 	if (sym->ident)
136 		sparse_error(token->pos,
137 			     "type expression should not include identifier "
138 			     "\"%s\"", sym->ident->name);
139 	(*tree)->symbol = sym;
140 	return token;
141 }
142 
143 static struct token *builtin_types_compatible_p_expr(struct token *token,
144 						     struct expression **tree)
145 {
146 	struct expression *expr = alloc_expression(
147 		token->pos, EXPR_COMPARE);
148 	expr->op = SPECIAL_EQUAL;
149 	token = token->next;
150 	if (!match_op(token, '('))
151 		return expect(token, '(',
152 			      "after __builtin_types_compatible_p");
153 	token = token->next;
154 	token = parse_type(token, &expr->left);
155 	if (!match_op(token, ','))
156 		return expect(token, ',',
157 			      "in __builtin_types_compatible_p");
158 	token = token->next;
159 	token = parse_type(token, &expr->right);
160 	if (!match_op(token, ')'))
161 		return expect(token, ')',
162 			      "at end of __builtin_types_compatible_p");
163 	token = token->next;
164 
165 	*tree = expr;
166 	return token;
167 }
168 
169 static struct token *builtin_offsetof_expr(struct token *token,
170 					   struct expression **tree)
171 {
172 	struct expression *expr = NULL;
173 	struct expression **p = &expr;
174 	struct symbol *sym;
175 	int op = '.';
176 
177 	token = token->next;
178 	if (!match_op(token, '('))
179 		return expect(token, '(', "after __builtin_offset");
180 
181 	token = token->next;
182 	token = typename(token, &sym, NULL);
183 	if (sym->ident)
184 		sparse_error(token->pos,
185 			     "type expression should not include identifier "
186 			     "\"%s\"", sym->ident->name);
187 
188 	if (!match_op(token, ','))
189 		return expect(token, ',', "in __builtin_offset");
190 
191 	while (1) {
192 		struct expression *e;
193 		switch (op) {
194 		case ')':
195 			expr->in = sym;
196 			*tree = expr;
197 		default:
198 			return expect(token, ')', "at end of __builtin_offset");
199 		case SPECIAL_DEREFERENCE:
200 			e = alloc_expression(token->pos, EXPR_OFFSETOF);
201 			e->op = '[';
202 			*p = e;
203 			p = &e->down;
204 			/* fall through */
205 		case '.':
206 			token = token->next;
207 			e = alloc_expression(token->pos, EXPR_OFFSETOF);
208 			e->op = '.';
209 			if (token_type(token) != TOKEN_IDENT) {
210 				sparse_error(token->pos, "Expected member name");
211 				return token;
212 			}
213 			e->ident = token->ident;
214 			token = token->next;
215 			break;
216 		case '[':
217 			token = token->next;
218 			e = alloc_expression(token->pos, EXPR_OFFSETOF);
219 			e->op = '[';
220 			token = parse_expression(token, &e->index);
221 			token = expect(token, ']',
222 					"at end of array dereference");
223 			if (!e->index)
224 				return token;
225 		}
226 		*p = e;
227 		p = &e->down;
228 		op = token_type(token) == TOKEN_SPECIAL ? token->special : 0;
229 	}
230 }
231 
232 #ifndef ULLONG_MAX
233 #define ULLONG_MAX (~0ULL)
234 #endif
235 
236 static unsigned long long parse_num(const char *nptr, char **end)
237 {
238 	if (nptr[0] == '0' && tolower((unsigned char)nptr[1]) == 'b')
239 		return strtoull(&nptr[2], end, 2);
240 	return strtoull(nptr, end, 0);
241 }
242 
243 static void get_number_value(struct expression *expr, struct token *token)
244 {
245 	const char *str = token->number;
246 	unsigned long long value;
247 	char *end;
248 	int size = 0, want_unsigned = 0;
249 	int overflow = 0, do_warn = 0;
250 	int try_unsigned = 1;
251 	int bits;
252 
253 	errno = 0;
254 	value = parse_num(str, &end);
255 	if (end == str)
256 		goto Float;
257 	if (value == ULLONG_MAX && errno == ERANGE)
258 		overflow = 1;
259 	while (1) {
260 		char c = *end++;
261 		if (!c) {
262 			break;
263 		} else if (c == 'u' || c == 'U') {
264 			if (want_unsigned)
265 				goto Enoint;
266 			want_unsigned = 1;
267 		} else if (c == 'l' || c == 'L') {
268 			if (size)
269 				goto Enoint;
270 			size = 1;
271 			if (*end == c) {
272 				size = 2;
273 				end++;
274 			}
275 		} else
276 			goto Float;
277 	}
278 	if (overflow)
279 		goto Eoverflow;
280 	/* OK, it's a valid integer */
281 	/* decimals can be unsigned only if directly specified as such */
282 	if (str[0] != '0' && !want_unsigned)
283 		try_unsigned = 0;
284 	if (!size) {
285 		bits = bits_in_int - 1;
286 		if (!(value & (~1ULL << bits))) {
287 			if (!(value & (1ULL << bits))) {
288 				goto got_it;
289 			} else if (try_unsigned) {
290 				want_unsigned = 1;
291 				goto got_it;
292 			}
293 		}
294 		size = 1;
295 		do_warn = 1;
296 	}
297 	if (size < 2) {
298 		bits = bits_in_long - 1;
299 		if (!(value & (~1ULL << bits))) {
300 			if (!(value & (1ULL << bits))) {
301 				goto got_it;
302 			} else if (try_unsigned) {
303 				want_unsigned = 1;
304 				goto got_it;
305 			}
306 			do_warn |= 2;
307 		}
308 		size = 2;
309 		do_warn |= 1;
310 	}
311 	bits = bits_in_longlong - 1;
312 	if (value & (~1ULL << bits))
313 		goto Eoverflow;
314 	if (!(value & (1ULL << bits)))
315 		goto got_it;
316 	if (!try_unsigned)
317 		warning(expr->pos, "decimal constant %s is too big for long long",
318 			show_token(token));
319 	want_unsigned = 1;
320 got_it:
321 	if (do_warn && Wconstant_suffix)
322 		warning(expr->pos, "constant %s is so big it is%s%s%s",
323 			show_token(token),
324 			want_unsigned ? " unsigned":"",
325 			size > 0 ? " long":"",
326 			size > 1 ? " long":"");
327 	if (do_warn & 2)
328 		warning(expr->pos,
329 			"decimal constant %s is between LONG_MAX and ULONG_MAX."
330 			" For C99 that means long long, C90 compilers are very "
331 			"likely to produce unsigned long (and a warning) here",
332 			show_token(token));
333         expr->type = EXPR_VALUE;
334 	expr->flags = CEF_SET_INT;
335         expr->ctype = ctype_integer(size, want_unsigned);
336         expr->value = value;
337 	return;
338 Eoverflow:
339 	error_die(expr->pos, "constant %s is too big even for unsigned long long",
340 			show_token(token));
341 	return;
342 Float:
343 	expr->fvalue = string_to_ld(str, &end);
344 	if (str == end)
345 		goto Enoint;
346 
347 	if (*end && end[1])
348 		goto Enoint;
349 
350 	if (*end == 'f' || *end == 'F')
351 		expr->ctype = &float_ctype;
352 	else if (*end == 'l' || *end == 'L')
353 		expr->ctype = &ldouble_ctype;
354 	else if (!*end)
355 		expr->ctype = &double_ctype;
356 	else
357 		goto Enoint;
358 
359 	expr->flags = CEF_SET_FLOAT;
360 	expr->type = EXPR_FVALUE;
361 	return;
362 
363 Enoint:
364 	error_die(expr->pos, "constant %s is not a valid number", show_token(token));
365 }
366 
367 struct token *primary_expression(struct token *token, struct expression **tree)
368 {
369 	struct expression *expr = NULL;
370 
371 	switch (token_type(token)) {
372 	case TOKEN_CHAR ... TOKEN_WIDE_CHAR_EMBEDDED_3:
373 		expr = alloc_expression(token->pos, EXPR_VALUE);
374 		expr->flags = CEF_SET_CHAR;
375 		expr->ctype = token_type(token) < TOKEN_WIDE_CHAR ? &int_ctype : &long_ctype;
376 		get_char_constant(token, &expr->value);
377 		token = token->next;
378 		break;
379 
380 	case TOKEN_NUMBER:
381 		expr = alloc_expression(token->pos, EXPR_VALUE);
382 		get_number_value(expr, token); /* will see if it's an integer */
383 		token = token->next;
384 		break;
385 
386 	case TOKEN_ZERO_IDENT: {
387 		expr = alloc_expression(token->pos, EXPR_SYMBOL);
388 		expr->flags = CEF_SET_INT;
389 		expr->ctype = &int_ctype;
390 		expr->symbol = &zero_int;
391 		expr->symbol_name = token->ident;
392 		token = token->next;
393 		break;
394 	}
395 
396 	case TOKEN_IDENT: {
397 		struct symbol *sym = lookup_symbol(token->ident, NS_SYMBOL | NS_TYPEDEF);
398 		struct token *next = token->next;
399 
400 		if (!sym) {
401 			sym = handle_func(token);
402 			if (token->ident == &__builtin_types_compatible_p_ident) {
403 				token = builtin_types_compatible_p_expr(token, &expr);
404 				break;
405 			}
406 			if (token->ident == &__builtin_offsetof_ident) {
407 				token = builtin_offsetof_expr(token, &expr);
408 				break;
409 			}
410 		} else if (sym->enum_member) {
411 			expr = alloc_expression(token->pos, EXPR_VALUE);
412 			*expr = *sym->initializer;
413 			/* we want the right position reported, thus the copy */
414 			expr->pos = token->pos;
415 			expr->flags = CEF_SET_ENUM;
416 			token = next;
417 			break;
418 		}
419 
420 		expr = alloc_expression(token->pos, EXPR_SYMBOL);
421 
422 		/*
423 		 * We support types as real first-class citizens, with type
424 		 * comparisons etc:
425 		 *
426 		 *	if (typeof(a) == int) ..
427 		 */
428 		if (sym && sym->namespace == NS_TYPEDEF) {
429 			sparse_error(token->pos, "typename in expression");
430 			sym = NULL;
431 		}
432 		expr->symbol_name = token->ident;
433 		expr->symbol = sym;
434 
435 		/*
436 		 * A pointer to an lvalue designating a static storage
437 		 * duration object is an address constant [6.6(9)].
438 		 */
439 		if (sym && (sym->ctype.modifiers & (MOD_TOPLEVEL | MOD_STATIC)))
440 			expr->flags = CEF_ADDR;
441 
442 		token = next;
443 		break;
444 	}
445 
446 	case TOKEN_STRING:
447 	case TOKEN_WIDE_STRING:
448 		expr = alloc_expression(token->pos, EXPR_STRING);
449 		token = get_string_constant(token, expr);
450 		break;
451 
452 	case TOKEN_SPECIAL:
453 		if (token->special == '(') {
454 			expr = alloc_expression(token->pos, EXPR_PREOP);
455 			expr->op = '(';
456 			token = parens_expression(token, &expr->unop, "in expression");
457 			break;
458 		}
459 		if (token->special == '[' && lookup_type(token->next)) {
460 			expr = alloc_expression(token->pos, EXPR_TYPE);
461 			token = typename(token->next, &expr->symbol, NULL);
462 			token = expect(token, ']', "in type expression");
463 			break;
464 		}
465 
466 	default:
467 		;
468 	}
469 	*tree = expr;
470 	return token;
471 }
472 
473 static struct token *expression_list(struct token *token, struct expression_list **list)
474 {
475 	while (!match_op(token, ')')) {
476 		struct expression *expr = NULL;
477 		token = assignment_expression(token, &expr);
478 		if (!expr)
479 			break;
480 		add_expression(list, expr);
481 		if (!match_op(token, ','))
482 			break;
483 		token = token->next;
484 	}
485 	return token;
486 }
487 
488 /*
489  * extend to deal with the ambiguous C grammar for parsing
490  * a cast expressions followed by an initializer.
491  */
492 static struct token *postfix_expression(struct token *token, struct expression **tree, struct expression *cast_init_expr)
493 {
494 	struct expression *expr = cast_init_expr;
495 
496 	if (!expr)
497 		token = primary_expression(token, &expr);
498 
499 	while (expr && token_type(token) == TOKEN_SPECIAL) {
500 		switch (token->special) {
501 		case '[': {			/* Array dereference */
502 			struct expression *deref = alloc_expression(token->pos, EXPR_PREOP);
503 			struct expression *add = alloc_expression(token->pos, EXPR_BINOP);
504 
505 			deref->op = '*';
506 			deref->unop = add;
507 
508 			add->op = '+';
509 			add->left = expr;
510 			token = parse_expression(token->next, &add->right);
511 			token = expect(token, ']', "at end of array dereference");
512 			expr = deref;
513 			continue;
514 		}
515 		case SPECIAL_INCREMENT:		/* Post-increment */
516 		case SPECIAL_DECREMENT:	{	/* Post-decrement */
517 			struct expression *post = alloc_expression(token->pos, EXPR_POSTOP);
518 			post->op = token->special;
519 			post->unop = expr;
520 			expr = post;
521 			token = token->next;
522 			continue;
523 		}
524 		case SPECIAL_DEREFERENCE: {	/* Structure pointer member dereference */
525 			/* "x->y" is just shorthand for "(*x).y" */
526 			struct expression *inner = alloc_expression(token->pos, EXPR_PREOP);
527 			inner->op = '*';
528 			inner->unop = expr;
529 			expr = inner;
530 		}
531 		/* Fall through!! */
532 		case '.': {			/* Structure member dereference */
533 			struct expression *deref = alloc_expression(token->pos, EXPR_DEREF);
534 			deref->op = '.';
535 			deref->deref = expr;
536 			token = token->next;
537 			if (token_type(token) != TOKEN_IDENT) {
538 				sparse_error(token->pos, "Expected member name");
539 				break;
540 			}
541 			deref->member = token->ident;
542 			deref->member_offset = -1;
543 			token = token->next;
544 			expr = deref;
545 			continue;
546 		}
547 
548 		case '(': {			/* Function call */
549 			struct expression *call = alloc_expression(token->pos, EXPR_CALL);
550 			call->op = '(';
551 			call->fn = expr;
552 			token = expression_list(token->next, &call->args);
553 			token = expect(token, ')', "in function call");
554 			expr = call;
555 			continue;
556 		}
557 
558 		default:
559 			break;
560 		}
561 		break;
562 	}
563 	*tree = expr;
564 	return token;
565 }
566 
567 static struct token *cast_expression(struct token *token, struct expression **tree);
568 static struct token *unary_expression(struct token *token, struct expression **tree);
569 
570 static struct token *type_info_expression(struct token *token,
571 	struct expression **tree, int type)
572 {
573 	struct expression *expr = alloc_expression(token->pos, type);
574 	struct token *p;
575 
576 	*tree = expr;
577 	expr->flags = CEF_SET_ICE; /* XXX: VLA support will need that changed */
578 	token = token->next;
579 	if (!match_op(token, '(') || !lookup_type(token->next))
580 		return unary_expression(token, &expr->cast_expression);
581 	p = token;
582 	token = typename(token->next, &expr->cast_type, NULL);
583 
584 	if (!match_op(token, ')')) {
585 		static const char * error[] = {
586 			[EXPR_SIZEOF] = "at end of sizeof",
587 			[EXPR_ALIGNOF] = "at end of __alignof__",
588 			[EXPR_PTRSIZEOF] = "at end of __sizeof_ptr__"
589 		};
590 		return expect(token, ')', error[type]);
591 	}
592 
593 	token = token->next;
594 	/*
595 	 * C99 ambiguity: the typename might have been the beginning
596 	 * of a typed initializer expression..
597 	 */
598 	if (match_op(token, '{')) {
599 		struct expression *cast = alloc_expression(p->pos, EXPR_CAST);
600 		cast->cast_type = expr->cast_type;
601 		expr->cast_type = NULL;
602 		expr->cast_expression = cast;
603 		token = initializer(&cast->cast_expression, token);
604 		token = postfix_expression(token, &expr->cast_expression, cast);
605 	}
606 	return token;
607 }
608 
609 static struct token *unary_expression(struct token *token, struct expression **tree)
610 {
611 	if (token_type(token) == TOKEN_IDENT) {
612 		struct ident *ident = token->ident;
613 		if (ident->reserved) {
614 			static const struct {
615 				struct ident *id;
616 				int type;
617 			} type_information[] = {
618 				{ &sizeof_ident, EXPR_SIZEOF },
619 				{ &__alignof___ident, EXPR_ALIGNOF },
620 				{ &__alignof_ident, EXPR_ALIGNOF },
621 				{ &_Alignof_ident, EXPR_ALIGNOF },
622 				{ &__sizeof_ptr___ident, EXPR_PTRSIZEOF },
623 			};
624 			int i;
625 			for (i = 0; i < ARRAY_SIZE(type_information); i++) {
626 				if (ident == type_information[i].id)
627 					return type_info_expression(token, tree, type_information[i].type);
628 			}
629 		}
630 	}
631 
632 	if (token_type(token) == TOKEN_SPECIAL) {
633 		if (match_oplist(token->special,
634 		    SPECIAL_INCREMENT, SPECIAL_DECREMENT,
635 		    '&', '*', 0)) {
636 		    	struct expression *unop;
637 			struct expression *unary;
638 			struct token *next;
639 
640 			next = cast_expression(token->next, &unop);
641 			if (!unop) {
642 				sparse_error(token->pos, "Syntax error in unary expression");
643 				*tree = NULL;
644 				return next;
645 			}
646 			unary = alloc_expression(token->pos, EXPR_PREOP);
647 			unary->op = token->special;
648 			unary->unop = unop;
649 			*tree = unary;
650 			return next;
651 		}
652 		/* possibly constant ones */
653 		if (match_oplist(token->special, '+', '-', '~', '!', 0)) {
654 		    	struct expression *unop;
655 			struct expression *unary;
656 			struct token *next;
657 
658 			next = cast_expression(token->next, &unop);
659 			if (!unop) {
660 				sparse_error(token->pos, "Syntax error in unary expression");
661 				*tree = NULL;
662 				return next;
663 			}
664 			unary = alloc_expression(token->pos, EXPR_PREOP);
665 			unary->op = token->special;
666 			unary->unop = unop;
667 			*tree = unary;
668 			return next;
669 		}
670 		/* Gcc extension: &&label gives the address of a label */
671 		if (match_op(token, SPECIAL_LOGICAL_AND) &&
672 		    token_type(token->next) == TOKEN_IDENT) {
673 			struct expression *label = alloc_expression(token->pos, EXPR_LABEL);
674 			struct symbol *sym = label_symbol(token->next);
675 			if (!(sym->ctype.modifiers & MOD_ADDRESSABLE)) {
676 				sym->ctype.modifiers |= MOD_ADDRESSABLE;
677 				add_symbol(&function_computed_target_list, sym);
678 			}
679 			label->flags = CEF_ADDR;
680 			label->label_symbol = sym;
681 			*tree = label;
682 			return token->next->next;
683 		}
684 
685 	}
686 
687 	return postfix_expression(token, tree, NULL);
688 }
689 
690 /*
691  * Ambiguity: a '(' can be either a cast-expression or
692  * a primary-expression depending on whether it is followed
693  * by a type or not.
694  *
695  * additional ambiguity: a "cast expression" followed by
696  * an initializer is really a postfix-expression.
697  */
698 static struct token *cast_expression(struct token *token, struct expression **tree)
699 {
700 	if (match_op(token, '(')) {
701 		struct token *next = token->next;
702 		if (lookup_type(next)) {
703 			struct expression *cast = alloc_expression(next->pos, EXPR_CAST);
704 			struct expression *v;
705 			struct symbol *sym;
706 			int is_force;
707 
708 			token = typename(next, &sym, &is_force);
709 			cast->cast_type = sym;
710 			token = expect(token, ')', "at end of cast operator");
711 			if (match_op(token, '{')) {
712 				if (toplevel(block_scope))
713 					sym->ctype.modifiers |= MOD_TOPLEVEL;
714 				if (is_force)
715 					warning(sym->pos,
716 						"[force] in compound literal");
717 				token = initializer(&cast->cast_expression, token);
718 				return postfix_expression(token, tree, cast);
719 			}
720 			*tree = cast;
721 			if (is_force)
722 				cast->type = EXPR_FORCE_CAST;
723 			token = cast_expression(token, &v);
724 			if (!v)
725 				return token;
726 			cast->cast_expression = v;
727 			return token;
728 		}
729 	}
730 	return unary_expression(token, tree);
731 }
732 
733 /*
734  * Generic left-to-right binop parsing
735  *
736  * This _really_ needs to be inlined, because that makes the inner
737  * function call statically deterministic rather than a totally
738  * unpredictable indirect call. But gcc-3 is so "clever" that it
739  * doesn't do so by default even when you tell it to inline it.
740  *
741  * Making it a macro avoids the inlining problem, and also means
742  * that we can pass in the op-comparison as an expression rather
743  * than create a data structure for it.
744  */
745 
746 #define LR_BINOP_EXPRESSION(__token, tree, type, inner, compare)	\
747 	struct expression *left = NULL;					\
748 	struct token * next = inner(__token, &left);			\
749 									\
750 	if (left) {							\
751 		while (token_type(next) == TOKEN_SPECIAL) {		\
752 			struct expression *top, *right = NULL;		\
753 			int op = next->special;				\
754 									\
755 			if (!(compare))					\
756 				goto out;				\
757 			top = alloc_expression(next->pos, type);	\
758 			next = inner(next->next, &right);		\
759 			if (!right) {					\
760 				sparse_error(next->pos, "No right hand side of '%s'-expression", show_special(op));	\
761 				break;					\
762 			}						\
763 			top->op = op;					\
764 			top->left = left;				\
765 			top->right = right;				\
766 			left = top;					\
767 		}							\
768 	}								\
769 out:									\
770 	*tree = left;							\
771 	return next;							\
772 
773 static struct token *multiplicative_expression(struct token *token, struct expression **tree)
774 {
775 	LR_BINOP_EXPRESSION(
776 		token, tree, EXPR_BINOP, cast_expression,
777 		(op == '*') || (op == '/') || (op == '%')
778 	);
779 }
780 
781 static struct token *additive_expression(struct token *token, struct expression **tree)
782 {
783 	LR_BINOP_EXPRESSION(
784 		token, tree, EXPR_BINOP, multiplicative_expression,
785 		(op == '+') || (op == '-')
786 	);
787 }
788 
789 static struct token *shift_expression(struct token *token, struct expression **tree)
790 {
791 	LR_BINOP_EXPRESSION(
792 		token, tree, EXPR_BINOP, additive_expression,
793 		(op == SPECIAL_LEFTSHIFT) || (op == SPECIAL_RIGHTSHIFT)
794 	);
795 }
796 
797 static struct token *relational_expression(struct token *token, struct expression **tree)
798 {
799 	LR_BINOP_EXPRESSION(
800 		token, tree, EXPR_COMPARE, shift_expression,
801 		(op == '<') || (op == '>') ||
802 		(op == SPECIAL_LTE) || (op == SPECIAL_GTE)
803 	);
804 }
805 
806 static struct token *equality_expression(struct token *token, struct expression **tree)
807 {
808 	LR_BINOP_EXPRESSION(
809 		token, tree, EXPR_COMPARE, relational_expression,
810 		(op == SPECIAL_EQUAL) || (op == SPECIAL_NOTEQUAL)
811 	);
812 }
813 
814 static struct token *bitwise_and_expression(struct token *token, struct expression **tree)
815 {
816 	LR_BINOP_EXPRESSION(
817 		token, tree, EXPR_BINOP, equality_expression,
818 		(op == '&')
819 	);
820 }
821 
822 static struct token *bitwise_xor_expression(struct token *token, struct expression **tree)
823 {
824 	LR_BINOP_EXPRESSION(
825 		token, tree, EXPR_BINOP, bitwise_and_expression,
826 		(op == '^')
827 	);
828 }
829 
830 static struct token *bitwise_or_expression(struct token *token, struct expression **tree)
831 {
832 	LR_BINOP_EXPRESSION(
833 		token, tree, EXPR_BINOP, bitwise_xor_expression,
834 		(op == '|')
835 	);
836 }
837 
838 static struct token *logical_and_expression(struct token *token, struct expression **tree)
839 {
840 	LR_BINOP_EXPRESSION(
841 		token, tree, EXPR_LOGICAL, bitwise_or_expression,
842 		(op == SPECIAL_LOGICAL_AND)
843 	);
844 }
845 
846 static struct token *logical_or_expression(struct token *token, struct expression **tree)
847 {
848 	LR_BINOP_EXPRESSION(
849 		token, tree, EXPR_LOGICAL, logical_and_expression,
850 		(op == SPECIAL_LOGICAL_OR)
851 	);
852 }
853 
854 struct token *conditional_expression(struct token *token, struct expression **tree)
855 {
856 	token = logical_or_expression(token, tree);
857 	if (*tree && match_op(token, '?')) {
858 		struct expression *expr = alloc_expression(token->pos, EXPR_CONDITIONAL);
859 		expr->op = token->special;
860 		expr->left = *tree;
861 		*tree = expr;
862 		token = parse_expression(token->next, &expr->cond_true);
863 		token = expect(token, ':', "in conditional expression");
864 		token = conditional_expression(token, &expr->cond_false);
865 	}
866 	return token;
867 }
868 
869 struct token *assignment_expression(struct token *token, struct expression **tree)
870 {
871 	token = conditional_expression(token, tree);
872 	if (*tree && token_type(token) == TOKEN_SPECIAL) {
873 		static const int assignments[] = {
874 			'=',
875 			SPECIAL_ADD_ASSIGN, SPECIAL_SUB_ASSIGN,
876 			SPECIAL_MUL_ASSIGN, SPECIAL_DIV_ASSIGN,
877 			SPECIAL_MOD_ASSIGN, SPECIAL_SHL_ASSIGN,
878 			SPECIAL_SHR_ASSIGN, SPECIAL_AND_ASSIGN,
879 			SPECIAL_OR_ASSIGN,  SPECIAL_XOR_ASSIGN };
880 		int i, op = token->special;
881 		for (i = 0; i < ARRAY_SIZE(assignments); i++)
882 			if (assignments[i] == op) {
883 				struct expression * expr = alloc_expression(token->pos, EXPR_ASSIGNMENT);
884 				expr->left = *tree;
885 				expr->op = op;
886 				*tree = expr;
887 				return assignment_expression(token->next, &expr->right);
888 			}
889 	}
890 	return token;
891 }
892 
893 static struct token *comma_expression(struct token *token, struct expression **tree)
894 {
895 	LR_BINOP_EXPRESSION(
896 		token, tree, EXPR_COMMA, assignment_expression,
897 		(op == ',')
898 	);
899 }
900 
901 struct token *parse_expression(struct token *token, struct expression **tree)
902 {
903 	return comma_expression(token,tree);
904 }
905 
906 
907