xref: /illumos-gate/usr/src/tools/smatch/src/evaluate.c (revision f67950b2)
1 /*
2  * sparse/evaluate.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  * Evaluate constant expressions.
26  */
27 #include <stdlib.h>
28 #include <stdarg.h>
29 #include <stddef.h>
30 #include <stdio.h>
31 #include <string.h>
32 #include <ctype.h>
33 #include <unistd.h>
34 #include <fcntl.h>
35 #include <limits.h>
36 
37 #include "lib.h"
38 #include "allocate.h"
39 #include "parse.h"
40 #include "token.h"
41 #include "symbol.h"
42 #include "target.h"
43 #include "expression.h"
44 
45 struct symbol *current_fn;
46 
47 static struct symbol *degenerate(struct expression *expr);
48 static struct symbol *evaluate_symbol(struct symbol *sym);
49 
50 static struct symbol *evaluate_symbol_expression(struct expression *expr)
51 {
52 	struct expression *addr;
53 	struct symbol *sym = expr->symbol;
54 	struct symbol *base_type;
55 
56 	if (!sym) {
57 		expression_error(expr, "undefined identifier '%s'", show_ident(expr->symbol_name));
58 		return NULL;
59 	}
60 
61 	examine_symbol_type(sym);
62 
63 	base_type = get_base_type(sym);
64 	if (!base_type) {
65 		expression_error(expr, "identifier '%s' has no type", show_ident(expr->symbol_name));
66 		return NULL;
67 	}
68 
69 	addr = alloc_expression(expr->pos, EXPR_SYMBOL);
70 	addr->symbol = sym;
71 	addr->symbol_name = expr->symbol_name;
72 	addr->ctype = &lazy_ptr_ctype;	/* Lazy evaluation: we need to do a proper job if somebody does &sym */
73 	addr->flags = expr->flags;
74 	expr->type = EXPR_PREOP;
75 	expr->op = '*';
76 	expr->unop = addr;
77 	expr->flags = CEF_NONE;
78 
79 	/* The type of a symbol is the symbol itself! */
80 	expr->ctype = sym;
81 	return sym;
82 }
83 
84 static struct symbol *evaluate_string(struct expression *expr)
85 {
86 	struct symbol *sym = alloc_symbol(expr->pos, SYM_NODE);
87 	struct symbol *array = alloc_symbol(expr->pos, SYM_ARRAY);
88 	struct expression *addr = alloc_expression(expr->pos, EXPR_SYMBOL);
89 	struct expression *initstr = alloc_expression(expr->pos, EXPR_STRING);
90 	unsigned int length = expr->string->length;
91 
92 	sym->array_size = alloc_const_expression(expr->pos, length);
93 	sym->bit_size = bytes_to_bits(length);
94 	sym->ctype.alignment = 1;
95 	sym->string = 1;
96 	sym->ctype.modifiers = MOD_STATIC;
97 	sym->ctype.base_type = array;
98 	sym->initializer = initstr;
99 
100 	initstr->ctype = sym;
101 	initstr->string = expr->string;
102 
103 	array->array_size = sym->array_size;
104 	array->bit_size = bytes_to_bits(length);
105 	array->ctype.alignment = 1;
106 	array->ctype.modifiers = MOD_STATIC;
107 	array->ctype.base_type = &char_ctype;
108 
109 	addr->symbol = sym;
110 	addr->ctype = &lazy_ptr_ctype;
111 	addr->flags = CEF_ADDR;
112 
113 	expr->type = EXPR_PREOP;
114 	expr->op = '*';
115 	expr->unop = addr;
116 	expr->ctype = sym;
117 	return sym;
118 }
119 
120 /* type has come from classify_type and is an integer type */
121 static inline struct symbol *integer_promotion(struct symbol *type)
122 {
123 	unsigned long mod =  type->ctype.modifiers;
124 	int width = type->bit_size;
125 
126 	/*
127 	 * Bitfields always promote to the base type,
128 	 * even if the bitfield might be bigger than
129 	 * an "int".
130 	 */
131 	if (type->type == SYM_BITFIELD) {
132 		type = type->ctype.base_type;
133 	}
134 	mod = type->ctype.modifiers;
135 	if (width < bits_in_int)
136 		return &int_ctype;
137 
138 	/* If char/short has as many bits as int, it still gets "promoted" */
139 	if (mod & (MOD_CHAR | MOD_SHORT)) {
140 		if (mod & MOD_UNSIGNED)
141 			return &uint_ctype;
142 		return &int_ctype;
143 	}
144 	return type;
145 }
146 
147 /*
148  * integer part of usual arithmetic conversions:
149  *	integer promotions are applied
150  *	if left and right are identical, we are done
151  *	if signedness is the same, convert one with lower rank
152  *	unless unsigned argument has rank lower than signed one, convert the
153  *	signed one.
154  *	if signed argument is bigger than unsigned one, convert the unsigned.
155  *	otherwise, convert signed.
156  *
157  * Leaving aside the integer promotions, that is equivalent to
158  *	if identical, don't convert
159  *	if left is bigger than right, convert right
160  *	if right is bigger than left, convert right
161  *	otherwise, if signedness is the same, convert one with lower rank
162  *	otherwise convert the signed one.
163  */
164 static struct symbol *bigger_int_type(struct symbol *left, struct symbol *right)
165 {
166 	unsigned long lmod, rmod;
167 
168 	left = integer_promotion(left);
169 	right = integer_promotion(right);
170 
171 	if (left == right)
172 		goto left;
173 
174 	if (left->bit_size > right->bit_size)
175 		goto left;
176 
177 	if (right->bit_size > left->bit_size)
178 		goto right;
179 
180 	lmod = left->ctype.modifiers;
181 	rmod = right->ctype.modifiers;
182 	if ((lmod ^ rmod) & MOD_UNSIGNED) {
183 		if (lmod & MOD_UNSIGNED)
184 			goto left;
185 	} else if ((lmod & ~rmod) & (MOD_LONG_ALL))
186 		goto left;
187 right:
188 	left = right;
189 left:
190 	return left;
191 }
192 
193 static int same_cast_type(struct symbol *orig, struct symbol *new)
194 {
195 	return orig->bit_size == new->bit_size &&
196 	       orig->bit_offset == new->bit_offset;
197 }
198 
199 static struct symbol *base_type(struct symbol *node, unsigned long *modp, unsigned long *asp)
200 {
201 	unsigned long mod, as;
202 
203 	mod = 0; as = 0;
204 	while (node) {
205 		mod |= node->ctype.modifiers;
206 		as |= node->ctype.as;
207 		if (node->type == SYM_NODE) {
208 			node = node->ctype.base_type;
209 			continue;
210 		}
211 		break;
212 	}
213 	*modp = mod & ~MOD_IGNORE;
214 	*asp = as;
215 	return node;
216 }
217 
218 static int is_same_type(struct expression *expr, struct symbol *new)
219 {
220 	struct symbol *old = expr->ctype;
221 	unsigned long oldmod, newmod, oldas, newas;
222 
223 	old = base_type(old, &oldmod, &oldas);
224 	new = base_type(new, &newmod, &newas);
225 
226 	/* Same base type, same address space? */
227 	if (old == new && oldas == newas) {
228 		unsigned long difmod;
229 
230 		/* Check the modifier bits. */
231 		difmod = (oldmod ^ newmod) & ~MOD_NOCAST;
232 
233 		/* Exact same type? */
234 		if (!difmod)
235 			return 1;
236 
237 		/*
238 		 * Not the same type, but differs only in "const".
239 		 * Don't warn about MOD_NOCAST.
240 		 */
241 		if (difmod == MOD_CONST)
242 			return 0;
243 	}
244 	if ((oldmod | newmod) & MOD_NOCAST) {
245 		const char *tofrom = "to/from";
246 		if (!(newmod & MOD_NOCAST))
247 			tofrom = "from";
248 		if (!(oldmod & MOD_NOCAST))
249 			tofrom = "to";
250 		warning(expr->pos, "implicit cast %s nocast type", tofrom);
251 	}
252 	return 0;
253 }
254 
255 static void
256 warn_for_different_enum_types (struct position pos,
257 			       struct symbol *typea,
258 			       struct symbol *typeb)
259 {
260 	if (!Wenum_mismatch)
261 		return;
262 	if (typea->type == SYM_NODE)
263 		typea = typea->ctype.base_type;
264 	if (typeb->type == SYM_NODE)
265 		typeb = typeb->ctype.base_type;
266 
267 	if (typea == typeb)
268 		return;
269 
270 	if (typea->type == SYM_ENUM && typeb->type == SYM_ENUM) {
271 		warning(pos, "mixing different enum types");
272 		info(pos, "    %s versus", show_typename(typea));
273 		info(pos, "    %s", show_typename(typeb));
274 	}
275 }
276 
277 static int cast_flags(struct expression *expr, struct expression *target);
278 static struct symbol *cast_to_bool(struct expression *expr);
279 
280 /*
281  * This gets called for implicit casts in assignments and
282  * integer promotion. We often want to try to move the
283  * cast down, because the ops involved may have been
284  * implicitly cast up, and we can get rid of the casts
285  * early.
286  */
287 static struct expression * cast_to(struct expression *old, struct symbol *type)
288 {
289 	struct expression *expr;
290 
291 	warn_for_different_enum_types (old->pos, old->ctype, type);
292 
293 	if (old->ctype != &null_ctype && is_same_type(old, type))
294 		return old;
295 
296 	/*
297 	 * See if we can simplify the op. Move the cast down.
298 	 */
299 	switch (old->type) {
300 	case EXPR_PREOP:
301 		if (old->ctype->bit_size < type->bit_size)
302 			break;
303 		if (old->op == '~') {
304 			old->ctype = type;
305 			old->unop = cast_to(old->unop, type);
306 			return old;
307 		}
308 		break;
309 
310 	case EXPR_IMPLIED_CAST:
311 		warn_for_different_enum_types(old->pos, old->ctype, type);
312 
313 		if (old->ctype->bit_size >= type->bit_size) {
314 			struct expression *orig = old->cast_expression;
315 			if (same_cast_type(orig->ctype, type))
316 				return orig;
317 			if (old->ctype->bit_offset == type->bit_offset) {
318 				old->ctype = type;
319 				old->cast_type = type;
320 				return old;
321 			}
322 		}
323 		break;
324 
325 	default:
326 		/* nothing */;
327 	}
328 
329 	expr = alloc_expression(old->pos, EXPR_IMPLIED_CAST);
330 	expr->ctype = type;
331 	expr->cast_type = type;
332 	expr->cast_expression = old;
333 	expr->flags = cast_flags(expr, old);
334 
335 	if (is_bool_type(type))
336 		cast_to_bool(expr);
337 
338 	return expr;
339 }
340 
341 enum {
342 	TYPE_NUM = 1,
343 	TYPE_BITFIELD = 2,
344 	TYPE_RESTRICT = 4,
345 	TYPE_FLOAT = 8,
346 	TYPE_PTR = 16,
347 	TYPE_COMPOUND = 32,
348 	TYPE_FOULED = 64,
349 	TYPE_FN = 128,
350 };
351 
352 static inline int classify_type(struct symbol *type, struct symbol **base)
353 {
354 	static int type_class[SYM_BAD + 1] = {
355 		[SYM_PTR] = TYPE_PTR,
356 		[SYM_FN] = TYPE_PTR | TYPE_FN,
357 		[SYM_ARRAY] = TYPE_PTR | TYPE_COMPOUND,
358 		[SYM_STRUCT] = TYPE_COMPOUND,
359 		[SYM_UNION] = TYPE_COMPOUND,
360 		[SYM_BITFIELD] = TYPE_NUM | TYPE_BITFIELD,
361 		[SYM_RESTRICT] = TYPE_NUM | TYPE_RESTRICT,
362 		[SYM_FOULED] = TYPE_NUM | TYPE_RESTRICT | TYPE_FOULED,
363 	};
364 	if (type->type == SYM_NODE)
365 		type = type->ctype.base_type;
366 	if (type->type == SYM_TYPEOF) {
367 		type = evaluate_expression(type->initializer);
368 		if (!type)
369 			type = &bad_ctype;
370 		else if (type->type == SYM_NODE)
371 			type = type->ctype.base_type;
372 	}
373 	if (type->type == SYM_ENUM)
374 		type = type->ctype.base_type;
375 	*base = type;
376 	if (type->type == SYM_BASETYPE) {
377 		if (type->ctype.base_type == &int_type)
378 			return TYPE_NUM;
379 		if (type->ctype.base_type == &fp_type)
380 			return TYPE_NUM | TYPE_FLOAT;
381 	}
382 	return type_class[type->type];
383 }
384 
385 #define is_int(class) ((class & (TYPE_NUM | TYPE_FLOAT)) == TYPE_NUM)
386 
387 static inline int is_string_type(struct symbol *type)
388 {
389 	if (type->type == SYM_NODE)
390 		type = type->ctype.base_type;
391 	return type->type == SYM_ARRAY && is_byte_type(type->ctype.base_type);
392 }
393 
394 static struct symbol *bad_expr_type(struct expression *expr)
395 {
396 	sparse_error(expr->pos, "incompatible types for operation (%s)", show_special(expr->op));
397 	switch (expr->type) {
398 	case EXPR_BINOP:
399 	case EXPR_COMPARE:
400 		info(expr->pos, "   left side has type %s", show_typename(expr->left->ctype));
401 		info(expr->pos, "   right side has type %s", show_typename(expr->right->ctype));
402 		break;
403 	case EXPR_PREOP:
404 	case EXPR_POSTOP:
405 		info(expr->pos, "   argument has type %s", show_typename(expr->unop->ctype));
406 		break;
407 	default:
408 		break;
409 	}
410 
411 	expr->flags = CEF_NONE;
412 	return expr->ctype = &bad_ctype;
413 }
414 
415 static int restricted_value(struct expression *v, struct symbol *type)
416 {
417 	if (v->type != EXPR_VALUE)
418 		return 1;
419 	if (v->value != 0)
420 		return 1;
421 	return 0;
422 }
423 
424 static int restricted_binop(int op, struct symbol *type)
425 {
426 	switch (op) {
427 		case '&':
428 		case '=':
429 		case SPECIAL_AND_ASSIGN:
430 		case SPECIAL_OR_ASSIGN:
431 		case SPECIAL_XOR_ASSIGN:
432 			return 1;	/* unfoul */
433 		case '|':
434 		case '^':
435 		case '?':
436 			return 2;	/* keep fouled */
437 		case SPECIAL_EQUAL:
438 		case SPECIAL_NOTEQUAL:
439 			return 3;	/* warn if fouled */
440 		default:
441 			return 0;	/* warn */
442 	}
443 }
444 
445 static int restricted_unop(int op, struct symbol **type)
446 {
447 	if (op == '~') {
448 		if ((*type)->bit_size < bits_in_int)
449 			*type = befoul(*type);
450 		return 0;
451 	} if (op == '+')
452 		return 0;
453 	return 1;
454 }
455 
456 /* type should be SYM_FOULED */
457 static inline struct symbol *unfoul(struct symbol *type)
458 {
459 	return type->ctype.base_type;
460 }
461 
462 static struct symbol *restricted_binop_type(int op,
463 					struct expression *left,
464 					struct expression *right,
465 					int lclass, int rclass,
466 					struct symbol *ltype,
467 					struct symbol *rtype)
468 {
469 	struct symbol *ctype = NULL;
470 	if (lclass & TYPE_RESTRICT) {
471 		if (rclass & TYPE_RESTRICT) {
472 			if (ltype == rtype) {
473 				ctype = ltype;
474 			} else if (lclass & TYPE_FOULED) {
475 				if (unfoul(ltype) == rtype)
476 					ctype = ltype;
477 			} else if (rclass & TYPE_FOULED) {
478 				if (unfoul(rtype) == ltype)
479 					ctype = rtype;
480 			}
481 		} else {
482 			if (!restricted_value(right, ltype))
483 				ctype = ltype;
484 		}
485 	} else if (!restricted_value(left, rtype))
486 		ctype = rtype;
487 
488 	if (ctype) {
489 		switch (restricted_binop(op, ctype)) {
490 		case 1:
491 			if ((lclass ^ rclass) & TYPE_FOULED)
492 				ctype = unfoul(ctype);
493 			break;
494 		case 3:
495 			if (!(lclass & rclass & TYPE_FOULED))
496 				break;
497 		case 0:
498 			ctype = NULL;
499 		default:
500 			break;
501 		}
502 	}
503 
504 	return ctype;
505 }
506 
507 static inline void unrestrict(struct expression *expr,
508 			      int class, struct symbol **ctype)
509 {
510 	if (class & TYPE_RESTRICT) {
511 		if (class & TYPE_FOULED)
512 			*ctype = unfoul(*ctype);
513 		warning(expr->pos, "%s degrades to integer",
514 			show_typename(*ctype));
515 		*ctype = (*ctype)->ctype.base_type; /* get to arithmetic type */
516 	}
517 }
518 
519 static struct symbol *usual_conversions(int op,
520 					struct expression *left,
521 					struct expression *right,
522 					int lclass, int rclass,
523 					struct symbol *ltype,
524 					struct symbol *rtype)
525 {
526 	struct symbol *ctype;
527 
528 	warn_for_different_enum_types(right->pos, left->ctype, right->ctype);
529 
530 	if ((lclass | rclass) & TYPE_RESTRICT)
531 		goto Restr;
532 
533 Normal:
534 	if (!(lclass & TYPE_FLOAT)) {
535 		if (!(rclass & TYPE_FLOAT))
536 			return bigger_int_type(ltype, rtype);
537 		else
538 			return rtype;
539 	} else if (rclass & TYPE_FLOAT) {
540 		unsigned long lmod = ltype->ctype.modifiers;
541 		unsigned long rmod = rtype->ctype.modifiers;
542 		if (rmod & ~lmod & (MOD_LONG_ALL))
543 			return rtype;
544 		else
545 			return ltype;
546 	} else
547 		return ltype;
548 
549 Restr:
550 	ctype = restricted_binop_type(op, left, right,
551 				      lclass, rclass, ltype, rtype);
552 	if (ctype)
553 		return ctype;
554 
555 	unrestrict(left, lclass, &ltype);
556 	unrestrict(right, rclass, &rtype);
557 
558 	goto Normal;
559 }
560 
561 static inline int lvalue_expression(struct expression *expr)
562 {
563 	return expr->type == EXPR_PREOP && expr->op == '*';
564 }
565 
566 static struct symbol *evaluate_ptr_add(struct expression *expr, struct symbol *itype)
567 {
568 	struct expression *index = expr->right;
569 	struct symbol *ctype, *base;
570 	int multiply;
571 
572 	classify_type(degenerate(expr->left), &ctype);
573 	base = examine_pointer_target(ctype);
574 
575 	/*
576 	 * An address constant +/- an integer constant expression
577 	 * yields an address constant again [6.6(7)].
578 	 */
579 	if ((expr->left->flags & CEF_ADDR) && (expr->right->flags & CEF_ICE))
580 		expr->flags = CEF_ADDR;
581 
582 	if (!base) {
583 		expression_error(expr, "missing type information");
584 		return NULL;
585 	}
586 	if (is_function(base)) {
587 		expression_error(expr, "arithmetics on pointers to functions");
588 		return NULL;
589 	}
590 
591 	/* Get the size of whatever the pointer points to */
592 	multiply = is_void_type(base) ? 1 : bits_to_bytes(base->bit_size);
593 
594 	if (ctype == &null_ctype)
595 		ctype = &ptr_ctype;
596 	expr->ctype = ctype;
597 
598 	if (multiply == 1 && itype->bit_size >= bits_in_pointer)
599 		return ctype;
600 
601 	if (index->type == EXPR_VALUE) {
602 		struct expression *val = alloc_expression(expr->pos, EXPR_VALUE);
603 		unsigned long long v = index->value, mask;
604 		mask = 1ULL << (itype->bit_size - 1);
605 		if (v & mask)
606 			v |= -mask;
607 		else
608 			v &= mask - 1;
609 		v *= multiply;
610 		mask = 1ULL << (bits_in_pointer - 1);
611 		v &= mask | (mask - 1);
612 		val->value = v;
613 		val->ctype = ssize_t_ctype;
614 		expr->right = val;
615 		return ctype;
616 	}
617 
618 	if (itype->bit_size < bits_in_pointer)
619 		index = cast_to(index, ssize_t_ctype);
620 
621 	if (multiply > 1) {
622 		struct expression *val = alloc_expression(expr->pos, EXPR_VALUE);
623 		struct expression *mul = alloc_expression(expr->pos, EXPR_BINOP);
624 
625 		val->ctype = ssize_t_ctype;
626 		val->value = multiply;
627 
628 		mul->op = '*';
629 		mul->ctype = ssize_t_ctype;
630 		mul->left = index;
631 		mul->right = val;
632 		index = mul;
633 	}
634 
635 	expr->right = index;
636 	return ctype;
637 }
638 
639 static void examine_fn_arguments(struct symbol *fn);
640 
641 #define MOD_IGN (MOD_VOLATILE | MOD_CONST | MOD_PURE)
642 
643 const char *type_difference(struct ctype *c1, struct ctype *c2,
644 	unsigned long mod1, unsigned long mod2)
645 {
646 	unsigned long as1 = c1->as, as2 = c2->as;
647 	struct symbol *t1 = c1->base_type;
648 	struct symbol *t2 = c2->base_type;
649 	int move1 = 1, move2 = 1;
650 	mod1 |= c1->modifiers;
651 	mod2 |= c2->modifiers;
652 	for (;;) {
653 		unsigned long diff;
654 		int type;
655 		struct symbol *base1 = t1->ctype.base_type;
656 		struct symbol *base2 = t2->ctype.base_type;
657 
658 		/*
659 		 * FIXME! Collect alignment and context too here!
660 		 */
661 		if (move1) {
662 			if (t1 && t1->type != SYM_PTR) {
663 				mod1 |= t1->ctype.modifiers;
664 				as1 |= t1->ctype.as;
665 			}
666 			move1 = 0;
667 		}
668 
669 		if (move2) {
670 			if (t2 && t2->type != SYM_PTR) {
671 				mod2 |= t2->ctype.modifiers;
672 				as2 |= t2->ctype.as;
673 			}
674 			move2 = 0;
675 		}
676 
677 		if (t1 == t2)
678 			break;
679 		if (!t1 || !t2)
680 			return "different types";
681 
682 		if (t1->type == SYM_NODE || t1->type == SYM_ENUM) {
683 			t1 = base1;
684 			move1 = 1;
685 			if (!t1)
686 				return "bad types";
687 			continue;
688 		}
689 
690 		if (t2->type == SYM_NODE || t2->type == SYM_ENUM) {
691 			t2 = base2;
692 			move2 = 1;
693 			if (!t2)
694 				return "bad types";
695 			continue;
696 		}
697 
698 		move1 = move2 = 1;
699 		type = t1->type;
700 		if (type != t2->type)
701 			return "different base types";
702 
703 		switch (type) {
704 		default:
705 			sparse_error(t1->pos,
706 				     "internal error: bad type in derived(%d)",
707 				     type);
708 			return "bad types";
709 		case SYM_RESTRICT:
710 			return "different base types";
711 		case SYM_UNION:
712 		case SYM_STRUCT:
713 			/* allow definition of incomplete structs and unions */
714 			if (t1->ident == t2->ident)
715 			  return NULL;
716 			return "different base types";
717 		case SYM_ARRAY:
718 			/* XXX: we ought to compare sizes */
719 			break;
720 		case SYM_PTR:
721 			if (as1 != as2)
722 				return "different address spaces";
723 			/* MOD_SPECIFIER is due to idiocy in parse.c */
724 			if ((mod1 ^ mod2) & ~MOD_IGNORE & ~MOD_SPECIFIER)
725 				return "different modifiers";
726 			/* we could be lazier here */
727 			base1 = examine_pointer_target(t1);
728 			base2 = examine_pointer_target(t2);
729 			mod1 = t1->ctype.modifiers;
730 			as1 = t1->ctype.as;
731 			mod2 = t2->ctype.modifiers;
732 			as2 = t2->ctype.as;
733 			break;
734 		case SYM_FN: {
735 			struct symbol *arg1, *arg2;
736 			int i;
737 
738 			if (as1 != as2)
739 				return "different address spaces";
740 			if ((mod1 ^ mod2) & ~MOD_IGNORE & ~MOD_SIGNEDNESS)
741 				return "different modifiers";
742 			mod1 = t1->ctype.modifiers;
743 			as1 = t1->ctype.as;
744 			mod2 = t2->ctype.modifiers;
745 			as2 = t2->ctype.as;
746 
747 			if (t1->variadic != t2->variadic)
748 				return "incompatible variadic arguments";
749 			examine_fn_arguments(t1);
750 			examine_fn_arguments(t2);
751 			PREPARE_PTR_LIST(t1->arguments, arg1);
752 			PREPARE_PTR_LIST(t2->arguments, arg2);
753 			i = 1;
754 			for (;;) {
755 				const char *diffstr;
756 				if (!arg1 && !arg2)
757 					break;
758 				if (!arg1 || !arg2)
759 					return "different argument counts";
760 				diffstr = type_difference(&arg1->ctype,
761 							  &arg2->ctype,
762 							  MOD_IGN, MOD_IGN);
763 				if (diffstr) {
764 					static char argdiff[80];
765 					sprintf(argdiff, "incompatible argument %d (%s)", i, diffstr);
766 					return argdiff;
767 				}
768 				NEXT_PTR_LIST(arg1);
769 				NEXT_PTR_LIST(arg2);
770 				i++;
771 			}
772 			FINISH_PTR_LIST(arg2);
773 			FINISH_PTR_LIST(arg1);
774 			break;
775 		}
776 		case SYM_BASETYPE:
777 			if (as1 != as2)
778 				return "different address spaces";
779 			if (base1 != base2)
780 				return "different base types";
781 			diff = (mod1 ^ mod2) & ~MOD_IGNORE;
782 			if (!diff)
783 				return NULL;
784 			if (diff & MOD_SIZE)
785 				return "different type sizes";
786 			else if (diff & ~MOD_SIGNEDNESS)
787 				return "different modifiers";
788 			else
789 				return "different signedness";
790 		}
791 		t1 = base1;
792 		t2 = base2;
793 	}
794 	if (as1 != as2)
795 		return "different address spaces";
796 	if ((mod1 ^ mod2) & ~MOD_IGNORE & ~MOD_SIGNEDNESS)
797 		return "different modifiers";
798 	return NULL;
799 }
800 
801 static void bad_null(struct expression *expr)
802 {
803 	if (Wnon_pointer_null)
804 		warning(expr->pos, "Using plain integer as NULL pointer");
805 }
806 
807 static unsigned long target_qualifiers(struct symbol *type)
808 {
809 	unsigned long mod = type->ctype.modifiers & MOD_IGN;
810 	if (type->ctype.base_type && type->ctype.base_type->type == SYM_ARRAY)
811 		mod = 0;
812 	return mod;
813 }
814 
815 static struct symbol *evaluate_ptr_sub(struct expression *expr)
816 {
817 	const char *typediff;
818 	struct symbol *ltype, *rtype;
819 	struct expression *l = expr->left;
820 	struct expression *r = expr->right;
821 	struct symbol *lbase;
822 
823 	classify_type(degenerate(l), &ltype);
824 	classify_type(degenerate(r), &rtype);
825 
826 	lbase = examine_pointer_target(ltype);
827 	examine_pointer_target(rtype);
828 	typediff = type_difference(&ltype->ctype, &rtype->ctype,
829 				   target_qualifiers(rtype),
830 				   target_qualifiers(ltype));
831 	if (typediff)
832 		expression_error(expr, "subtraction of different types can't work (%s)", typediff);
833 
834 	if (is_function(lbase)) {
835 		expression_error(expr, "subtraction of functions? Share your drugs");
836 		return NULL;
837 	}
838 
839 	expr->ctype = ssize_t_ctype;
840 	if (lbase->bit_size > bits_in_char) {
841 		struct expression *sub = alloc_expression(expr->pos, EXPR_BINOP);
842 		struct expression *div = expr;
843 		struct expression *val = alloc_expression(expr->pos, EXPR_VALUE);
844 		unsigned long value = bits_to_bytes(lbase->bit_size);
845 
846 		val->ctype = size_t_ctype;
847 		val->value = value;
848 
849 		if (value & (value-1)) {
850 			if (Wptr_subtraction_blows)
851 				warning(expr->pos, "potentially expensive pointer subtraction");
852 		}
853 
854 		sub->op = '-';
855 		sub->ctype = ssize_t_ctype;
856 		sub->left = l;
857 		sub->right = r;
858 
859 		div->op = '/';
860 		div->left = sub;
861 		div->right = val;
862 	}
863 
864 	return ssize_t_ctype;
865 }
866 
867 #define is_safe_type(type) ((type)->ctype.modifiers & MOD_SAFE)
868 
869 static struct symbol *evaluate_conditional(struct expression *expr, int iterator)
870 {
871 	struct symbol *ctype;
872 
873 	if (!expr)
874 		return NULL;
875 
876 	if (!iterator && expr->type == EXPR_ASSIGNMENT && expr->op == '=')
877 		warning(expr->pos, "assignment expression in conditional");
878 
879 	ctype = evaluate_expression(expr);
880 	if (ctype) {
881 		if (is_safe_type(ctype))
882 			warning(expr->pos, "testing a 'safe expression'");
883 		if (is_func_type(ctype)) {
884 			if (Waddress)
885 				warning(expr->pos, "the address of %s will always evaluate as true", "a function");
886 		} else if (is_array_type(ctype)) {
887 			if (Waddress)
888 				warning(expr->pos, "the address of %s will always evaluate as true", "an array");
889 		} else if (!is_scalar_type(ctype)) {
890 			sparse_error(expr->pos, "incorrect type in conditional");
891 			info(expr->pos, "   got %s", show_typename(ctype));
892 			ctype = NULL;
893 		}
894 	}
895 	ctype = degenerate(expr);
896 
897 	return ctype;
898 }
899 
900 static struct symbol *evaluate_logical(struct expression *expr)
901 {
902 	if (!evaluate_conditional(expr->left, 0))
903 		return NULL;
904 	if (!evaluate_conditional(expr->right, 0))
905 		return NULL;
906 
907 	/* the result is int [6.5.13(3), 6.5.14(3)] */
908 	expr->ctype = &int_ctype;
909 	expr->flags = expr->left->flags & expr->right->flags;
910 	expr->flags &= ~(CEF_CONST_MASK | CEF_ADDR);
911 	return &int_ctype;
912 }
913 
914 static struct symbol *evaluate_binop(struct expression *expr)
915 {
916 	struct symbol *ltype, *rtype, *ctype;
917 	int lclass = classify_type(expr->left->ctype, &ltype);
918 	int rclass = classify_type(expr->right->ctype, &rtype);
919 	int op = expr->op;
920 
921 	/* number op number */
922 	if (lclass & rclass & TYPE_NUM) {
923 		expr->flags = expr->left->flags & expr->right->flags;
924 		expr->flags &= ~CEF_CONST_MASK;
925 
926 		if ((lclass | rclass) & TYPE_FLOAT) {
927 			switch (op) {
928 			case '+': case '-': case '*': case '/':
929 				break;
930 			default:
931 				return bad_expr_type(expr);
932 			}
933 		}
934 
935 		if (op == SPECIAL_LEFTSHIFT || op == SPECIAL_RIGHTSHIFT) {
936 			// shifts do integer promotions, but that's it.
937 			unrestrict(expr->left, lclass, &ltype);
938 			unrestrict(expr->right, rclass, &rtype);
939 			ctype = ltype = integer_promotion(ltype);
940 			rtype = integer_promotion(rtype);
941 		} else {
942 			// The rest do usual conversions
943 			const unsigned left_not  = expr->left->type == EXPR_PREOP
944 			                           && expr->left->op == '!';
945 			const unsigned right_not = expr->right->type == EXPR_PREOP
946 			                           && expr->right->op == '!';
947 			if ((op == '&' || op == '|') && (left_not || right_not))
948 				warning(expr->pos, "dubious: %sx %c %sy",
949 				        left_not ? "!" : "",
950 					op,
951 					right_not ? "!" : "");
952 
953 			ltype = usual_conversions(op, expr->left, expr->right,
954 						  lclass, rclass, ltype, rtype);
955 			ctype = rtype = ltype;
956 		}
957 
958 		expr->left = cast_to(expr->left, ltype);
959 		expr->right = cast_to(expr->right, rtype);
960 		expr->ctype = ctype;
961 		return ctype;
962 	}
963 
964 	/* pointer (+|-) integer */
965 	if (lclass & TYPE_PTR && is_int(rclass) && (op == '+' || op == '-')) {
966 		unrestrict(expr->right, rclass, &rtype);
967 		return evaluate_ptr_add(expr, rtype);
968 	}
969 
970 	/* integer + pointer */
971 	if (rclass & TYPE_PTR && is_int(lclass) && op == '+') {
972 		struct expression *index = expr->left;
973 		unrestrict(index, lclass, &ltype);
974 		expr->left = expr->right;
975 		expr->right = index;
976 		return evaluate_ptr_add(expr, ltype);
977 	}
978 
979 	/* pointer - pointer */
980 	if (lclass & rclass & TYPE_PTR && expr->op == '-')
981 		return evaluate_ptr_sub(expr);
982 
983 	return bad_expr_type(expr);
984 }
985 
986 static struct symbol *evaluate_comma(struct expression *expr)
987 {
988 	expr->ctype = degenerate(expr->right);
989 	if (expr->ctype == &null_ctype)
990 		expr->ctype = &ptr_ctype;
991 	expr->flags &= expr->left->flags & expr->right->flags;
992 	return expr->ctype;
993 }
994 
995 static int modify_for_unsigned(int op)
996 {
997 	if (op == '<')
998 		op = SPECIAL_UNSIGNED_LT;
999 	else if (op == '>')
1000 		op = SPECIAL_UNSIGNED_GT;
1001 	else if (op == SPECIAL_LTE)
1002 		op = SPECIAL_UNSIGNED_LTE;
1003 	else if (op == SPECIAL_GTE)
1004 		op = SPECIAL_UNSIGNED_GTE;
1005 	return op;
1006 }
1007 
1008 static inline int is_null_pointer_constant(struct expression *e)
1009 {
1010 	if (e->ctype == &null_ctype)
1011 		return 1;
1012 	if (!(e->flags & CEF_ICE))
1013 		return 0;
1014 	return is_zero_constant(e) ? 2 : 0;
1015 }
1016 
1017 static struct symbol *evaluate_compare(struct expression *expr)
1018 {
1019 	struct expression *left = expr->left, *right = expr->right;
1020 	struct symbol *ltype, *rtype, *lbase, *rbase;
1021 	int lclass = classify_type(degenerate(left), &ltype);
1022 	int rclass = classify_type(degenerate(right), &rtype);
1023 	struct symbol *ctype;
1024 	const char *typediff;
1025 
1026 	/* Type types? */
1027 	if (is_type_type(ltype) && is_type_type(rtype)) {
1028 		/*
1029 		 * __builtin_types_compatible_p() yields an integer
1030 		 * constant expression
1031 		 */
1032 		expr->flags = CEF_SET_ICE;
1033 		goto OK;
1034 	}
1035 
1036 	if (is_safe_type(left->ctype) || is_safe_type(right->ctype))
1037 		warning(expr->pos, "testing a 'safe expression'");
1038 
1039 	expr->flags = left->flags & right->flags & ~CEF_CONST_MASK & ~CEF_ADDR;
1040 
1041 	/* number on number */
1042 	if (lclass & rclass & TYPE_NUM) {
1043 		ctype = usual_conversions(expr->op, expr->left, expr->right,
1044 					  lclass, rclass, ltype, rtype);
1045 		expr->left = cast_to(expr->left, ctype);
1046 		expr->right = cast_to(expr->right, ctype);
1047 		if (ctype->ctype.modifiers & MOD_UNSIGNED)
1048 			expr->op = modify_for_unsigned(expr->op);
1049 		goto OK;
1050 	}
1051 
1052 	/* at least one must be a pointer */
1053 	if (!((lclass | rclass) & TYPE_PTR))
1054 		return bad_expr_type(expr);
1055 
1056 	/* equality comparisons can be with null pointer constants */
1057 	if (expr->op == SPECIAL_EQUAL || expr->op == SPECIAL_NOTEQUAL) {
1058 		int is_null1 = is_null_pointer_constant(left);
1059 		int is_null2 = is_null_pointer_constant(right);
1060 		if (is_null1 == 2)
1061 			bad_null(left);
1062 		if (is_null2 == 2)
1063 			bad_null(right);
1064 		if (is_null1 && is_null2) {
1065 			int positive = expr->op == SPECIAL_EQUAL;
1066 			expr->type = EXPR_VALUE;
1067 			expr->value = positive;
1068 			goto OK;
1069 		}
1070 		if (is_null1 && (rclass & TYPE_PTR)) {
1071 			left = cast_to(left, rtype);
1072 			goto OK;
1073 		}
1074 		if (is_null2 && (lclass & TYPE_PTR)) {
1075 			right = cast_to(right, ltype);
1076 			goto OK;
1077 		}
1078 	}
1079 	/* both should be pointers */
1080 	if (!(lclass & rclass & TYPE_PTR))
1081 		return bad_expr_type(expr);
1082 	expr->op = modify_for_unsigned(expr->op);
1083 
1084 	lbase = examine_pointer_target(ltype);
1085 	rbase = examine_pointer_target(rtype);
1086 
1087 	/* they also have special treatment for pointers to void */
1088 	if (expr->op == SPECIAL_EQUAL || expr->op == SPECIAL_NOTEQUAL) {
1089 		if (ltype->ctype.as == rtype->ctype.as) {
1090 			if (lbase == &void_ctype) {
1091 				right = cast_to(right, ltype);
1092 				goto OK;
1093 			}
1094 			if (rbase == &void_ctype) {
1095 				left = cast_to(left, rtype);
1096 				goto OK;
1097 			}
1098 		}
1099 	}
1100 
1101 	typediff = type_difference(&ltype->ctype, &rtype->ctype,
1102 				   target_qualifiers(rtype),
1103 				   target_qualifiers(ltype));
1104 	if (!typediff)
1105 		goto OK;
1106 
1107 	expression_error(expr, "incompatible types in comparison expression (%s)", typediff);
1108 	return NULL;
1109 
1110 OK:
1111 	/* the result is int [6.5.8(6), 6.5.9(3)]*/
1112 	expr->ctype = &int_ctype;
1113 	return &int_ctype;
1114 }
1115 
1116 /*
1117  * NOTE! The degenerate case of "x ? : y", where we don't
1118  * have a true case, this will possibly promote "x" to the
1119  * same type as "y", and thus _change_ the conditional
1120  * test in the expression. But since promotion is "safe"
1121  * for testing, that's OK.
1122  */
1123 static struct symbol *evaluate_conditional_expression(struct expression *expr)
1124 {
1125 	struct expression **true;
1126 	struct symbol *ctype, *ltype, *rtype, *lbase, *rbase;
1127 	int lclass, rclass;
1128 	const char * typediff;
1129 	int qual;
1130 
1131 	if (!evaluate_conditional(expr->conditional, 0))
1132 		return NULL;
1133 	if (!evaluate_expression(expr->cond_false))
1134 		return NULL;
1135 
1136 	ctype = degenerate(expr->conditional);
1137 	rtype = degenerate(expr->cond_false);
1138 
1139 	true = &expr->conditional;
1140 	ltype = ctype;
1141 	if (expr->cond_true) {
1142 		if (!evaluate_expression(expr->cond_true))
1143 			return NULL;
1144 		ltype = degenerate(expr->cond_true);
1145 		true = &expr->cond_true;
1146 	}
1147 
1148 	expr->flags = (expr->conditional->flags & (*true)->flags &
1149 			expr->cond_false->flags & ~CEF_CONST_MASK);
1150 	/*
1151 	 * A conditional operator yields a particular constant
1152 	 * expression type only if all of its three subexpressions are
1153 	 * of that type [6.6(6), 6.6(8)].
1154 	 * As an extension, relax this restriction by allowing any
1155 	 * constant expression type for the condition expression.
1156 	 *
1157 	 * A conditional operator never yields an address constant
1158 	 * [6.6(9)].
1159 	 * However, as an extension, if the condition is any constant
1160 	 * expression, and the true and false expressions are both
1161 	 * address constants, mark the result as an address constant.
1162 	 */
1163 	if (expr->conditional->flags & (CEF_ACE | CEF_ADDR))
1164 		expr->flags = (*true)->flags & expr->cond_false->flags & ~CEF_CONST_MASK;
1165 
1166 	lclass = classify_type(ltype, &ltype);
1167 	rclass = classify_type(rtype, &rtype);
1168 	if (lclass & rclass & TYPE_NUM) {
1169 		ctype = usual_conversions('?', *true, expr->cond_false,
1170 					  lclass, rclass, ltype, rtype);
1171 		*true = cast_to(*true, ctype);
1172 		expr->cond_false = cast_to(expr->cond_false, ctype);
1173 		goto out;
1174 	}
1175 
1176 	if ((lclass | rclass) & TYPE_PTR) {
1177 		int is_null1 = is_null_pointer_constant(*true);
1178 		int is_null2 = is_null_pointer_constant(expr->cond_false);
1179 
1180 		if (is_null1 && is_null2) {
1181 			*true = cast_to(*true, &ptr_ctype);
1182 			expr->cond_false = cast_to(expr->cond_false, &ptr_ctype);
1183 			ctype = &ptr_ctype;
1184 			goto out;
1185 		}
1186 		if (is_null1 && (rclass & TYPE_PTR)) {
1187 			if (is_null1 == 2)
1188 				bad_null(*true);
1189 			*true = cast_to(*true, rtype);
1190 			ctype = rtype;
1191 			goto out;
1192 		}
1193 		if (is_null2 && (lclass & TYPE_PTR)) {
1194 			if (is_null2 == 2)
1195 				bad_null(expr->cond_false);
1196 			expr->cond_false = cast_to(expr->cond_false, ltype);
1197 			ctype = ltype;
1198 			goto out;
1199 		}
1200 		if (!(lclass & rclass & TYPE_PTR)) {
1201 			typediff = "different types";
1202 			goto Err;
1203 		}
1204 		/* OK, it's pointer on pointer */
1205 		if (ltype->ctype.as != rtype->ctype.as) {
1206 			typediff = "different address spaces";
1207 			goto Err;
1208 		}
1209 
1210 		/* need to be lazier here */
1211 		lbase = examine_pointer_target(ltype);
1212 		rbase = examine_pointer_target(rtype);
1213 		qual = target_qualifiers(ltype) | target_qualifiers(rtype);
1214 
1215 		if (lbase == &void_ctype) {
1216 			/* XXX: pointers to function should warn here */
1217 			ctype = ltype;
1218 			goto Qual;
1219 
1220 		}
1221 		if (rbase == &void_ctype) {
1222 			/* XXX: pointers to function should warn here */
1223 			ctype = rtype;
1224 			goto Qual;
1225 		}
1226 		/* XXX: that should be pointer to composite */
1227 		ctype = ltype;
1228 		typediff = type_difference(&ltype->ctype, &rtype->ctype,
1229 					   qual, qual);
1230 		if (!typediff)
1231 			goto Qual;
1232 		goto Err;
1233 	}
1234 
1235 	/* void on void, struct on same struct, union on same union */
1236 	if (ltype == rtype) {
1237 		ctype = ltype;
1238 		goto out;
1239 	}
1240 	typediff = "different base types";
1241 
1242 Err:
1243 	expression_error(expr, "incompatible types in conditional expression (%s)", typediff);
1244 	/*
1245 	 * if the condition is constant, the type is in fact known
1246 	 * so use it, as gcc & clang do.
1247 	 */
1248 	switch (expr_truth_value(expr->conditional)) {
1249 	case 1:	expr->ctype = ltype;
1250 		break;
1251 	case 0: expr->ctype = rtype;
1252 		break;
1253 	default:
1254 		break;
1255 	}
1256 	return NULL;
1257 
1258 out:
1259 	expr->ctype = ctype;
1260 	return ctype;
1261 
1262 Qual:
1263 	if (qual & ~ctype->ctype.modifiers) {
1264 		struct symbol *sym = alloc_symbol(ctype->pos, SYM_PTR);
1265 		*sym = *ctype;
1266 		sym->ctype.modifiers |= qual;
1267 		ctype = sym;
1268 	}
1269 	*true = cast_to(*true, ctype);
1270 	expr->cond_false = cast_to(expr->cond_false, ctype);
1271 	goto out;
1272 }
1273 
1274 /* FP assignments can not do modulo or bit operations */
1275 static int compatible_float_op(int op)
1276 {
1277 	return	op == SPECIAL_ADD_ASSIGN ||
1278 		op == SPECIAL_SUB_ASSIGN ||
1279 		op == SPECIAL_MUL_ASSIGN ||
1280 		op == SPECIAL_DIV_ASSIGN;
1281 }
1282 
1283 static int evaluate_assign_op(struct expression *expr)
1284 {
1285 	struct symbol *target = expr->left->ctype;
1286 	struct symbol *source = expr->right->ctype;
1287 	struct symbol *t, *s;
1288 	int tclass = classify_type(target, &t);
1289 	int sclass = classify_type(source, &s);
1290 	int op = expr->op;
1291 
1292 	if (tclass & sclass & TYPE_NUM) {
1293 		if (tclass & TYPE_FLOAT && !compatible_float_op(op)) {
1294 			expression_error(expr, "invalid assignment");
1295 			return 0;
1296 		}
1297 		if (tclass & TYPE_RESTRICT) {
1298 			if (!restricted_binop(op, t)) {
1299 				warning(expr->pos, "bad assignment (%s) to %s",
1300 					show_special(op), show_typename(t));
1301 				expr->right = cast_to(expr->right, target);
1302 				return 0;
1303 			}
1304 			/* allowed assignments unfoul */
1305 			if (sclass & TYPE_FOULED && unfoul(s) == t)
1306 				goto Cast;
1307 			if (!restricted_value(expr->right, t))
1308 				return 1;
1309 		} else if (!(sclass & TYPE_RESTRICT))
1310 			goto usual;
1311 		/* source and target would better be identical restricted */
1312 		if (t == s)
1313 			return 1;
1314 		warning(expr->pos, "invalid assignment: %s", show_special(op));
1315 		info(expr->pos, "   left side has type %s", show_typename(t));
1316 		info(expr->pos, "   right side has type %s", show_typename(s));
1317 		expr->right = cast_to(expr->right, target);
1318 		return 0;
1319 	}
1320 	if (tclass == TYPE_PTR && is_int(sclass)) {
1321 		if (op == SPECIAL_ADD_ASSIGN || op == SPECIAL_SUB_ASSIGN) {
1322 			unrestrict(expr->right, sclass, &s);
1323 			evaluate_ptr_add(expr, s);
1324 			return 1;
1325 		}
1326 		expression_error(expr, "invalid pointer assignment");
1327 		return 0;
1328 	}
1329 
1330 	expression_error(expr, "invalid assignment");
1331 	return 0;
1332 
1333 usual:
1334 	target = usual_conversions(op, expr->left, expr->right,
1335 				tclass, sclass, target, source);
1336 Cast:
1337 	expr->right = cast_to(expr->right, target);
1338 	return 1;
1339 }
1340 
1341 static int whitelist_pointers(struct symbol *t1, struct symbol *t2)
1342 {
1343 	if (t1 == t2)
1344 		return 0;	/* yes, 0 - we don't want a cast_to here */
1345 	if (t1 == &void_ctype)
1346 		return 1;
1347 	if (t2 == &void_ctype)
1348 		return 1;
1349 	if (classify_type(t1, &t1) != TYPE_NUM)
1350 		return 0;
1351 	if (classify_type(t2, &t2) != TYPE_NUM)
1352 		return 0;
1353 	if (t1 == t2)
1354 		return 1;
1355 	if (t1->ctype.modifiers & t2->ctype.modifiers & MOD_CHAR)
1356 		return 1;
1357 	if ((t1->ctype.modifiers ^ t2->ctype.modifiers) & MOD_SIZE)
1358 		return 0;
1359 	return !Wtypesign;
1360 }
1361 
1362 static int check_assignment_types(struct symbol *target, struct expression **rp,
1363 	const char **typediff)
1364 {
1365 	struct symbol *source = degenerate(*rp);
1366 	struct symbol *t, *s;
1367 	int tclass = classify_type(target, &t);
1368 	int sclass = classify_type(source, &s);
1369 
1370 	if (tclass & sclass & TYPE_NUM) {
1371 		if (tclass & TYPE_RESTRICT) {
1372 			/* allowed assignments unfoul */
1373 			if (sclass & TYPE_FOULED && unfoul(s) == t)
1374 				goto Cast;
1375 			if (!restricted_value(*rp, target))
1376 				return 1;
1377 			if (s == t)
1378 				return 1;
1379 		} else if (!(sclass & TYPE_RESTRICT))
1380 			goto Cast;
1381                 if (t == &bool_ctype) {
1382                         if (is_fouled_type(s))
1383                                 warning((*rp)->pos, "%s degrades to integer",
1384                                         show_typename(s->ctype.base_type));
1385                         goto Cast;
1386                 }
1387 		*typediff = "different base types";
1388 		return 0;
1389 	}
1390 
1391 	if (tclass == TYPE_PTR) {
1392 		unsigned long mod1, mod2;
1393 		struct symbol *b1, *b2;
1394 		// NULL pointer is always OK
1395 		int is_null = is_null_pointer_constant(*rp);
1396 		if (is_null) {
1397 			if (is_null == 2)
1398 				bad_null(*rp);
1399 			goto Cast;
1400 		}
1401 		if (!(sclass & TYPE_PTR)) {
1402 			*typediff = "different base types";
1403 			return 0;
1404 		}
1405 		b1 = examine_pointer_target(t);
1406 		b2 = examine_pointer_target(s);
1407 		mod1 = target_qualifiers(t);
1408 		mod2 = target_qualifiers(s);
1409 		if (whitelist_pointers(b1, b2)) {
1410 			/*
1411 			 * assignments to/from void * are OK, provided that
1412 			 * we do not remove qualifiers from pointed to [C]
1413 			 * or mix address spaces [sparse].
1414 			 */
1415 			if (t->ctype.as != s->ctype.as) {
1416 				*typediff = "different address spaces";
1417 				return 0;
1418 			}
1419 			/*
1420 			 * If this is a function pointer assignment, it is
1421 			 * actually fine to assign a pointer to const data to
1422 			 * it, as a function pointer points to const data
1423 			 * implicitly, i.e., dereferencing it does not produce
1424 			 * an lvalue.
1425 			 */
1426 			if (b1->type == SYM_FN)
1427 				mod1 |= MOD_CONST;
1428 			if (mod2 & ~mod1) {
1429 				*typediff = "different modifiers";
1430 				return 0;
1431 			}
1432 			goto Cast;
1433 		}
1434 		/* It's OK if the target is more volatile or const than the source */
1435 		*typediff = type_difference(&t->ctype, &s->ctype, 0, mod1);
1436 		if (*typediff)
1437 			return 0;
1438 		return 1;
1439 	}
1440 
1441 	if ((tclass & TYPE_COMPOUND) && s == t)
1442 		return 1;
1443 
1444 	if (tclass & TYPE_NUM) {
1445 		/* XXX: need to turn into comparison with NULL */
1446 		if (t == &bool_ctype && (sclass & TYPE_PTR))
1447 			goto Cast;
1448 		*typediff = "different base types";
1449 		return 0;
1450 	}
1451 	*typediff = "invalid types";
1452 	return 0;
1453 
1454 Cast:
1455 	*rp = cast_to(*rp, target);
1456 	return 1;
1457 }
1458 
1459 static int compatible_assignment_types(struct expression *expr, struct symbol *target,
1460 	struct expression **rp, const char *where)
1461 {
1462 	const char *typediff;
1463 	struct symbol *source = degenerate(*rp);
1464 
1465 	if (!check_assignment_types(target, rp, &typediff)) {
1466 		warning(expr->pos, "incorrect type in %s (%s)", where, typediff);
1467 		info(expr->pos, "   expected %s", show_typename(target));
1468 		info(expr->pos, "   got %s", show_typename(source));
1469 		*rp = cast_to(*rp, target);
1470 		return 0;
1471 	}
1472 
1473 	return 1;
1474 }
1475 
1476 static int compatible_transparent_union(struct symbol *target,
1477 	struct expression **rp)
1478 {
1479 	struct symbol *t, *member;
1480 	classify_type(target, &t);
1481 	if (t->type != SYM_UNION || !t->transparent_union)
1482 		return 0;
1483 
1484 	FOR_EACH_PTR(t->symbol_list, member) {
1485 		const char *typediff;
1486 		if (check_assignment_types(member, rp, &typediff))
1487 			return 1;
1488 	} END_FOR_EACH_PTR(member);
1489 
1490 	return 0;
1491 }
1492 
1493 static int compatible_argument_type(struct expression *expr, struct symbol *target,
1494 	struct expression **rp, const char *where)
1495 {
1496 	if (compatible_transparent_union(target, rp))
1497 		return 1;
1498 
1499 	return compatible_assignment_types(expr, target, rp, where);
1500 }
1501 
1502 static void mark_assigned(struct expression *expr)
1503 {
1504 	struct symbol *sym;
1505 
1506 	if (!expr)
1507 		return;
1508 	switch (expr->type) {
1509 	case EXPR_SYMBOL:
1510 		sym = expr->symbol;
1511 		if (!sym)
1512 			return;
1513 		if (sym->type != SYM_NODE)
1514 			return;
1515 		sym->ctype.modifiers |= MOD_ASSIGNED;
1516 		return;
1517 
1518 	case EXPR_BINOP:
1519 		mark_assigned(expr->left);
1520 		mark_assigned(expr->right);
1521 		return;
1522 	case EXPR_CAST:
1523 	case EXPR_FORCE_CAST:
1524 		mark_assigned(expr->cast_expression);
1525 		return;
1526 	case EXPR_SLICE:
1527 		mark_assigned(expr->base);
1528 		return;
1529 	default:
1530 		/* Hmm? */
1531 		return;
1532 	}
1533 }
1534 
1535 static void evaluate_assign_to(struct expression *left, struct symbol *type)
1536 {
1537 	if (type->ctype.modifiers & MOD_CONST)
1538 		expression_error(left, "assignment to const expression");
1539 
1540 	/* We know left is an lvalue, so it's a "preop-*" */
1541 	mark_assigned(left->unop);
1542 }
1543 
1544 static struct symbol *evaluate_assignment(struct expression *expr)
1545 {
1546 	struct expression *left = expr->left;
1547 	struct expression *where = expr;
1548 	struct symbol *ltype;
1549 
1550 	if (!lvalue_expression(left)) {
1551 		expression_error(expr, "not an lvalue");
1552 		return NULL;
1553 	}
1554 
1555 	ltype = left->ctype;
1556 
1557 	if (expr->op != '=') {
1558 		if (!evaluate_assign_op(expr))
1559 			return NULL;
1560 	} else {
1561 		if (!compatible_assignment_types(where, ltype, &expr->right, "assignment"))
1562 			return NULL;
1563 	}
1564 
1565 	evaluate_assign_to(left, ltype);
1566 
1567 	expr->ctype = ltype;
1568 	return ltype;
1569 }
1570 
1571 static void examine_fn_arguments(struct symbol *fn)
1572 {
1573 	struct symbol *s;
1574 
1575 	FOR_EACH_PTR(fn->arguments, s) {
1576 		struct symbol *arg = evaluate_symbol(s);
1577 		/* Array/function arguments silently degenerate into pointers */
1578 		if (arg) {
1579 			struct symbol *ptr;
1580 			switch(arg->type) {
1581 			case SYM_ARRAY:
1582 			case SYM_FN:
1583 				ptr = alloc_symbol(s->pos, SYM_PTR);
1584 				if (arg->type == SYM_ARRAY)
1585 					ptr->ctype = arg->ctype;
1586 				else
1587 					ptr->ctype.base_type = arg;
1588 				ptr->ctype.as |= s->ctype.as;
1589 				ptr->ctype.modifiers |= s->ctype.modifiers & MOD_PTRINHERIT;
1590 
1591 				s->ctype.base_type = ptr;
1592 				s->ctype.as = 0;
1593 				s->ctype.modifiers &= ~MOD_PTRINHERIT;
1594 				s->bit_size = 0;
1595 				s->examined = 0;
1596 				examine_symbol_type(s);
1597 				break;
1598 			default:
1599 				/* nothing */
1600 				break;
1601 			}
1602 		}
1603 	} END_FOR_EACH_PTR(s);
1604 }
1605 
1606 static struct symbol *convert_to_as_mod(struct symbol *sym, int as, int mod)
1607 {
1608 	/* Take the modifiers of the pointer, and apply them to the member */
1609 	mod |= sym->ctype.modifiers;
1610 	if (sym->ctype.as != as || sym->ctype.modifiers != mod) {
1611 		struct symbol *newsym = alloc_symbol(sym->pos, SYM_NODE);
1612 		*newsym = *sym;
1613 		newsym->ctype.as = as;
1614 		newsym->ctype.modifiers = mod;
1615 		sym = newsym;
1616 	}
1617 	return sym;
1618 }
1619 
1620 static struct symbol *create_pointer(struct expression *expr, struct symbol *sym, int degenerate)
1621 {
1622 	struct symbol *node = alloc_symbol(expr->pos, SYM_NODE);
1623 	struct symbol *ptr = alloc_symbol(expr->pos, SYM_PTR);
1624 
1625 	node->ctype.base_type = ptr;
1626 	ptr->bit_size = bits_in_pointer;
1627 	ptr->ctype.alignment = pointer_alignment;
1628 
1629 	node->bit_size = bits_in_pointer;
1630 	node->ctype.alignment = pointer_alignment;
1631 
1632 	access_symbol(sym);
1633 	if (sym->ctype.modifiers & MOD_REGISTER) {
1634 		warning(expr->pos, "taking address of 'register' variable '%s'", show_ident(sym->ident));
1635 		sym->ctype.modifiers &= ~MOD_REGISTER;
1636 	}
1637 	if (sym->type == SYM_NODE) {
1638 		ptr->ctype.as |= sym->ctype.as;
1639 		ptr->ctype.modifiers |= sym->ctype.modifiers & MOD_PTRINHERIT;
1640 		sym = sym->ctype.base_type;
1641 	}
1642 	if (degenerate && sym->type == SYM_ARRAY) {
1643 		ptr->ctype.as |= sym->ctype.as;
1644 		ptr->ctype.modifiers |= sym->ctype.modifiers & MOD_PTRINHERIT;
1645 		sym = sym->ctype.base_type;
1646 	}
1647 	ptr->ctype.base_type = sym;
1648 
1649 	return node;
1650 }
1651 
1652 /* Arrays degenerate into pointers on pointer arithmetic */
1653 static struct symbol *degenerate(struct expression *expr)
1654 {
1655 	struct symbol *ctype, *base;
1656 
1657 	if (!expr)
1658 		return NULL;
1659 	ctype = expr->ctype;
1660 	if (!ctype)
1661 		return NULL;
1662 	base = examine_symbol_type(ctype);
1663 	if (ctype->type == SYM_NODE)
1664 		base = ctype->ctype.base_type;
1665 	/*
1666 	 * Arrays degenerate into pointers to the entries, while
1667 	 * functions degenerate into pointers to themselves.
1668 	 * If array was part of non-lvalue compound, we create a copy
1669 	 * of that compound first and then act as if we were dealing with
1670 	 * the corresponding field in there.
1671 	 */
1672 	switch (base->type) {
1673 	case SYM_ARRAY:
1674 		if (expr->type == EXPR_SLICE) {
1675 			struct symbol *a = alloc_symbol(expr->pos, SYM_NODE);
1676 			struct expression *e0, *e1, *e2, *e3, *e4;
1677 
1678 			a->ctype.base_type = expr->base->ctype;
1679 			a->bit_size = expr->base->ctype->bit_size;
1680 			a->array_size = expr->base->ctype->array_size;
1681 
1682 			e0 = alloc_expression(expr->pos, EXPR_SYMBOL);
1683 			e0->symbol = a;
1684 			e0->ctype = &lazy_ptr_ctype;
1685 
1686 			e1 = alloc_expression(expr->pos, EXPR_PREOP);
1687 			e1->unop = e0;
1688 			e1->op = '*';
1689 			e1->ctype = expr->base->ctype;	/* XXX */
1690 
1691 			e2 = alloc_expression(expr->pos, EXPR_ASSIGNMENT);
1692 			e2->left = e1;
1693 			e2->right = expr->base;
1694 			e2->op = '=';
1695 			e2->ctype = expr->base->ctype;
1696 
1697 			if (expr->r_bitpos) {
1698 				e3 = alloc_expression(expr->pos, EXPR_BINOP);
1699 				e3->op = '+';
1700 				e3->left = e0;
1701 				e3->right = alloc_const_expression(expr->pos,
1702 							bits_to_bytes(expr->r_bitpos));
1703 				e3->ctype = &lazy_ptr_ctype;
1704 			} else {
1705 				e3 = e0;
1706 			}
1707 
1708 			e4 = alloc_expression(expr->pos, EXPR_COMMA);
1709 			e4->left = e2;
1710 			e4->right = e3;
1711 			e4->ctype = &lazy_ptr_ctype;
1712 
1713 			expr->unop = e4;
1714 			expr->type = EXPR_PREOP;
1715 			expr->op = '*';
1716 		}
1717 	case SYM_FN:
1718 		if (expr->op != '*' || expr->type != EXPR_PREOP) {
1719 			expression_error(expr, "strange non-value function or array");
1720 			return &bad_ctype;
1721 		}
1722 		*expr = *expr->unop;
1723 		ctype = create_pointer(expr, ctype, 1);
1724 		expr->ctype = ctype;
1725 	default:
1726 		/* nothing */;
1727 	}
1728 	return ctype;
1729 }
1730 
1731 static struct symbol *evaluate_addressof(struct expression *expr)
1732 {
1733 	struct expression *op = expr->unop;
1734 	struct symbol *ctype;
1735 
1736 	if (op->op != '*' || op->type != EXPR_PREOP) {
1737 		expression_error(expr, "not addressable");
1738 		return NULL;
1739 	}
1740 	ctype = op->ctype;
1741 	*expr = *op->unop;
1742 
1743 	if (expr->type == EXPR_SYMBOL) {
1744 		struct symbol *sym = expr->symbol;
1745 		sym->ctype.modifiers |= MOD_ADDRESSABLE;
1746 	}
1747 
1748 	/*
1749 	 * symbol expression evaluation is lazy about the type
1750 	 * of the sub-expression, so we may have to generate
1751 	 * the type here if so..
1752 	 */
1753 	if (expr->ctype == &lazy_ptr_ctype) {
1754 		ctype = create_pointer(expr, ctype, 0);
1755 		expr->ctype = ctype;
1756 	}
1757 	return expr->ctype;
1758 }
1759 
1760 
1761 static struct symbol *evaluate_dereference(struct expression *expr)
1762 {
1763 	struct expression *op = expr->unop;
1764 	struct symbol *ctype = op->ctype, *node, *target;
1765 
1766 	/* Simplify: *&(expr) => (expr) */
1767 	if (op->type == EXPR_PREOP && op->op == '&') {
1768 		*expr = *op->unop;
1769 		expr->flags = CEF_NONE;
1770 		return expr->ctype;
1771 	}
1772 
1773 	examine_symbol_type(ctype);
1774 
1775 	/* Dereferencing a node drops all the node information. */
1776 	if (ctype->type == SYM_NODE)
1777 		ctype = ctype->ctype.base_type;
1778 
1779 	node = alloc_symbol(expr->pos, SYM_NODE);
1780 	target = ctype->ctype.base_type;
1781 
1782 	switch (ctype->type) {
1783 	default:
1784 		expression_error(expr, "cannot dereference this type");
1785 		return NULL;
1786 	case SYM_PTR:
1787 		node->ctype.modifiers = target->ctype.modifiers & MOD_SPECIFIER;
1788 		merge_type(node, ctype);
1789 		break;
1790 
1791 	case SYM_ARRAY:
1792 		if (!lvalue_expression(op)) {
1793 			expression_error(op, "non-lvalue array??");
1794 			return NULL;
1795 		}
1796 
1797 		/* Do the implied "addressof" on the array */
1798 		*op = *op->unop;
1799 
1800 		/*
1801 		 * When an array is dereferenced, we need to pick
1802 		 * up the attributes of the original node too..
1803 		 */
1804 		merge_type(node, op->ctype);
1805 		merge_type(node, ctype);
1806 		break;
1807 	}
1808 
1809 	node->bit_size = target->bit_size;
1810 	node->array_size = target->array_size;
1811 
1812 	expr->ctype = node;
1813 	return node;
1814 }
1815 
1816 /*
1817  * Unary post-ops: x++ and x--
1818  */
1819 static struct symbol *evaluate_postop(struct expression *expr)
1820 {
1821 	struct expression *op = expr->unop;
1822 	struct symbol *ctype = op->ctype;
1823 	int class = classify_type(ctype, &ctype);
1824 	int multiply = 0;
1825 
1826 	if (!class || class & TYPE_COMPOUND) {
1827 		expression_error(expr, "need scalar for ++/--");
1828 		return NULL;
1829 	}
1830 	if (!lvalue_expression(expr->unop)) {
1831 		expression_error(expr, "need lvalue expression for ++/--");
1832 		return NULL;
1833 	}
1834 
1835 	if ((class & TYPE_RESTRICT) && restricted_unop(expr->op, &ctype))
1836 		unrestrict(expr, class, &ctype);
1837 
1838 	if (class & TYPE_NUM) {
1839 		multiply = 1;
1840 	} else if (class == TYPE_PTR) {
1841 		struct symbol *target = examine_pointer_target(ctype);
1842 		if (!is_function(target))
1843 			multiply = bits_to_bytes(target->bit_size);
1844 	}
1845 
1846 	if (multiply) {
1847 		evaluate_assign_to(op, op->ctype);
1848 		expr->op_value = multiply;
1849 		expr->ctype = ctype;
1850 		return ctype;
1851 	}
1852 
1853 	expression_error(expr, "bad argument type for ++/--");
1854 	return NULL;
1855 }
1856 
1857 static struct symbol *evaluate_sign(struct expression *expr)
1858 {
1859 	struct symbol *ctype = expr->unop->ctype;
1860 	int class = classify_type(ctype, &ctype);
1861 	unsigned char flags = expr->unop->flags & ~CEF_CONST_MASK;
1862 
1863 	/* should be an arithmetic type */
1864 	if (!(class & TYPE_NUM))
1865 		return bad_expr_type(expr);
1866 	if (class & TYPE_RESTRICT)
1867 		goto Restr;
1868 Normal:
1869 	if (!(class & TYPE_FLOAT)) {
1870 		ctype = integer_promotion(ctype);
1871 		expr->unop = cast_to(expr->unop, ctype);
1872 	} else if (expr->op != '~') {
1873 		/* no conversions needed */
1874 	} else {
1875 		return bad_expr_type(expr);
1876 	}
1877 	if (expr->op == '+')
1878 		*expr = *expr->unop;
1879 	expr->flags = flags;
1880 	expr->ctype = ctype;
1881 	return ctype;
1882 Restr:
1883 	if (restricted_unop(expr->op, &ctype))
1884 		unrestrict(expr, class, &ctype);
1885 	goto Normal;
1886 }
1887 
1888 static struct symbol *evaluate_preop(struct expression *expr)
1889 {
1890 	struct symbol *ctype = expr->unop->ctype;
1891 
1892 	switch (expr->op) {
1893 	case '(':
1894 		*expr = *expr->unop;
1895 		return ctype;
1896 
1897 	case '+':
1898 	case '-':
1899 	case '~':
1900 		return evaluate_sign(expr);
1901 
1902 	case '*':
1903 		return evaluate_dereference(expr);
1904 
1905 	case '&':
1906 		return evaluate_addressof(expr);
1907 
1908 	case SPECIAL_INCREMENT:
1909 	case SPECIAL_DECREMENT:
1910 		/*
1911 		 * From a type evaluation standpoint the preops are
1912 		 * the same as the postops
1913 		 */
1914 		return evaluate_postop(expr);
1915 
1916 	case '!':
1917 		expr->flags = expr->unop->flags & ~CEF_CONST_MASK;
1918 		/*
1919 		 * A logical negation never yields an address constant
1920 		 * [6.6(9)].
1921 		 */
1922 		expr->flags &= ~CEF_ADDR;
1923 
1924 		if (is_safe_type(ctype))
1925 			warning(expr->pos, "testing a 'safe expression'");
1926 		if (is_float_type(ctype)) {
1927 			struct expression *arg = expr->unop;
1928 			expr->type = EXPR_COMPARE;
1929 			expr->op = SPECIAL_EQUAL;
1930 			expr->left = arg;
1931 			expr->right = alloc_expression(expr->pos, EXPR_FVALUE);
1932 			expr->right->ctype = ctype;
1933 			expr->right->fvalue = 0;
1934 		} else if (is_fouled_type(ctype)) {
1935 			warning(expr->pos, "%s degrades to integer",
1936 				show_typename(ctype->ctype.base_type));
1937 		}
1938 		/* the result is int [6.5.3.3(5)]*/
1939 		ctype = &int_ctype;
1940 		break;
1941 
1942 	default:
1943 		break;
1944 	}
1945 	expr->ctype = ctype;
1946 	return ctype;
1947 }
1948 
1949 struct symbol *find_identifier(struct ident *ident, struct symbol_list *_list, int *offset)
1950 {
1951 	struct ptr_list *head = (struct ptr_list *)_list;
1952 	struct ptr_list *list = head;
1953 
1954 	if (!head)
1955 		return NULL;
1956 	do {
1957 		int i;
1958 		for (i = 0; i < list->nr; i++) {
1959 			struct symbol *sym = (struct symbol *) list->list[i];
1960 			if (sym->ident) {
1961 				if (sym->ident != ident)
1962 					continue;
1963 				*offset = sym->offset;
1964 				return sym;
1965 			} else {
1966 				struct symbol *ctype = sym->ctype.base_type;
1967 				struct symbol *sub;
1968 				if (!ctype)
1969 					continue;
1970 				if (ctype->type != SYM_UNION && ctype->type != SYM_STRUCT)
1971 					continue;
1972 				sub = find_identifier(ident, ctype->symbol_list, offset);
1973 				if (!sub)
1974 					continue;
1975 				*offset += sym->offset;
1976 				return sub;
1977 			}
1978 		}
1979 	} while ((list = list->next) != head);
1980 	return NULL;
1981 }
1982 
1983 static struct expression *evaluate_offset(struct expression *expr, unsigned long offset)
1984 {
1985 	struct expression *add;
1986 
1987 	/*
1988 	 * Create a new add-expression
1989 	 *
1990 	 * NOTE! Even if we just add zero, we need a new node
1991 	 * for the member pointer, since it has a different
1992 	 * type than the original pointer. We could make that
1993 	 * be just a cast, but the fact is, a node is a node,
1994 	 * so we might as well just do the "add zero" here.
1995 	 */
1996 	add = alloc_expression(expr->pos, EXPR_BINOP);
1997 	add->op = '+';
1998 	add->left = expr;
1999 	add->right = alloc_expression(expr->pos, EXPR_VALUE);
2000 	add->right->ctype = &int_ctype;
2001 	add->right->value = offset;
2002 
2003 	/*
2004 	 * The ctype of the pointer will be lazily evaluated if
2005 	 * we ever take the address of this member dereference..
2006 	 */
2007 	add->ctype = &lazy_ptr_ctype;
2008 	/*
2009 	 * The resulting address of a member access through an address
2010 	 * constant is an address constant again [6.6(9)].
2011 	 */
2012 	add->flags = expr->flags;
2013 
2014 	return add;
2015 }
2016 
2017 /* structure/union dereference */
2018 static struct symbol *evaluate_member_dereference(struct expression *expr)
2019 {
2020 	int offset;
2021 	struct symbol *ctype, *member;
2022 	struct expression *deref = expr->deref, *add;
2023 	struct ident *ident = expr->member;
2024 	unsigned int mod;
2025 	int address_space;
2026 
2027 	if (!evaluate_expression(deref))
2028 		return NULL;
2029 	if (!ident) {
2030 		expression_error(expr, "bad member name");
2031 		return NULL;
2032 	}
2033 
2034 	ctype = deref->ctype;
2035 	examine_symbol_type(ctype);
2036 	address_space = ctype->ctype.as;
2037 	mod = ctype->ctype.modifiers;
2038 	if (ctype->type == SYM_NODE) {
2039 		ctype = ctype->ctype.base_type;
2040 		address_space |= ctype->ctype.as;
2041 		mod |= ctype->ctype.modifiers;
2042 	}
2043 	if (!ctype || (ctype->type != SYM_STRUCT && ctype->type != SYM_UNION)) {
2044 		expression_error(expr, "expected structure or union");
2045 		return NULL;
2046 	}
2047 	offset = 0;
2048 	member = find_identifier(ident, ctype->symbol_list, &offset);
2049 	if (!member) {
2050 		const char *type = ctype->type == SYM_STRUCT ? "struct" : "union";
2051 		const char *name = "<unnamed>";
2052 		int namelen = 9;
2053 		if (ctype->ident) {
2054 			name = ctype->ident->name;
2055 			namelen = ctype->ident->len;
2056 		}
2057 		if (ctype->symbol_list)
2058 			expression_error(expr, "no member '%s' in %s %.*s",
2059 				show_ident(ident), type, namelen, name);
2060 		else
2061 			expression_error(expr, "using member '%s' in "
2062 				"incomplete %s %.*s", show_ident(ident),
2063 				type, namelen, name);
2064 		return NULL;
2065 	}
2066 
2067 	/*
2068 	 * The member needs to take on the address space and modifiers of
2069 	 * the "parent" type.
2070 	 */
2071 	member = convert_to_as_mod(member, address_space, mod);
2072 	ctype = get_base_type(member);
2073 
2074 	if (!lvalue_expression(deref)) {
2075 		if (deref->type != EXPR_SLICE) {
2076 			expr->base = deref;
2077 			expr->r_bitpos = 0;
2078 		} else {
2079 			expr->base = deref->base;
2080 			expr->r_bitpos = deref->r_bitpos;
2081 		}
2082 		expr->r_bitpos += bytes_to_bits(offset);
2083 		expr->type = EXPR_SLICE;
2084 		expr->r_nrbits = member->bit_size;
2085 		expr->r_bitpos += member->bit_offset;
2086 		expr->ctype = member;
2087 		return member;
2088 	}
2089 
2090 	deref = deref->unop;
2091 	expr->deref = deref;
2092 
2093 	add = evaluate_offset(deref, offset);
2094 	expr->type = EXPR_PREOP;
2095 	expr->op = '*';
2096 	expr->unop = add;
2097 
2098 	expr->ctype = member;
2099 	return member;
2100 }
2101 
2102 static int is_promoted(struct expression *expr)
2103 {
2104 	while (1) {
2105 		switch (expr->type) {
2106 		case EXPR_BINOP:
2107 		case EXPR_SELECT:
2108 		case EXPR_CONDITIONAL:
2109 			return 1;
2110 		case EXPR_COMMA:
2111 			expr = expr->right;
2112 			continue;
2113 		case EXPR_PREOP:
2114 			switch (expr->op) {
2115 			case '(':
2116 				expr = expr->unop;
2117 				continue;
2118 			case '+':
2119 			case '-':
2120 			case '~':
2121 				return 1;
2122 			default:
2123 				return 0;
2124 			}
2125 		default:
2126 			return 0;
2127 		}
2128 	}
2129 }
2130 
2131 
2132 static struct symbol *evaluate_cast(struct expression *);
2133 
2134 static struct symbol *evaluate_type_information(struct expression *expr)
2135 {
2136 	struct symbol *sym = expr->cast_type;
2137 	if (!sym) {
2138 		sym = evaluate_expression(expr->cast_expression);
2139 		if (!sym)
2140 			return NULL;
2141 		/*
2142 		 * Expressions of restricted types will possibly get
2143 		 * promoted - check that here
2144 		 */
2145 		if (is_restricted_type(sym)) {
2146 			if (sym->bit_size < bits_in_int && is_promoted(expr))
2147 				sym = &int_ctype;
2148 		} else if (is_fouled_type(sym)) {
2149 			sym = &int_ctype;
2150 		}
2151 	}
2152 	examine_symbol_type(sym);
2153 	if (is_bitfield_type(sym)) {
2154 		expression_error(expr, "trying to examine bitfield type");
2155 		return NULL;
2156 	}
2157 	return sym;
2158 }
2159 
2160 static struct symbol *evaluate_sizeof(struct expression *expr)
2161 {
2162 	struct symbol *type;
2163 	int size;
2164 
2165 	type = evaluate_type_information(expr);
2166 	if (!type)
2167 		return NULL;
2168 
2169 	size = type->bit_size;
2170 
2171 	if (size < 0 && is_void_type(type)) {
2172 		if (Wpointer_arith)
2173 			warning(expr->pos, "expression using sizeof(void)");
2174 		size = bits_in_char;
2175 	}
2176 
2177 	if (size == 1 && is_bool_type(type)) {
2178 		if (Wsizeof_bool)
2179 			warning(expr->pos, "expression using sizeof bool");
2180 		size = bits_in_char;
2181 	}
2182 
2183 	if (is_function(type->ctype.base_type)) {
2184 		if (Wpointer_arith)
2185 			warning(expr->pos, "expression using sizeof on a function");
2186 		size = bits_in_char;
2187 	}
2188 
2189 	if ((size < 0) || (size & (bits_in_char - 1)))
2190 		expression_error(expr, "cannot size expression");
2191 
2192 	expr->type = EXPR_VALUE;
2193 	expr->value = bits_to_bytes(size);
2194 	expr->taint = 0;
2195 	expr->ctype = size_t_ctype;
2196 	return size_t_ctype;
2197 }
2198 
2199 static struct symbol *evaluate_ptrsizeof(struct expression *expr)
2200 {
2201 	struct symbol *type;
2202 	int size;
2203 
2204 	type = evaluate_type_information(expr);
2205 	if (!type)
2206 		return NULL;
2207 
2208 	if (type->type == SYM_NODE)
2209 		type = type->ctype.base_type;
2210 	if (!type)
2211 		return NULL;
2212 	switch (type->type) {
2213 	case SYM_ARRAY:
2214 		break;
2215 	case SYM_PTR:
2216 		type = get_base_type(type);
2217 		if (type)
2218 			break;
2219 	default:
2220 		expression_error(expr, "expected pointer expression");
2221 		return NULL;
2222 	}
2223 	size = type->bit_size;
2224 	if (size & (bits_in_char-1))
2225 		size = 0;
2226 	expr->type = EXPR_VALUE;
2227 	expr->value = bits_to_bytes(size);
2228 	expr->taint = 0;
2229 	expr->ctype = size_t_ctype;
2230 	return size_t_ctype;
2231 }
2232 
2233 static struct symbol *evaluate_alignof(struct expression *expr)
2234 {
2235 	struct symbol *type;
2236 
2237 	type = evaluate_type_information(expr);
2238 	if (!type)
2239 		return NULL;
2240 
2241 	expr->type = EXPR_VALUE;
2242 	expr->value = type->ctype.alignment;
2243 	expr->taint = 0;
2244 	expr->ctype = size_t_ctype;
2245 	return size_t_ctype;
2246 }
2247 
2248 static int evaluate_arguments(struct symbol *fn, struct expression_list *head)
2249 {
2250 	struct expression *expr;
2251 	struct symbol_list *argument_types = fn->arguments;
2252 	struct symbol *argtype;
2253 	int i = 1;
2254 
2255 	PREPARE_PTR_LIST(argument_types, argtype);
2256 	FOR_EACH_PTR (head, expr) {
2257 		struct expression **p = THIS_ADDRESS(expr);
2258 		struct symbol *ctype, *target;
2259 		ctype = evaluate_expression(expr);
2260 
2261 		if (!ctype)
2262 			return 0;
2263 
2264 		target = argtype;
2265 		if (!target) {
2266 			struct symbol *type;
2267 			int class = classify_type(ctype, &type);
2268 			if (is_int(class)) {
2269 				*p = cast_to(expr, integer_promotion(type));
2270 			} else if (class & TYPE_FLOAT) {
2271 				unsigned long mod = type->ctype.modifiers;
2272 				if (!(mod & (MOD_LONG_ALL)))
2273 					*p = cast_to(expr, &double_ctype);
2274 			} else if (class & TYPE_PTR) {
2275 				if (expr->ctype == &null_ctype)
2276 					*p = cast_to(expr, &ptr_ctype);
2277 				else
2278 					degenerate(expr);
2279 			}
2280 		} else if (!target->forced_arg){
2281 			static char where[30];
2282 			examine_symbol_type(target);
2283 			sprintf(where, "argument %d", i);
2284 			compatible_argument_type(expr, target, p, where);
2285 		}
2286 
2287 		i++;
2288 		NEXT_PTR_LIST(argtype);
2289 	} END_FOR_EACH_PTR(expr);
2290 	FINISH_PTR_LIST(argtype);
2291 	return 1;
2292 }
2293 
2294 static void convert_index(struct expression *e)
2295 {
2296 	struct expression *child = e->idx_expression;
2297 	unsigned from = e->idx_from;
2298 	unsigned to = e->idx_to + 1;
2299 	e->type = EXPR_POS;
2300 	e->init_offset = from * bits_to_bytes(e->ctype->bit_size);
2301 	e->init_nr = to - from;
2302 	e->init_expr = child;
2303 }
2304 
2305 static void convert_ident(struct expression *e)
2306 {
2307 	struct expression *child = e->ident_expression;
2308 	int offset = e->offset;
2309 
2310 	e->type = EXPR_POS;
2311 	e->init_offset = offset;
2312 	e->init_nr = 1;
2313 	e->init_expr = child;
2314 }
2315 
2316 static void convert_designators(struct expression *e)
2317 {
2318 	while (e) {
2319 		if (e->type == EXPR_INDEX)
2320 			convert_index(e);
2321 		else if (e->type == EXPR_IDENTIFIER)
2322 			convert_ident(e);
2323 		else
2324 			break;
2325 		e = e->init_expr;
2326 	}
2327 }
2328 
2329 static void excess(struct expression *e, const char *s)
2330 {
2331 	warning(e->pos, "excessive elements in %s initializer", s);
2332 }
2333 
2334 /*
2335  * implicit designator for the first element
2336  */
2337 static struct expression *first_subobject(struct symbol *ctype, int class,
2338 					  struct expression **v)
2339 {
2340 	struct expression *e = *v, *new;
2341 
2342 	if (ctype->type == SYM_NODE)
2343 		ctype = ctype->ctype.base_type;
2344 
2345 	if (class & TYPE_PTR) { /* array */
2346 		if (!ctype->bit_size)
2347 			return NULL;
2348 		new = alloc_expression(e->pos, EXPR_INDEX);
2349 		new->idx_expression = e;
2350 		new->ctype = ctype->ctype.base_type;
2351 	} else  {
2352 		struct symbol *field, *p;
2353 		PREPARE_PTR_LIST(ctype->symbol_list, p);
2354 		while (p && !p->ident && is_bitfield_type(p))
2355 			NEXT_PTR_LIST(p);
2356 		field = p;
2357 		FINISH_PTR_LIST(p);
2358 		if (!field)
2359 			return NULL;
2360 		new = alloc_expression(e->pos, EXPR_IDENTIFIER);
2361 		new->ident_expression = e;
2362 		new->field = new->ctype = field;
2363 		new->offset = field->offset;
2364 	}
2365 	*v = new;
2366 	return new;
2367 }
2368 
2369 /*
2370  * sanity-check explicit designators; return the innermost one or NULL
2371  * in case of error.  Assign types.
2372  */
2373 static struct expression *check_designators(struct expression *e,
2374 					    struct symbol *ctype)
2375 {
2376 	struct expression *last = NULL;
2377 	const char *err;
2378 	while (1) {
2379 		if (ctype->type == SYM_NODE)
2380 			ctype = ctype->ctype.base_type;
2381 		if (e->type == EXPR_INDEX) {
2382 			struct symbol *type;
2383 			if (ctype->type != SYM_ARRAY) {
2384 				err = "array index in non-array";
2385 				break;
2386 			}
2387 			type = ctype->ctype.base_type;
2388 			if (ctype->bit_size >= 0 && type->bit_size >= 0) {
2389 				unsigned offset = array_element_offset(type->bit_size, e->idx_to);
2390 				if (offset >= ctype->bit_size) {
2391 					err = "index out of bounds in";
2392 					break;
2393 				}
2394 			}
2395 			e->ctype = ctype = type;
2396 			ctype = type;
2397 			last = e;
2398 			if (!e->idx_expression) {
2399 				err = "invalid";
2400 				break;
2401 			}
2402 			e = e->idx_expression;
2403 		} else if (e->type == EXPR_IDENTIFIER) {
2404 			int offset = 0;
2405 			if (ctype->type != SYM_STRUCT && ctype->type != SYM_UNION) {
2406 				err = "field name not in struct or union";
2407 				break;
2408 			}
2409 			ctype = find_identifier(e->expr_ident, ctype->symbol_list, &offset);
2410 			if (!ctype) {
2411 				err = "unknown field name in";
2412 				break;
2413 			}
2414 			e->offset = offset;
2415 			e->field = e->ctype = ctype;
2416 			last = e;
2417 			if (!e->ident_expression) {
2418 				err = "invalid";
2419 				break;
2420 			}
2421 			e = e->ident_expression;
2422 		} else if (e->type == EXPR_POS) {
2423 			err = "internal front-end error: EXPR_POS in";
2424 			break;
2425 		} else
2426 			return last;
2427 	}
2428 	expression_error(e, "%s initializer", err);
2429 	return NULL;
2430 }
2431 
2432 /*
2433  * choose the next subobject to initialize.
2434  *
2435  * Get designators for next element, switch old ones to EXPR_POS.
2436  * Return the resulting expression or NULL if we'd run out of subobjects.
2437  * The innermost designator is returned in *v.  Designators in old
2438  * are assumed to be already sanity-checked.
2439  */
2440 static struct expression *next_designators(struct expression *old,
2441 			     struct symbol *ctype,
2442 			     struct expression *e, struct expression **v)
2443 {
2444 	struct expression *new = NULL;
2445 
2446 	if (!old)
2447 		return NULL;
2448 	if (old->type == EXPR_INDEX) {
2449 		struct expression *copy;
2450 		unsigned n;
2451 
2452 		copy = next_designators(old->idx_expression,
2453 					old->ctype, e, v);
2454 		if (!copy) {
2455 			n = old->idx_to + 1;
2456 			if (array_element_offset(old->ctype->bit_size, n) == ctype->bit_size) {
2457 				convert_index(old);
2458 				return NULL;
2459 			}
2460 			copy = e;
2461 			*v = new = alloc_expression(e->pos, EXPR_INDEX);
2462 		} else {
2463 			n = old->idx_to;
2464 			new = alloc_expression(e->pos, EXPR_INDEX);
2465 		}
2466 
2467 		new->idx_from = new->idx_to = n;
2468 		new->idx_expression = copy;
2469 		new->ctype = old->ctype;
2470 		convert_index(old);
2471 	} else if (old->type == EXPR_IDENTIFIER) {
2472 		struct expression *copy;
2473 		struct symbol *field;
2474 		int offset = 0;
2475 
2476 		copy = next_designators(old->ident_expression,
2477 					old->ctype, e, v);
2478 		if (!copy) {
2479 			field = old->field->next_subobject;
2480 			if (!field) {
2481 				convert_ident(old);
2482 				return NULL;
2483 			}
2484 			copy = e;
2485 			*v = new = alloc_expression(e->pos, EXPR_IDENTIFIER);
2486 			/*
2487 			 * We can't necessarily trust "field->offset",
2488 			 * because the field might be in an anonymous
2489 			 * union, and the field offset is then the offset
2490 			 * within that union.
2491 			 *
2492 			 * The "old->offset - old->field->offset"
2493 			 * would be the offset of such an anonymous
2494 			 * union.
2495 			 */
2496 			offset = old->offset - old->field->offset;
2497 		} else {
2498 			field = old->field;
2499 			new = alloc_expression(e->pos, EXPR_IDENTIFIER);
2500 		}
2501 
2502 		new->field = field;
2503 		new->expr_ident = field->ident;
2504 		new->ident_expression = copy;
2505 		new->ctype = field;
2506 		new->offset = field->offset + offset;
2507 		convert_ident(old);
2508 	}
2509 	return new;
2510 }
2511 
2512 static int handle_initializer(struct expression **ep, int nested,
2513 		int class, struct symbol *ctype, unsigned long mods);
2514 
2515 /*
2516  * deal with traversing subobjects [6.7.8(17,18,20)]
2517  */
2518 static void handle_list_initializer(struct expression *expr,
2519 		int class, struct symbol *ctype, unsigned long mods)
2520 {
2521 	struct expression *e, *last = NULL, *top = NULL, *next;
2522 	int jumped = 0;
2523 
2524 	FOR_EACH_PTR(expr->expr_list, e) {
2525 		struct expression **v;
2526 		struct symbol *type;
2527 		int lclass;
2528 
2529 		if (e->type != EXPR_INDEX && e->type != EXPR_IDENTIFIER) {
2530 			struct symbol *struct_sym;
2531 			if (!top) {
2532 				top = e;
2533 				last = first_subobject(ctype, class, &top);
2534 			} else {
2535 				last = next_designators(last, ctype, e, &top);
2536 			}
2537 			if (!last) {
2538 				excess(e, class & TYPE_PTR ? "array" :
2539 							"struct or union");
2540 				DELETE_CURRENT_PTR(e);
2541 				continue;
2542 			}
2543 			struct_sym = ctype->type == SYM_NODE ? ctype->ctype.base_type : ctype;
2544 			if (Wdesignated_init && struct_sym->designated_init)
2545 				warning(e->pos, "%s%.*s%spositional init of field in %s %s, declared with attribute designated_init",
2546 					ctype->ident ? "in initializer for " : "",
2547 					ctype->ident ? ctype->ident->len : 0,
2548 					ctype->ident ? ctype->ident->name : "",
2549 					ctype->ident ? ": " : "",
2550 					get_type_name(struct_sym->type),
2551 					show_ident(struct_sym->ident));
2552 			if (jumped) {
2553 				warning(e->pos, "advancing past deep designator");
2554 				jumped = 0;
2555 			}
2556 			REPLACE_CURRENT_PTR(e, last);
2557 		} else {
2558 			next = check_designators(e, ctype);
2559 			if (!next) {
2560 				DELETE_CURRENT_PTR(e);
2561 				continue;
2562 			}
2563 			top = next;
2564 			/* deeper than one designator? */
2565 			jumped = top != e;
2566 			convert_designators(last);
2567 			last = e;
2568 		}
2569 
2570 found:
2571 		lclass = classify_type(top->ctype, &type);
2572 		if (top->type == EXPR_INDEX)
2573 			v = &top->idx_expression;
2574 		else
2575 			v = &top->ident_expression;
2576 
2577 		mods |= ctype->ctype.modifiers & MOD_STORAGE;
2578 		if (handle_initializer(v, 1, lclass, top->ctype, mods))
2579 			continue;
2580 
2581 		if (!(lclass & TYPE_COMPOUND)) {
2582 			warning(e->pos, "bogus scalar initializer");
2583 			DELETE_CURRENT_PTR(e);
2584 			continue;
2585 		}
2586 
2587 		next = first_subobject(type, lclass, v);
2588 		if (next) {
2589 			warning(e->pos, "missing braces around initializer");
2590 			top = next;
2591 			goto found;
2592 		}
2593 
2594 		DELETE_CURRENT_PTR(e);
2595 		excess(e, lclass & TYPE_PTR ? "array" : "struct or union");
2596 
2597 	} END_FOR_EACH_PTR(e);
2598 
2599 	convert_designators(last);
2600 	expr->ctype = ctype;
2601 }
2602 
2603 static int is_string_literal(struct expression **v)
2604 {
2605 	struct expression *e = *v;
2606 	while (e && e->type == EXPR_PREOP && e->op == '(')
2607 		e = e->unop;
2608 	if (!e || e->type != EXPR_STRING)
2609 		return 0;
2610 	if (e != *v && Wparen_string)
2611 		warning(e->pos,
2612 			"array initialized from parenthesized string constant");
2613 	*v = e;
2614 	return 1;
2615 }
2616 
2617 /*
2618  * We want a normal expression, possibly in one layer of braces.  Warn
2619  * if the latter happens inside a list (it's legal, but likely to be
2620  * an effect of screwup).  In case of anything not legal, we are definitely
2621  * having an effect of screwup, so just fail and let the caller warn.
2622  */
2623 static struct expression *handle_scalar(struct expression *e, int nested)
2624 {
2625 	struct expression *v = NULL, *p;
2626 	int count = 0;
2627 
2628 	/* normal case */
2629 	if (e->type != EXPR_INITIALIZER)
2630 		return e;
2631 
2632 	FOR_EACH_PTR(e->expr_list, p) {
2633 		if (!v)
2634 			v = p;
2635 		count++;
2636 	} END_FOR_EACH_PTR(p);
2637 	if (count != 1)
2638 		return NULL;
2639 	switch(v->type) {
2640 	case EXPR_INITIALIZER:
2641 	case EXPR_INDEX:
2642 	case EXPR_IDENTIFIER:
2643 		return NULL;
2644 	default:
2645 		break;
2646 	}
2647 	if (nested)
2648 		warning(e->pos, "braces around scalar initializer");
2649 	return v;
2650 }
2651 
2652 /*
2653  * deal with the cases that don't care about subobjects:
2654  * scalar <- assignment expression, possibly in braces [6.7.8(11)]
2655  * character array <- string literal, possibly in braces [6.7.8(14)]
2656  * struct or union <- assignment expression of compatible type [6.7.8(13)]
2657  * compound type <- initializer list in braces [6.7.8(16)]
2658  * The last one punts to handle_list_initializer() which, in turn will call
2659  * us for individual elements of the list.
2660  *
2661  * We do not handle 6.7.8(15) (wide char array <- wide string literal) for
2662  * the lack of support of wide char stuff in general.
2663  *
2664  * One note: we need to take care not to evaluate a string literal until
2665  * we know that we *will* handle it right here.  Otherwise we would screw
2666  * the cases like struct { struct {char s[10]; ...} ...} initialized with
2667  * { "string", ...} - we need to preserve that string literal recognizable
2668  * until we dig into the inner struct.
2669  */
2670 static int handle_initializer(struct expression **ep, int nested,
2671 		int class, struct symbol *ctype, unsigned long mods)
2672 {
2673 	int is_string = is_string_type(ctype);
2674 	struct expression *e = *ep, *p;
2675 	struct symbol *type;
2676 
2677 	if (!e)
2678 		return 0;
2679 
2680 	/* scalar */
2681 	if (!(class & TYPE_COMPOUND)) {
2682 		e = handle_scalar(e, nested);
2683 		if (!e)
2684 			return 0;
2685 		*ep = e;
2686 		if (!evaluate_expression(e))
2687 			return 1;
2688 		compatible_assignment_types(e, ctype, ep, "initializer");
2689 		/*
2690 		 * Initializers for static storage duration objects
2691 		 * shall be constant expressions or a string literal [6.7.8(4)].
2692 		 */
2693 		mods |= ctype->ctype.modifiers;
2694 		mods &= (MOD_TOPLEVEL | MOD_STATIC);
2695 		if (mods && !(e->flags & (CEF_ACE | CEF_ADDR)))
2696 			if (Wconstexpr_not_const)
2697 				warning(e->pos, "non-constant initializer for static object");
2698 
2699 		return 1;
2700 	}
2701 
2702 	/*
2703 	 * sublist; either a string, or we dig in; the latter will deal with
2704 	 * pathologies, so we don't need anything fancy here.
2705 	 */
2706 	if (e->type == EXPR_INITIALIZER) {
2707 		if (is_string) {
2708 			struct expression *v = NULL;
2709 			int count = 0;
2710 
2711 			FOR_EACH_PTR(e->expr_list, p) {
2712 				if (!v)
2713 					v = p;
2714 				count++;
2715 			} END_FOR_EACH_PTR(p);
2716 			if (count == 1 && is_string_literal(&v)) {
2717 				*ep = e = v;
2718 				goto String;
2719 			}
2720 		}
2721 		handle_list_initializer(e, class, ctype, mods);
2722 		return 1;
2723 	}
2724 
2725 	/* string */
2726 	if (is_string_literal(&e)) {
2727 		/* either we are doing array of char, or we'll have to dig in */
2728 		if (is_string) {
2729 			*ep = e;
2730 			goto String;
2731 		}
2732 		return 0;
2733 	}
2734 	/* struct or union can be initialized by compatible */
2735 	if (class != TYPE_COMPOUND)
2736 		return 0;
2737 	type = evaluate_expression(e);
2738 	if (!type)
2739 		return 0;
2740 	if (ctype->type == SYM_NODE)
2741 		ctype = ctype->ctype.base_type;
2742 	if (type->type == SYM_NODE)
2743 		type = type->ctype.base_type;
2744 	if (ctype == type)
2745 		return 1;
2746 	return 0;
2747 
2748 String:
2749 	p = alloc_expression(e->pos, EXPR_STRING);
2750 	*p = *e;
2751 	type = evaluate_expression(p);
2752 	if (ctype->bit_size != -1) {
2753 		if (ctype->bit_size + bits_in_char < type->bit_size)
2754 			warning(e->pos,
2755 				"too long initializer-string for array of char");
2756 		else if (Winit_cstring && ctype->bit_size + bits_in_char == type->bit_size) {
2757 			warning(e->pos,
2758 				"too long initializer-string for array of char(no space for nul char)");
2759 		}
2760 	}
2761 	*ep = p;
2762 	return 1;
2763 }
2764 
2765 static void evaluate_initializer(struct symbol *ctype, struct expression **ep)
2766 {
2767 	struct symbol *type;
2768 	int class = classify_type(ctype, &type);
2769 	if (!handle_initializer(ep, 0, class, ctype, 0))
2770 		expression_error(*ep, "invalid initializer");
2771 }
2772 
2773 static struct symbol *cast_to_bool(struct expression *expr)
2774 {
2775 	struct expression *old = expr->cast_expression;
2776 	struct expression *zero;
2777 	struct symbol *otype;
2778 	int oclass = classify_type(degenerate(old), &otype);
2779 	struct symbol *ctype;
2780 
2781 	if (oclass & TYPE_COMPOUND)
2782 		return NULL;
2783 
2784 	zero = alloc_const_expression(expr->pos, 0);
2785 	expr->op = SPECIAL_NOTEQUAL;
2786 	ctype = usual_conversions(expr->op, old, zero,
2787 			oclass, TYPE_NUM, otype, zero->ctype);
2788 	expr->type = EXPR_COMPARE;
2789 	expr->left = cast_to(old, ctype);
2790 	expr->right = cast_to(zero, ctype);
2791 
2792 	return expr->ctype;
2793 }
2794 
2795 static int cast_flags(struct expression *expr, struct expression *old)
2796 {
2797 	struct symbol *t;
2798 	int class;
2799 	int flags = CEF_NONE;
2800 
2801 	class = classify_type(expr->ctype, &t);
2802 	if (class & TYPE_NUM) {
2803 		flags = old->flags & ~CEF_CONST_MASK;
2804 		/*
2805 		 * Casts to numeric types never result in address
2806 		 * constants [6.6(9)].
2807 		 */
2808 		flags &= ~CEF_ADDR;
2809 
2810 		/*
2811 		 * As an extension, treat address constants cast to
2812 		 * integer type as an arithmetic constant.
2813 		 */
2814 		if (old->flags & CEF_ADDR)
2815 			flags = CEF_ACE;
2816 
2817 		/*
2818 		 * Cast to float type -> not an integer constant
2819 		 * expression [6.6(6)].
2820 		 */
2821 		if (class & TYPE_FLOAT)
2822 			flags &= ~CEF_CLR_ICE;
2823 		/*
2824 		 * Casts of float literals to integer type results in
2825 		 * a constant integer expression [6.6(6)].
2826 		 */
2827 		else if (old->flags & CEF_FLOAT)
2828 			flags = CEF_SET_ICE;
2829 	} else if (class & TYPE_PTR) {
2830 		/*
2831 		 * Casts of integer literals to pointer type yield
2832 		 * address constants [6.6(9)].
2833 		 *
2834 		 * As an extension, treat address constants cast to a
2835 		 * different pointer type as address constants again.
2836 		 *
2837 		 * As another extension, treat integer constant
2838 		 * expressions (in contrast to literals) cast to
2839 		 * pointer type as address constants.
2840 		 */
2841 		if (old->flags & (CEF_ICE | CEF_ADDR))
2842 			flags = CEF_ADDR;
2843 	}
2844 
2845 	return flags;
2846 }
2847 
2848 static struct symbol *evaluate_cast(struct expression *expr)
2849 {
2850 	struct expression *target = expr->cast_expression;
2851 	struct symbol *ctype;
2852 	struct symbol *t1, *t2;
2853 	int class1, class2;
2854 	int as1 = 0, as2 = 0;
2855 
2856 	if (!target)
2857 		return NULL;
2858 
2859 	/*
2860 	 * Special case: a cast can be followed by an
2861 	 * initializer, in which case we need to pass
2862 	 * the type value down to that initializer rather
2863 	 * than trying to evaluate it as an expression
2864 	 *
2865 	 * A more complex case is when the initializer is
2866 	 * dereferenced as part of a post-fix expression.
2867 	 * We need to produce an expression that can be dereferenced.
2868 	 */
2869 	if (target->type == EXPR_INITIALIZER) {
2870 		struct symbol *sym = expr->cast_type;
2871 		struct expression *addr = alloc_expression(expr->pos, EXPR_SYMBOL);
2872 
2873 		sym->initializer = target;
2874 		evaluate_symbol(sym);
2875 
2876 		addr->ctype = &lazy_ptr_ctype;	/* Lazy eval */
2877 		addr->symbol = sym;
2878 		if (sym->ctype.modifiers & MOD_TOPLEVEL)
2879 			addr->flags |= CEF_ADDR;
2880 
2881 		expr->type = EXPR_PREOP;
2882 		expr->op = '*';
2883 		expr->unop = addr;
2884 		expr->ctype = sym;
2885 
2886 		return sym;
2887 	}
2888 
2889 	ctype = examine_symbol_type(expr->cast_type);
2890 	expr->ctype = ctype;
2891 	expr->cast_type = ctype;
2892 
2893 	evaluate_expression(target);
2894 	degenerate(target);
2895 
2896 	class1 = classify_type(ctype, &t1);
2897 
2898 	expr->flags = cast_flags(expr, target);
2899 
2900 	/*
2901 	 * You can always throw a value away by casting to
2902 	 * "void" - that's an implicit "force". Note that
2903 	 * the same is _not_ true of "void *".
2904 	 */
2905 	if (t1 == &void_ctype)
2906 		goto out;
2907 
2908 	if (class1 & (TYPE_COMPOUND | TYPE_FN))
2909 		warning(expr->pos, "cast to non-scalar");
2910 
2911 	t2 = target->ctype;
2912 	if (!t2) {
2913 		expression_error(expr, "cast from unknown type");
2914 		goto out;
2915 	}
2916 	class2 = classify_type(t2, &t2);
2917 
2918 	if (class2 & TYPE_COMPOUND)
2919 		warning(expr->pos, "cast from non-scalar");
2920 
2921 	if (expr->type == EXPR_FORCE_CAST)
2922 		goto out;
2923 
2924 	/* allowed cast unfouls */
2925 	if (class2 & TYPE_FOULED)
2926 		t2 = unfoul(t2);
2927 
2928 	if (t1 != t2) {
2929 		if ((class1 & TYPE_RESTRICT) && restricted_value(target, t1))
2930 			warning(expr->pos, "cast to %s",
2931 				show_typename(t1));
2932 		if (class2 & TYPE_RESTRICT) {
2933 			if (t1 == &bool_ctype) {
2934 				if (class2 & TYPE_FOULED)
2935 					warning(expr->pos, "%s degrades to integer",
2936 						show_typename(t2));
2937 			} else {
2938 				warning(expr->pos, "cast from %s",
2939 					show_typename(t2));
2940 			}
2941 		}
2942 	}
2943 
2944 	if (t1 == &ulong_ctype)
2945 		as1 = -1;
2946 	else if (class1 == TYPE_PTR) {
2947 		examine_pointer_target(t1);
2948 		as1 = t1->ctype.as;
2949 	}
2950 
2951 	if (t2 == &ulong_ctype)
2952 		as2 = -1;
2953 	else if (class2 == TYPE_PTR) {
2954 		examine_pointer_target(t2);
2955 		as2 = t2->ctype.as;
2956 	}
2957 
2958 	if (!as1 && as2 > 0)
2959 		warning(expr->pos, "cast removes address space of expression");
2960 	if (as1 > 0 && as2 > 0 && as1 != as2)
2961 		warning(expr->pos, "cast between address spaces (<asn:%d>-><asn:%d>)", as2, as1);
2962 	if (as1 > 0 && !as2 &&
2963 	    !is_null_pointer_constant(target) && Wcast_to_as)
2964 		warning(expr->pos,
2965 			"cast adds address space to expression (<asn:%d>)", as1);
2966 
2967 	if (!(t1->ctype.modifiers & MOD_PTRINHERIT) && class1 == TYPE_PTR &&
2968 	    !as1 && (target->flags & CEF_ICE)) {
2969 		if (t1->ctype.base_type == &void_ctype) {
2970 			if (is_zero_constant(target)) {
2971 				/* NULL */
2972 				expr->type = EXPR_VALUE;
2973 				expr->ctype = &null_ctype;
2974 				expr->value = 0;
2975 				return expr->ctype;
2976 			}
2977 		}
2978 	}
2979 
2980 	if (t1 == &bool_ctype)
2981 		cast_to_bool(expr);
2982 
2983 out:
2984 	return ctype;
2985 }
2986 
2987 /*
2988  * Evaluate a call expression with a symbol. This
2989  * should expand inline functions, and evaluate
2990  * builtins.
2991  */
2992 static int evaluate_symbol_call(struct expression *expr)
2993 {
2994 	struct expression *fn = expr->fn;
2995 	struct symbol *ctype = fn->ctype;
2996 
2997 	if (fn->type != EXPR_PREOP)
2998 		return 0;
2999 
3000 	if (ctype->op && ctype->op->evaluate)
3001 		return ctype->op->evaluate(expr);
3002 
3003 	if (ctype->ctype.modifiers & MOD_INLINE) {
3004 		int ret;
3005 		struct symbol *curr = current_fn;
3006 
3007 		if (ctype->definition)
3008 			ctype = ctype->definition;
3009 
3010 		current_fn = ctype->ctype.base_type;
3011 
3012 		ret = inline_function(expr, ctype);
3013 
3014 		/* restore the old function */
3015 		current_fn = curr;
3016 		return ret;
3017 	}
3018 
3019 	return 0;
3020 }
3021 
3022 static struct symbol *evaluate_call(struct expression *expr)
3023 {
3024 	int args, fnargs;
3025 	struct symbol *ctype, *sym;
3026 	struct expression *fn = expr->fn;
3027 	struct expression_list *arglist = expr->args;
3028 
3029 	if (!evaluate_expression(fn))
3030 		return NULL;
3031 	sym = ctype = fn->ctype;
3032 	if (ctype->type == SYM_NODE)
3033 		ctype = ctype->ctype.base_type;
3034 	if (ctype->type == SYM_PTR)
3035 		ctype = get_base_type(ctype);
3036 
3037 	if (ctype->type != SYM_FN) {
3038 		struct expression *arg;
3039 		expression_error(expr, "not a function %s",
3040 			     show_ident(sym->ident));
3041 		/* do typechecking in arguments */
3042 		FOR_EACH_PTR (arglist, arg) {
3043 			evaluate_expression(arg);
3044 		} END_FOR_EACH_PTR(arg);
3045 		return NULL;
3046 	}
3047 
3048 	examine_fn_arguments(ctype);
3049         if (sym->type == SYM_NODE && fn->type == EXPR_PREOP &&
3050 	    sym->op && sym->op->args) {
3051 		if (!sym->op->args(expr))
3052 			return NULL;
3053 	} else {
3054 		if (!evaluate_arguments(ctype, arglist))
3055 			return NULL;
3056 		args = expression_list_size(expr->args);
3057 		fnargs = symbol_list_size(ctype->arguments);
3058 		if (args < fnargs) {
3059 			expression_error(expr,
3060 				     "not enough arguments for function %s",
3061 				     show_ident(sym->ident));
3062 			return NULL;
3063 		}
3064 		if (args > fnargs && !ctype->variadic)
3065 			expression_error(expr,
3066 				     "too many arguments for function %s",
3067 				     show_ident(sym->ident));
3068 	}
3069 	expr->ctype = ctype->ctype.base_type;
3070 	if (sym->type == SYM_NODE) {
3071 		if (evaluate_symbol_call(expr))
3072 			return expr->ctype;
3073 	}
3074 	return expr->ctype;
3075 }
3076 
3077 static struct symbol *evaluate_offsetof(struct expression *expr)
3078 {
3079 	struct expression *e = expr->down;
3080 	struct symbol *ctype = expr->in;
3081 	int class;
3082 
3083 	if (expr->op == '.') {
3084 		struct symbol *field;
3085 		int offset = 0;
3086 		if (!ctype) {
3087 			expression_error(expr, "expected structure or union");
3088 			return NULL;
3089 		}
3090 		examine_symbol_type(ctype);
3091 		class = classify_type(ctype, &ctype);
3092 		if (class != TYPE_COMPOUND) {
3093 			expression_error(expr, "expected structure or union");
3094 			return NULL;
3095 		}
3096 
3097 		field = find_identifier(expr->ident, ctype->symbol_list, &offset);
3098 		if (!field) {
3099 			expression_error(expr, "unknown member");
3100 			return NULL;
3101 		}
3102 		ctype = field;
3103 		expr->type = EXPR_VALUE;
3104 		expr->flags = CEF_SET_ICE;
3105 		expr->value = offset;
3106 		expr->taint = 0;
3107 		expr->ctype = size_t_ctype;
3108 	} else {
3109 		if (!ctype) {
3110 			expression_error(expr, "expected structure or union");
3111 			return NULL;
3112 		}
3113 		examine_symbol_type(ctype);
3114 		class = classify_type(ctype, &ctype);
3115 		if (class != (TYPE_COMPOUND | TYPE_PTR)) {
3116 			expression_error(expr, "expected array");
3117 			return NULL;
3118 		}
3119 		ctype = ctype->ctype.base_type;
3120 		if (!expr->index) {
3121 			expr->type = EXPR_VALUE;
3122 			expr->flags = CEF_SET_ICE;
3123 			expr->value = 0;
3124 			expr->taint = 0;
3125 			expr->ctype = size_t_ctype;
3126 		} else {
3127 			struct expression *idx = expr->index, *m;
3128 			struct symbol *i_type = evaluate_expression(idx);
3129 			unsigned old_idx_flags;
3130 			int i_class = classify_type(i_type, &i_type);
3131 
3132 			if (!is_int(i_class)) {
3133 				expression_error(expr, "non-integer index");
3134 				return NULL;
3135 			}
3136 			unrestrict(idx, i_class, &i_type);
3137 			old_idx_flags = idx->flags;
3138 			idx = cast_to(idx, size_t_ctype);
3139 			idx->flags = old_idx_flags;
3140 			m = alloc_const_expression(expr->pos,
3141 						   bits_to_bytes(ctype->bit_size));
3142 			m->ctype = size_t_ctype;
3143 			m->flags = CEF_SET_INT;
3144 			expr->type = EXPR_BINOP;
3145 			expr->left = idx;
3146 			expr->right = m;
3147 			expr->op = '*';
3148 			expr->ctype = size_t_ctype;
3149 			expr->flags = m->flags & idx->flags & ~CEF_CONST_MASK;
3150 		}
3151 	}
3152 	if (e) {
3153 		struct expression *copy = __alloc_expression(0);
3154 		*copy = *expr;
3155 		if (e->type == EXPR_OFFSETOF)
3156 			e->in = ctype;
3157 		if (!evaluate_expression(e))
3158 			return NULL;
3159 		expr->type = EXPR_BINOP;
3160 		expr->flags = e->flags & copy->flags & ~CEF_CONST_MASK;
3161 		expr->op = '+';
3162 		expr->ctype = size_t_ctype;
3163 		expr->left = copy;
3164 		expr->right = e;
3165 	}
3166 	return size_t_ctype;
3167 }
3168 
3169 struct symbol *evaluate_expression(struct expression *expr)
3170 {
3171 	if (!expr)
3172 		return NULL;
3173 	if (expr->ctype)
3174 		return expr->ctype;
3175 
3176 	switch (expr->type) {
3177 	case EXPR_VALUE:
3178 	case EXPR_FVALUE:
3179 		expression_error(expr, "value expression without a type");
3180 		return NULL;
3181 	case EXPR_STRING:
3182 		return evaluate_string(expr);
3183 	case EXPR_SYMBOL:
3184 		return evaluate_symbol_expression(expr);
3185 	case EXPR_BINOP:
3186 		if (!evaluate_expression(expr->left))
3187 			return NULL;
3188 		if (!evaluate_expression(expr->right))
3189 			return NULL;
3190 		return evaluate_binop(expr);
3191 	case EXPR_LOGICAL:
3192 		return evaluate_logical(expr);
3193 	case EXPR_COMMA:
3194 		evaluate_expression(expr->left);
3195 		if (!evaluate_expression(expr->right))
3196 			return NULL;
3197 		return evaluate_comma(expr);
3198 	case EXPR_COMPARE:
3199 		if (!evaluate_expression(expr->left))
3200 			return NULL;
3201 		if (!evaluate_expression(expr->right))
3202 			return NULL;
3203 		return evaluate_compare(expr);
3204 	case EXPR_ASSIGNMENT:
3205 		if (!evaluate_expression(expr->left))
3206 			return NULL;
3207 		if (!evaluate_expression(expr->right))
3208 			return NULL;
3209 		return evaluate_assignment(expr);
3210 	case EXPR_PREOP:
3211 		if (!evaluate_expression(expr->unop))
3212 			return NULL;
3213 		return evaluate_preop(expr);
3214 	case EXPR_POSTOP:
3215 		if (!evaluate_expression(expr->unop))
3216 			return NULL;
3217 		return evaluate_postop(expr);
3218 	case EXPR_CAST:
3219 	case EXPR_FORCE_CAST:
3220 	case EXPR_IMPLIED_CAST:
3221 		return evaluate_cast(expr);
3222 	case EXPR_SIZEOF:
3223 		return evaluate_sizeof(expr);
3224 	case EXPR_PTRSIZEOF:
3225 		return evaluate_ptrsizeof(expr);
3226 	case EXPR_ALIGNOF:
3227 		return evaluate_alignof(expr);
3228 	case EXPR_DEREF:
3229 		return evaluate_member_dereference(expr);
3230 	case EXPR_CALL:
3231 		return evaluate_call(expr);
3232 	case EXPR_SELECT:
3233 	case EXPR_CONDITIONAL:
3234 		return evaluate_conditional_expression(expr);
3235 	case EXPR_STATEMENT:
3236 		expr->ctype = evaluate_statement(expr->statement);
3237 		return expr->ctype;
3238 
3239 	case EXPR_LABEL:
3240 		expr->ctype = &ptr_ctype;
3241 		return &ptr_ctype;
3242 
3243 	case EXPR_TYPE:
3244 		/* Evaluate the type of the symbol .. */
3245 		evaluate_symbol(expr->symbol);
3246 		/* .. but the type of the _expression_ is a "type" */
3247 		expr->ctype = &type_ctype;
3248 		return &type_ctype;
3249 
3250 	case EXPR_OFFSETOF:
3251 		return evaluate_offsetof(expr);
3252 
3253 	/* These can not exist as stand-alone expressions */
3254 	case EXPR_INITIALIZER:
3255 	case EXPR_IDENTIFIER:
3256 	case EXPR_INDEX:
3257 	case EXPR_POS:
3258 		expression_error(expr, "internal front-end error: initializer in expression");
3259 		return NULL;
3260 	case EXPR_SLICE:
3261 		expression_error(expr, "internal front-end error: SLICE re-evaluated");
3262 		return NULL;
3263 	}
3264 	return NULL;
3265 }
3266 
3267 static void check_duplicates(struct symbol *sym)
3268 {
3269 	int declared = 0;
3270 	struct symbol *next = sym;
3271 	int initialized = sym->initializer != NULL;
3272 
3273 	while ((next = next->same_symbol) != NULL) {
3274 		const char *typediff;
3275 		evaluate_symbol(next);
3276 		if (initialized && next->initializer) {
3277 			sparse_error(sym->pos, "symbol '%s' has multiple initializers (originally initialized at %s:%d)",
3278 				show_ident(sym->ident),
3279 				stream_name(next->pos.stream), next->pos.line);
3280 			/* Only warn once */
3281 			initialized = 0;
3282 		}
3283 		declared++;
3284 		typediff = type_difference(&sym->ctype, &next->ctype, 0, 0);
3285 		if (typediff) {
3286 			sparse_error(sym->pos, "symbol '%s' redeclared with different type (originally declared at %s:%d) - %s",
3287 				show_ident(sym->ident),
3288 				stream_name(next->pos.stream), next->pos.line, typediff);
3289 			return;
3290 		}
3291 	}
3292 	if (!declared) {
3293 		unsigned long mod = sym->ctype.modifiers;
3294 		if (mod & (MOD_STATIC | MOD_REGISTER))
3295 			return;
3296 		if (!(mod & MOD_TOPLEVEL))
3297 			return;
3298 		if (!Wdecl)
3299 			return;
3300 		if (sym->ident == &main_ident)
3301 			return;
3302 		warning(sym->pos, "symbol '%s' was not declared. Should it be static?", show_ident(sym->ident));
3303 	}
3304 }
3305 
3306 static struct symbol *evaluate_symbol(struct symbol *sym)
3307 {
3308 	struct symbol *base_type;
3309 
3310 	if (!sym)
3311 		return sym;
3312 	if (sym->evaluated)
3313 		return sym;
3314 	sym->evaluated = 1;
3315 
3316 	sym = examine_symbol_type(sym);
3317 	base_type = get_base_type(sym);
3318 	if (!base_type)
3319 		return NULL;
3320 
3321 	/* Evaluate the initializers */
3322 	if (sym->initializer)
3323 		evaluate_initializer(sym, &sym->initializer);
3324 
3325 	/* And finally, evaluate the body of the symbol too */
3326 	if (base_type->type == SYM_FN) {
3327 		struct symbol *curr = current_fn;
3328 
3329 		if (sym->definition && sym->definition != sym)
3330 			return evaluate_symbol(sym->definition);
3331 
3332 		current_fn = base_type;
3333 
3334 		examine_fn_arguments(base_type);
3335 		if (!base_type->stmt && base_type->inline_stmt)
3336 			uninline(sym);
3337 		if (base_type->stmt)
3338 			evaluate_statement(base_type->stmt);
3339 
3340 		current_fn = curr;
3341 	}
3342 
3343 	return base_type;
3344 }
3345 
3346 void evaluate_symbol_list(struct symbol_list *list)
3347 {
3348 	struct symbol *sym;
3349 
3350 	FOR_EACH_PTR(list, sym) {
3351 		has_error &= ~ERROR_CURR_PHASE;
3352 		evaluate_symbol(sym);
3353 		check_duplicates(sym);
3354 	} END_FOR_EACH_PTR(sym);
3355 }
3356 
3357 static struct symbol *evaluate_return_expression(struct statement *stmt)
3358 {
3359 	struct expression *expr = stmt->expression;
3360 	struct symbol *fntype;
3361 
3362 	evaluate_expression(expr);
3363 	fntype = current_fn->ctype.base_type;
3364 	if (!fntype || fntype == &void_ctype) {
3365 		if (expr && expr->ctype != &void_ctype)
3366 			expression_error(expr, "return expression in %s function", fntype?"void":"typeless");
3367 		if (expr && Wreturn_void)
3368 			warning(stmt->pos, "returning void-valued expression");
3369 		return NULL;
3370 	}
3371 
3372 	if (!expr) {
3373 		sparse_error(stmt->pos, "return with no return value");
3374 		return NULL;
3375 	}
3376 	if (!expr->ctype)
3377 		return NULL;
3378 	compatible_assignment_types(expr, fntype, &stmt->expression, "return expression");
3379 	return NULL;
3380 }
3381 
3382 static void evaluate_if_statement(struct statement *stmt)
3383 {
3384 	if (!stmt->if_conditional)
3385 		return;
3386 
3387 	evaluate_conditional(stmt->if_conditional, 0);
3388 	evaluate_statement(stmt->if_true);
3389 	evaluate_statement(stmt->if_false);
3390 }
3391 
3392 static void evaluate_iterator(struct statement *stmt)
3393 {
3394 	evaluate_symbol_list(stmt->iterator_syms);
3395 	evaluate_conditional(stmt->iterator_pre_condition, 1);
3396 	evaluate_conditional(stmt->iterator_post_condition,1);
3397 	evaluate_statement(stmt->iterator_pre_statement);
3398 	evaluate_statement(stmt->iterator_statement);
3399 	evaluate_statement(stmt->iterator_post_statement);
3400 }
3401 
3402 static void verify_output_constraint(struct expression *expr, const char *constraint)
3403 {
3404 	switch (*constraint) {
3405 	case '=':	/* Assignment */
3406 	case '+':	/* Update */
3407 		break;
3408 	default:
3409 		expression_error(expr, "output constraint is not an assignment constraint (\"%s\")", constraint);
3410 	}
3411 }
3412 
3413 static void verify_input_constraint(struct expression *expr, const char *constraint)
3414 {
3415 	switch (*constraint) {
3416 	case '=':	/* Assignment */
3417 	case '+':	/* Update */
3418 		expression_error(expr, "input constraint with assignment (\"%s\")", constraint);
3419 	}
3420 }
3421 
3422 static void evaluate_asm_statement(struct statement *stmt)
3423 {
3424 	struct expression *expr;
3425 	struct symbol *sym;
3426 	int state;
3427 
3428 	expr = stmt->asm_string;
3429 	if (!expr || expr->type != EXPR_STRING) {
3430 		sparse_error(stmt->pos, "need constant string for inline asm");
3431 		return;
3432 	}
3433 
3434 	state = 0;
3435 	FOR_EACH_PTR(stmt->asm_outputs, expr) {
3436 		switch (state) {
3437 		case 0: /* Identifier */
3438 			state = 1;
3439 			continue;
3440 
3441 		case 1: /* Constraint */
3442 			state = 2;
3443 			if (!expr || expr->type != EXPR_STRING) {
3444 				sparse_error(expr ? expr->pos : stmt->pos, "asm output constraint is not a string");
3445 				*THIS_ADDRESS(expr) = NULL;
3446 				continue;
3447 			}
3448 			verify_output_constraint(expr, expr->string->data);
3449 			continue;
3450 
3451 		case 2: /* Expression */
3452 			state = 0;
3453 			if (!evaluate_expression(expr))
3454 				return;
3455 			if (!lvalue_expression(expr))
3456 				warning(expr->pos, "asm output is not an lvalue");
3457 			evaluate_assign_to(expr, expr->ctype);
3458 			continue;
3459 		}
3460 	} END_FOR_EACH_PTR(expr);
3461 
3462 	state = 0;
3463 	FOR_EACH_PTR(stmt->asm_inputs, expr) {
3464 		switch (state) {
3465 		case 0: /* Identifier */
3466 			state = 1;
3467 			continue;
3468 
3469 		case 1:	/* Constraint */
3470 			state = 2;
3471 			if (!expr || expr->type != EXPR_STRING) {
3472 				sparse_error(expr ? expr->pos : stmt->pos, "asm input constraint is not a string");
3473 				*THIS_ADDRESS(expr) = NULL;
3474 				continue;
3475 			}
3476 			verify_input_constraint(expr, expr->string->data);
3477 			continue;
3478 
3479 		case 2: /* Expression */
3480 			state = 0;
3481 			if (!evaluate_expression(expr))
3482 				return;
3483 			continue;
3484 		}
3485 	} END_FOR_EACH_PTR(expr);
3486 
3487 	FOR_EACH_PTR(stmt->asm_clobbers, expr) {
3488 		if (!expr) {
3489 			sparse_error(stmt->pos, "bad asm clobbers");
3490 			return;
3491 		}
3492 		if (expr->type == EXPR_STRING)
3493 			continue;
3494 		expression_error(expr, "asm clobber is not a string");
3495 	} END_FOR_EACH_PTR(expr);
3496 
3497 	FOR_EACH_PTR(stmt->asm_labels, sym) {
3498 		if (!sym || sym->type != SYM_LABEL) {
3499 			sparse_error(stmt->pos, "bad asm label");
3500 			return;
3501 		}
3502 	} END_FOR_EACH_PTR(sym);
3503 }
3504 
3505 static void evaluate_case_statement(struct statement *stmt)
3506 {
3507 	evaluate_expression(stmt->case_expression);
3508 	evaluate_expression(stmt->case_to);
3509 	evaluate_statement(stmt->case_statement);
3510 }
3511 
3512 static void check_case_type(struct expression *switch_expr,
3513 			    struct expression *case_expr,
3514 			    struct expression **enumcase)
3515 {
3516 	struct symbol *switch_type, *case_type;
3517 	int sclass, cclass;
3518 
3519 	if (!case_expr)
3520 		return;
3521 
3522 	switch_type = switch_expr->ctype;
3523 	case_type = evaluate_expression(case_expr);
3524 
3525 	if (!switch_type || !case_type)
3526 		goto Bad;
3527 	if (enumcase) {
3528 		if (*enumcase)
3529 			warn_for_different_enum_types(case_expr->pos, case_type, (*enumcase)->ctype);
3530 		else if (is_enum_type(case_type))
3531 			*enumcase = case_expr;
3532 	}
3533 
3534 	sclass = classify_type(switch_type, &switch_type);
3535 	cclass = classify_type(case_type, &case_type);
3536 
3537 	/* both should be arithmetic */
3538 	if (!(sclass & cclass & TYPE_NUM))
3539 		goto Bad;
3540 
3541 	/* neither should be floating */
3542 	if ((sclass | cclass) & TYPE_FLOAT)
3543 		goto Bad;
3544 
3545 	/* if neither is restricted, we are OK */
3546 	if (!((sclass | cclass) & TYPE_RESTRICT))
3547 		return;
3548 
3549 	if (!restricted_binop_type(SPECIAL_EQUAL, case_expr, switch_expr,
3550 				   cclass, sclass, case_type, switch_type)) {
3551 		unrestrict(case_expr, cclass, &case_type);
3552 		unrestrict(switch_expr, sclass, &switch_type);
3553 	}
3554 	return;
3555 
3556 Bad:
3557 	expression_error(case_expr, "incompatible types for 'case' statement");
3558 }
3559 
3560 static void evaluate_switch_statement(struct statement *stmt)
3561 {
3562 	struct symbol *sym;
3563 	struct expression *enumcase = NULL;
3564 	struct expression **enumcase_holder = &enumcase;
3565 	struct expression *sel = stmt->switch_expression;
3566 
3567 	evaluate_expression(sel);
3568 	evaluate_statement(stmt->switch_statement);
3569 	if (!sel)
3570 		return;
3571 	if (sel->ctype && is_enum_type(sel->ctype))
3572 		enumcase_holder = NULL; /* Only check cases against switch */
3573 
3574 	FOR_EACH_PTR(stmt->switch_case->symbol_list, sym) {
3575 		struct statement *case_stmt = sym->stmt;
3576 		check_case_type(sel, case_stmt->case_expression, enumcase_holder);
3577 		check_case_type(sel, case_stmt->case_to, enumcase_holder);
3578 	} END_FOR_EACH_PTR(sym);
3579 }
3580 
3581 static void evaluate_goto_statement(struct statement *stmt)
3582 {
3583 	struct symbol *label = stmt->goto_label;
3584 
3585 	if (label && !label->stmt && !lookup_keyword(label->ident, NS_KEYWORD))
3586 		sparse_error(stmt->pos, "label '%s' was not declared", show_ident(label->ident));
3587 
3588 	evaluate_expression(stmt->goto_expression);
3589 }
3590 
3591 struct symbol *evaluate_statement(struct statement *stmt)
3592 {
3593 	if (!stmt)
3594 		return NULL;
3595 
3596 	switch (stmt->type) {
3597 	case STMT_DECLARATION: {
3598 		struct symbol *s;
3599 		FOR_EACH_PTR(stmt->declaration, s) {
3600 			evaluate_symbol(s);
3601 		} END_FOR_EACH_PTR(s);
3602 		return NULL;
3603 	}
3604 
3605 	case STMT_RETURN:
3606 		return evaluate_return_expression(stmt);
3607 
3608 	case STMT_EXPRESSION:
3609 		if (!evaluate_expression(stmt->expression))
3610 			return NULL;
3611 		if (stmt->expression->ctype == &null_ctype)
3612 			stmt->expression = cast_to(stmt->expression, &ptr_ctype);
3613 		return degenerate(stmt->expression);
3614 
3615 	case STMT_COMPOUND: {
3616 		struct statement *s;
3617 		struct symbol *type = NULL;
3618 
3619 		/* Evaluate the return symbol in the compound statement */
3620 		evaluate_symbol(stmt->ret);
3621 
3622 		/*
3623 		 * Then, evaluate each statement, making the type of the
3624 		 * compound statement be the type of the last statement
3625 		 */
3626 		type = evaluate_statement(stmt->args);
3627 		FOR_EACH_PTR(stmt->stmts, s) {
3628 			type = evaluate_statement(s);
3629 		} END_FOR_EACH_PTR(s);
3630 		if (!type)
3631 			type = &void_ctype;
3632 		return type;
3633 	}
3634 	case STMT_IF:
3635 		evaluate_if_statement(stmt);
3636 		return NULL;
3637 	case STMT_ITERATOR:
3638 		evaluate_iterator(stmt);
3639 		return NULL;
3640 	case STMT_SWITCH:
3641 		evaluate_switch_statement(stmt);
3642 		return NULL;
3643 	case STMT_CASE:
3644 		evaluate_case_statement(stmt);
3645 		return NULL;
3646 	case STMT_LABEL:
3647 		return evaluate_statement(stmt->label_statement);
3648 	case STMT_GOTO:
3649 		evaluate_goto_statement(stmt);
3650 		return NULL;
3651 	case STMT_NONE:
3652 		break;
3653 	case STMT_ASM:
3654 		evaluate_asm_statement(stmt);
3655 		return NULL;
3656 	case STMT_CONTEXT:
3657 		evaluate_expression(stmt->expression);
3658 		return NULL;
3659 	case STMT_RANGE:
3660 		evaluate_expression(stmt->range_expression);
3661 		evaluate_expression(stmt->range_low);
3662 		evaluate_expression(stmt->range_high);
3663 		return NULL;
3664 	}
3665 	return NULL;
3666 }
3667