Lines Matching refs:expr

50 static struct symbol *degenerate(struct expression *expr);
53 static inline int valid_expr_type(struct expression *expr) in valid_expr_type() argument
55 return expr && valid_type(expr->ctype); in valid_expr_type()
58 static inline int valid_subexpr_type(struct expression *expr) in valid_subexpr_type() argument
60 return valid_expr_type(expr->left) in valid_subexpr_type()
61 && valid_expr_type(expr->right); in valid_subexpr_type()
64 static struct symbol *evaluate_symbol_expression(struct expression *expr) in evaluate_symbol_expression() argument
67 struct symbol *sym = expr->symbol; in evaluate_symbol_expression()
71 expression_error(expr, "undefined identifier '%s'", show_ident(expr->symbol_name)); in evaluate_symbol_expression()
79 expression_error(expr, "identifier '%s' has no type", show_ident(expr->symbol_name)); in evaluate_symbol_expression()
83 addr = alloc_expression(expr->pos, EXPR_SYMBOL); in evaluate_symbol_expression()
85 addr->symbol_name = expr->symbol_name; in evaluate_symbol_expression()
87 addr->flags = expr->flags; in evaluate_symbol_expression()
88 expr->type = EXPR_PREOP; in evaluate_symbol_expression()
89 expr->op = '*'; in evaluate_symbol_expression()
90 expr->unop = addr; in evaluate_symbol_expression()
91 expr->flags = CEF_NONE; in evaluate_symbol_expression()
94 expr->ctype = sym; in evaluate_symbol_expression()
98 static struct symbol *evaluate_string(struct expression *expr) in evaluate_string() argument
100 struct symbol *sym = alloc_symbol(expr->pos, SYM_NODE); in evaluate_string()
101 struct symbol *array = alloc_symbol(expr->pos, SYM_ARRAY); in evaluate_string()
102 struct expression *addr = alloc_expression(expr->pos, EXPR_SYMBOL); in evaluate_string()
103 struct expression *initstr = alloc_expression(expr->pos, EXPR_STRING); in evaluate_string()
104 unsigned int length = expr->string->length; in evaluate_string()
106 sym->array_size = alloc_const_expression(expr->pos, length); in evaluate_string()
115 initstr->string = expr->string; in evaluate_string()
127 expr->type = EXPR_PREOP; in evaluate_string()
128 expr->op = '*'; in evaluate_string()
129 expr->unop = addr; in evaluate_string()
130 expr->ctype = sym; in evaluate_string()
232 static int is_same_type(struct expression *expr, struct symbol *new) in is_same_type() argument
234 struct symbol *old = expr->ctype; in is_same_type()
265 warning(expr->pos, "implicit cast %s nocast type", tofrom); in is_same_type()
292 static int cast_flags(struct expression *expr, struct expression *target);
293 static struct symbol *cast_to_bool(struct expression *expr);
304 struct expression *expr; in cast_to() local
344 expr = alloc_expression(old->pos, EXPR_IMPLIED_CAST); in cast_to()
345 expr->ctype = type; in cast_to()
346 expr->cast_type = type; in cast_to()
347 expr->cast_expression = old; in cast_to()
348 expr->flags = cast_flags(expr, old); in cast_to()
351 cast_to_bool(expr); in cast_to()
353 return expr; in cast_to()
409 static struct symbol *bad_expr_type(struct expression *expr) in bad_expr_type() argument
411 switch (expr->type) { in bad_expr_type()
414 if (!valid_subexpr_type(expr)) in bad_expr_type()
416 sparse_error(expr->pos, "incompatible types for operation (%s)", show_special(expr->op)); in bad_expr_type()
417 info(expr->pos, " left side has type %s", show_typename(expr->left->ctype)); in bad_expr_type()
418 info(expr->pos, " right side has type %s", show_typename(expr->right->ctype)); in bad_expr_type()
422 if (!valid_expr_type(expr->unop)) in bad_expr_type()
424 sparse_error(expr->pos, "incompatible types for operation (%s)", show_special(expr->op)); in bad_expr_type()
425 info(expr->pos, " argument has type %s", show_typename(expr->unop->ctype)); in bad_expr_type()
431 expr->flags = CEF_NONE; in bad_expr_type()
432 return expr->ctype = &bad_ctype; in bad_expr_type()
527 static inline void unrestrict(struct expression *expr, in unrestrict() argument
533 warning(expr->pos, "%s degrades to integer", in unrestrict()
581 static inline int lvalue_expression(struct expression *expr) in lvalue_expression() argument
583 return expr->type == EXPR_PREOP && expr->op == '*'; in lvalue_expression()
586 static struct symbol *evaluate_ptr_add(struct expression *expr, struct symbol *itype) in evaluate_ptr_add() argument
588 struct expression *index = expr->right; in evaluate_ptr_add()
592 classify_type(degenerate(expr->left), &ctype); in evaluate_ptr_add()
599 if ((expr->left->flags & CEF_ADDR) && (expr->right->flags & CEF_ICE)) in evaluate_ptr_add()
600 expr->flags = CEF_ADDR; in evaluate_ptr_add()
603 expression_error(expr, "missing type information"); in evaluate_ptr_add()
607 expression_error(expr, "arithmetics on pointers to functions"); in evaluate_ptr_add()
616 expr->ctype = ctype; in evaluate_ptr_add()
622 struct expression *val = alloc_expression(expr->pos, EXPR_VALUE); in evaluate_ptr_add()
634 expr->right = val; in evaluate_ptr_add()
642 struct expression *val = alloc_expression(expr->pos, EXPR_VALUE); in evaluate_ptr_add()
643 struct expression *mul = alloc_expression(expr->pos, EXPR_BINOP); in evaluate_ptr_add()
655 expr->right = index; in evaluate_ptr_add()
821 static void bad_null(struct expression *expr) in bad_null() argument
824 warning(expr->pos, "Using plain integer as NULL pointer"); in bad_null()
835 static struct symbol *evaluate_ptr_sub(struct expression *expr) in evaluate_ptr_sub() argument
839 struct expression *l = expr->left; in evaluate_ptr_sub()
840 struct expression *r = expr->right; in evaluate_ptr_sub()
852 expression_error(expr, "subtraction of different types can't work (%s)", typediff); in evaluate_ptr_sub()
855 expression_error(expr, "subtraction of functions? Share your drugs"); in evaluate_ptr_sub()
859 expr->ctype = ssize_t_ctype; in evaluate_ptr_sub()
861 struct expression *sub = alloc_expression(expr->pos, EXPR_BINOP); in evaluate_ptr_sub()
862 struct expression *div = expr; in evaluate_ptr_sub()
863 struct expression *val = alloc_expression(expr->pos, EXPR_VALUE); in evaluate_ptr_sub()
871 warning(expr->pos, "potentially expensive pointer subtraction"); in evaluate_ptr_sub()
872 info(expr->pos, " '%s' has a non-power-of-2 size: %lu", show_typename(lbase), value); in evaluate_ptr_sub()
891 static struct symbol *evaluate_conditional(struct expression *expr, int iterator) in evaluate_conditional() argument
895 if (!expr) in evaluate_conditional()
898 if (!iterator && expr->type == EXPR_ASSIGNMENT && expr->op == '=') in evaluate_conditional()
899 warning(expr->pos, "assignment expression in conditional"); in evaluate_conditional()
901 ctype = evaluate_expression(expr); in evaluate_conditional()
905 warning(expr->pos, "testing a 'safe expression'"); in evaluate_conditional()
908 warning(expr->pos, "the address of %s will always evaluate as true", "a function"); in evaluate_conditional()
911 warning(expr->pos, "the address of %s will always evaluate as true", "an array"); in evaluate_conditional()
913 sparse_error(expr->pos, "incorrect type in conditional (non-scalar type)"); in evaluate_conditional()
914 info(expr->pos, " got %s", show_typename(ctype)); in evaluate_conditional()
918 ctype = degenerate(expr); in evaluate_conditional()
922 static struct symbol *evaluate_logical(struct expression *expr) in evaluate_logical() argument
924 if (!evaluate_conditional(expr->left, 0)) in evaluate_logical()
926 if (!evaluate_conditional(expr->right, 0)) in evaluate_logical()
930 expr->ctype = &int_ctype; in evaluate_logical()
931 expr->flags = expr->left->flags & expr->right->flags; in evaluate_logical()
932 expr->flags &= ~(CEF_CONST_MASK | CEF_ADDR); in evaluate_logical()
936 static struct symbol *evaluate_binop(struct expression *expr) in evaluate_binop() argument
939 int lclass = classify_type(expr->left->ctype, &ltype); in evaluate_binop()
940 int rclass = classify_type(expr->right->ctype, &rtype); in evaluate_binop()
941 int op = expr->op; in evaluate_binop()
945 expr->flags = expr->left->flags & expr->right->flags; in evaluate_binop()
946 expr->flags &= ~CEF_CONST_MASK; in evaluate_binop()
953 return bad_expr_type(expr); in evaluate_binop()
959 unrestrict(expr->left, lclass, &ltype); in evaluate_binop()
960 unrestrict(expr->right, rclass, &rtype); in evaluate_binop()
965 const unsigned left_not = expr->left->type == EXPR_PREOP in evaluate_binop()
966 && expr->left->op == '!'; in evaluate_binop()
967 const unsigned right_not = expr->right->type == EXPR_PREOP in evaluate_binop()
968 && expr->right->op == '!'; in evaluate_binop()
970 warning(expr->pos, "dubious: %sx %c %sy", in evaluate_binop()
975 ltype = usual_conversions(op, expr->left, expr->right, in evaluate_binop()
980 expr->left = cast_to(expr->left, ltype); in evaluate_binop()
981 expr->right = cast_to(expr->right, rtype); in evaluate_binop()
982 expr->ctype = ctype; in evaluate_binop()
988 unrestrict(expr->right, rclass, &rtype); in evaluate_binop()
989 return evaluate_ptr_add(expr, rtype); in evaluate_binop()
994 struct expression *index = expr->left; in evaluate_binop()
996 expr->left = expr->right; in evaluate_binop()
997 expr->right = index; in evaluate_binop()
998 return evaluate_ptr_add(expr, ltype); in evaluate_binop()
1002 if (lclass & rclass & TYPE_PTR && expr->op == '-') in evaluate_binop()
1003 return evaluate_ptr_sub(expr); in evaluate_binop()
1005 return bad_expr_type(expr); in evaluate_binop()
1008 static struct symbol *evaluate_comma(struct expression *expr) in evaluate_comma() argument
1010 expr->ctype = degenerate(expr->right); in evaluate_comma()
1011 if (expr->ctype == &null_ctype) in evaluate_comma()
1012 expr->ctype = &ptr_ctype; in evaluate_comma()
1013 expr->flags &= expr->left->flags & expr->right->flags; in evaluate_comma()
1014 return expr->ctype; in evaluate_comma()
1045 static struct symbol *evaluate_compare(struct expression *expr) in evaluate_compare() argument
1047 struct expression *left = expr->left, *right = expr->right; in evaluate_compare()
1060 expr->flags = CEF_SET_ICE; in evaluate_compare()
1065 warning(expr->pos, "testing a 'safe expression'"); in evaluate_compare()
1067 expr->flags = left->flags & right->flags & ~CEF_CONST_MASK & ~CEF_ADDR; in evaluate_compare()
1071 ctype = usual_conversions(expr->op, expr->left, expr->right, in evaluate_compare()
1073 expr->left = cast_to(expr->left, ctype); in evaluate_compare()
1074 expr->right = cast_to(expr->right, ctype); in evaluate_compare()
1076 expr->op = modify_for_unsigned(expr->op); in evaluate_compare()
1082 return bad_expr_type(expr); in evaluate_compare()
1085 if (expr->op == SPECIAL_EQUAL || expr->op == SPECIAL_NOTEQUAL) { in evaluate_compare()
1093 int positive = expr->op == SPECIAL_EQUAL; in evaluate_compare()
1094 expr->type = EXPR_VALUE; in evaluate_compare()
1095 expr->value = positive; in evaluate_compare()
1109 return bad_expr_type(expr); in evaluate_compare()
1110 expr->op = modify_for_unsigned(expr->op); in evaluate_compare()
1116 if (expr->op == SPECIAL_EQUAL || expr->op == SPECIAL_NOTEQUAL) { in evaluate_compare()
1135 expression_error(expr, "incompatible types in comparison expression (%s):", typediff); in evaluate_compare()
1136 info(expr->pos, " %s", show_typename(ltype)); in evaluate_compare()
1137 info(expr->pos, " %s", show_typename(rtype)); in evaluate_compare()
1142 expr->ctype = &int_ctype; in evaluate_compare()
1153 static struct symbol *evaluate_conditional_expression(struct expression *expr) in evaluate_conditional_expression() argument
1161 if (!evaluate_conditional(expr->conditional, 0)) in evaluate_conditional_expression()
1163 if (!evaluate_expression(expr->cond_false)) in evaluate_conditional_expression()
1166 ctype = degenerate(expr->conditional); in evaluate_conditional_expression()
1167 rtype = degenerate(expr->cond_false); in evaluate_conditional_expression()
1169 cond = &expr->conditional; in evaluate_conditional_expression()
1171 if (expr->cond_true) { in evaluate_conditional_expression()
1172 if (!evaluate_expression(expr->cond_true)) in evaluate_conditional_expression()
1174 ltype = degenerate(expr->cond_true); in evaluate_conditional_expression()
1175 cond = &expr->cond_true; in evaluate_conditional_expression()
1178 expr->flags = (expr->conditional->flags & (*cond)->flags & in evaluate_conditional_expression()
1179 expr->cond_false->flags & ~CEF_CONST_MASK); in evaluate_conditional_expression()
1193 if (expr->conditional->flags & (CEF_ACE | CEF_ADDR)) in evaluate_conditional_expression()
1194 expr->flags = (*cond)->flags & expr->cond_false->flags & ~CEF_CONST_MASK; in evaluate_conditional_expression()
1199 ctype = usual_conversions('?', *cond, expr->cond_false, in evaluate_conditional_expression()
1202 expr->cond_false = cast_to(expr->cond_false, ctype); in evaluate_conditional_expression()
1208 int is_null2 = is_null_pointer_constant(expr->cond_false); in evaluate_conditional_expression()
1212 expr->cond_false = cast_to(expr->cond_false, &ptr_ctype); in evaluate_conditional_expression()
1225 bad_null(expr->cond_false); in evaluate_conditional_expression()
1226 expr->cond_false = cast_to(expr->cond_false, ltype); in evaluate_conditional_expression()
1273 expression_error(expr, "incompatible types in conditional expression (%s):", typediff); in evaluate_conditional_expression()
1274 info(expr->pos, " %s", show_typename(ltype)); in evaluate_conditional_expression()
1275 info(expr->pos, " %s", show_typename(rtype)); in evaluate_conditional_expression()
1280 switch (expr_truth_value(expr->conditional)) { in evaluate_conditional_expression()
1281 case 1: expr->ctype = ltype; in evaluate_conditional_expression()
1283 case 0: expr->ctype = rtype; in evaluate_conditional_expression()
1291 expr->ctype = ctype; in evaluate_conditional_expression()
1302 expr->cond_false = cast_to(expr->cond_false, ctype); in evaluate_conditional_expression()
1315 static int evaluate_assign_op(struct expression *expr) in evaluate_assign_op() argument
1317 struct symbol *target = expr->left->ctype; in evaluate_assign_op()
1318 struct symbol *source = expr->right->ctype; in evaluate_assign_op()
1322 int op = expr->op; in evaluate_assign_op()
1326 expression_error(expr, "invalid assignment"); in evaluate_assign_op()
1331 warning(expr->pos, "bad assignment (%s) to %s", in evaluate_assign_op()
1333 expr->right = cast_to(expr->right, target); in evaluate_assign_op()
1339 if (!restricted_value(expr->right, t)) in evaluate_assign_op()
1343 unrestrict(expr->right, sclass, &s); in evaluate_assign_op()
1351 warning(expr->pos, "invalid assignment: %s", show_special(op)); in evaluate_assign_op()
1352 info(expr->pos, " left side has type %s", show_typename(t)); in evaluate_assign_op()
1353 info(expr->pos, " right side has type %s", show_typename(s)); in evaluate_assign_op()
1354 expr->right = cast_to(expr->right, target); in evaluate_assign_op()
1359 unrestrict(expr->right, sclass, &s); in evaluate_assign_op()
1360 evaluate_ptr_add(expr, s); in evaluate_assign_op()
1363 expression_error(expr, "invalid pointer assignment"); in evaluate_assign_op()
1367 expression_error(expr, "invalid assignment"); in evaluate_assign_op()
1371 target = usual_conversions(op, expr->left, expr->right, in evaluate_assign_op()
1374 expr->right = cast_to(expr->right, target); in evaluate_assign_op()
1496 static int compatible_assignment_types(struct expression *expr, struct symbol *target, in compatible_assignment_types() argument
1503 warning(expr->pos, "incorrect type in %s (%s)", where, typediff); in compatible_assignment_types()
1504 info(expr->pos, " expected %s", show_typename(target)); in compatible_assignment_types()
1505 info(expr->pos, " got %s", show_typename(source)); in compatible_assignment_types()
1530 static int compatible_argument_type(struct expression *expr, struct symbol *target, in compatible_argument_type() argument
1536 return compatible_assignment_types(expr, target, rp, where); in compatible_argument_type()
1539 static void mark_assigned(struct expression *expr) in mark_assigned() argument
1543 if (!expr) in mark_assigned()
1545 switch (expr->type) { in mark_assigned()
1547 sym = expr->symbol; in mark_assigned()
1556 mark_assigned(expr->left); in mark_assigned()
1557 mark_assigned(expr->right); in mark_assigned()
1561 mark_assigned(expr->cast_expression); in mark_assigned()
1564 mark_assigned(expr->base); in mark_assigned()
1581 static struct symbol *evaluate_assignment(struct expression *expr) in evaluate_assignment() argument
1583 struct expression *left = expr->left; in evaluate_assignment()
1587 expression_error(expr, "not an lvalue"); in evaluate_assignment()
1593 if (expr->op != '=') { in evaluate_assignment()
1594 if (!evaluate_assign_op(expr)) in evaluate_assignment()
1597 if (!compatible_assignment_types(expr, ltype, &expr->right, "assignment")) in evaluate_assignment()
1603 expr->ctype = ltype; in evaluate_assignment()
1656 static struct symbol *create_pointer(struct expression *expr, struct symbol *sym, int degenerate) in create_pointer() argument
1658 struct symbol *node = alloc_symbol(expr->pos, SYM_NODE); in create_pointer()
1659 struct symbol *ptr = alloc_symbol(expr->pos, SYM_PTR); in create_pointer()
1670 warning(expr->pos, "taking address of 'register' variable '%s'", show_ident(sym->ident)); in create_pointer()
1689 static struct symbol *degenerate(struct expression *expr) in degenerate() argument
1693 if (!expr) in degenerate()
1695 ctype = expr->ctype; in degenerate()
1710 if (expr->type == EXPR_SLICE) { in degenerate()
1711 struct symbol *a = alloc_symbol(expr->pos, SYM_NODE); in degenerate()
1714 a->ctype.base_type = expr->base->ctype; in degenerate()
1715 a->bit_size = expr->base->ctype->bit_size; in degenerate()
1716 a->array_size = expr->base->ctype->array_size; in degenerate()
1718 e0 = alloc_expression(expr->pos, EXPR_SYMBOL); in degenerate()
1722 e1 = alloc_expression(expr->pos, EXPR_PREOP); in degenerate()
1725 e1->ctype = expr->base->ctype; /* XXX */ in degenerate()
1727 e2 = alloc_expression(expr->pos, EXPR_ASSIGNMENT); in degenerate()
1729 e2->right = expr->base; in degenerate()
1731 e2->ctype = expr->base->ctype; in degenerate()
1733 if (expr->r_bitpos) { in degenerate()
1734 e3 = alloc_expression(expr->pos, EXPR_BINOP); in degenerate()
1737 e3->right = alloc_const_expression(expr->pos, in degenerate()
1738 bits_to_bytes(expr->r_bitpos)); in degenerate()
1744 e4 = alloc_expression(expr->pos, EXPR_COMMA); in degenerate()
1749 expr->unop = e4; in degenerate()
1750 expr->type = EXPR_PREOP; in degenerate()
1751 expr->op = '*'; in degenerate()
1754 if (expr->op != '*' || expr->type != EXPR_PREOP) { in degenerate()
1755 expression_error(expr, "strange non-value function or array"); in degenerate()
1758 *expr = *expr->unop; in degenerate()
1759 ctype = create_pointer(expr, ctype, 1); in degenerate()
1760 expr->ctype = ctype; in degenerate()
1767 static struct symbol *evaluate_addressof(struct expression *expr) in evaluate_addressof() argument
1769 struct expression *op = expr->unop; in evaluate_addressof()
1773 expression_error(expr, "not addressable"); in evaluate_addressof()
1777 *expr = *op->unop; in evaluate_addressof()
1779 if (expr->type == EXPR_SYMBOL) { in evaluate_addressof()
1780 struct symbol *sym = expr->symbol; in evaluate_addressof()
1789 if (expr->ctype == &lazy_ptr_ctype) { in evaluate_addressof()
1790 ctype = create_pointer(expr, ctype, 0); in evaluate_addressof()
1791 expr->ctype = ctype; in evaluate_addressof()
1793 return expr->ctype; in evaluate_addressof()
1797 static struct symbol *evaluate_dereference(struct expression *expr) in evaluate_dereference() argument
1799 struct expression *op = expr->unop; in evaluate_dereference()
1804 *expr = *op->unop; in evaluate_dereference()
1805 expr->flags = CEF_NONE; in evaluate_dereference()
1806 return expr->ctype; in evaluate_dereference()
1820 expression_error(expr, "cannot dereference this type"); in evaluate_dereference()
1823 *expr = *op; in evaluate_dereference()
1824 return expr->ctype; in evaluate_dereference()
1826 node = alloc_symbol(expr->pos, SYM_NODE); in evaluate_dereference()
1844 node = alloc_symbol(expr->pos, SYM_NODE); in evaluate_dereference()
1853 expr->ctype = node; in evaluate_dereference()
1860 static struct symbol *evaluate_postop(struct expression *expr) in evaluate_postop() argument
1862 struct expression *op = expr->unop; in evaluate_postop()
1868 expression_error(expr, "need scalar for ++/--"); in evaluate_postop()
1871 if (!lvalue_expression(expr->unop)) { in evaluate_postop()
1872 expression_error(expr, "need lvalue expression for ++/--"); in evaluate_postop()
1876 if ((class & TYPE_RESTRICT) && restricted_unop(expr->op, &ctype)) in evaluate_postop()
1877 unrestrict(expr, class, &ctype); in evaluate_postop()
1889 expr->op_value = multiply; in evaluate_postop()
1890 expr->ctype = ctype; in evaluate_postop()
1894 expression_error(expr, "bad argument type for ++/--"); in evaluate_postop()
1898 static struct symbol *evaluate_sign(struct expression *expr) in evaluate_sign() argument
1900 struct symbol *ctype = expr->unop->ctype; in evaluate_sign()
1902 unsigned char flags = expr->unop->flags & ~CEF_CONST_MASK; in evaluate_sign()
1906 return bad_expr_type(expr); in evaluate_sign()
1912 expr->unop = cast_to(expr->unop, ctype); in evaluate_sign()
1913 } else if (expr->op != '~') { in evaluate_sign()
1916 return bad_expr_type(expr); in evaluate_sign()
1918 if (expr->op == '+') in evaluate_sign()
1919 *expr = *expr->unop; in evaluate_sign()
1920 expr->flags = flags; in evaluate_sign()
1921 expr->ctype = ctype; in evaluate_sign()
1924 if (restricted_unop(expr->op, &ctype)) in evaluate_sign()
1925 unrestrict(expr, class, &ctype); in evaluate_sign()
1929 static struct symbol *evaluate_preop(struct expression *expr) in evaluate_preop() argument
1931 struct symbol *ctype = expr->unop->ctype; in evaluate_preop()
1933 switch (expr->op) { in evaluate_preop()
1935 *expr = *expr->unop; in evaluate_preop()
1941 return evaluate_sign(expr); in evaluate_preop()
1944 return evaluate_dereference(expr); in evaluate_preop()
1947 return evaluate_addressof(expr); in evaluate_preop()
1955 return evaluate_postop(expr); in evaluate_preop()
1958 ctype = degenerate(expr->unop); in evaluate_preop()
1959 expr->flags = expr->unop->flags & ~CEF_CONST_MASK; in evaluate_preop()
1964 expr->flags &= ~CEF_ADDR; in evaluate_preop()
1967 warning(expr->pos, "testing a 'safe expression'"); in evaluate_preop()
1969 struct expression *arg = expr->unop; in evaluate_preop()
1970 expr->type = EXPR_COMPARE; in evaluate_preop()
1971 expr->op = SPECIAL_EQUAL; in evaluate_preop()
1972 expr->left = arg; in evaluate_preop()
1973 expr->right = alloc_expression(expr->pos, EXPR_FVALUE); in evaluate_preop()
1974 expr->right->ctype = ctype; in evaluate_preop()
1975 expr->right->fvalue = 0; in evaluate_preop()
1977 warning(expr->pos, "%s degrades to integer", in evaluate_preop()
1987 expr->ctype = ctype; in evaluate_preop()
2025 static struct expression *evaluate_offset(struct expression *expr, unsigned long offset) in evaluate_offset() argument
2038 add = alloc_expression(expr->pos, EXPR_BINOP); in evaluate_offset()
2040 add->left = expr; in evaluate_offset()
2041 add->right = alloc_expression(expr->pos, EXPR_VALUE); in evaluate_offset()
2054 add->flags = expr->flags; in evaluate_offset()
2060 static struct symbol *evaluate_member_dereference(struct expression *expr) in evaluate_member_dereference() argument
2064 struct expression *deref = expr->deref, *add; in evaluate_member_dereference()
2065 struct ident *ident = expr->member; in evaluate_member_dereference()
2072 expression_error(expr, "bad member name"); in evaluate_member_dereference()
2086 expression_error(expr, "expected structure or union"); in evaluate_member_dereference()
2100 expression_error(expr, "no member '%s' in %s %.*s", in evaluate_member_dereference()
2103 expression_error(expr, "using member '%s' in " in evaluate_member_dereference()
2118 expr->base = deref; in evaluate_member_dereference()
2119 expr->r_bitpos = 0; in evaluate_member_dereference()
2121 expr->base = deref->base; in evaluate_member_dereference()
2122 expr->r_bitpos = deref->r_bitpos; in evaluate_member_dereference()
2124 expr->r_bitpos += bytes_to_bits(offset); in evaluate_member_dereference()
2125 expr->type = EXPR_SLICE; in evaluate_member_dereference()
2126 expr->r_nrbits = member->bit_size; in evaluate_member_dereference()
2127 expr->r_bitpos += member->bit_offset; in evaluate_member_dereference()
2128 expr->ctype = member; in evaluate_member_dereference()
2133 expr->deref = deref; in evaluate_member_dereference()
2136 expr->type = EXPR_PREOP; in evaluate_member_dereference()
2137 expr->op = '*'; in evaluate_member_dereference()
2138 expr->unop = add; in evaluate_member_dereference()
2140 expr->ctype = member; in evaluate_member_dereference()
2144 static int is_promoted(struct expression *expr) in is_promoted() argument
2147 switch (expr->type) { in is_promoted()
2153 expr = expr->right; in is_promoted()
2156 switch (expr->op) { in is_promoted()
2158 expr = expr->unop; in is_promoted()
2176 static struct symbol *evaluate_type_information(struct expression *expr) in evaluate_type_information() argument
2178 struct symbol *sym = expr->cast_type; in evaluate_type_information()
2180 sym = evaluate_expression(expr->cast_expression); in evaluate_type_information()
2188 if (sym->bit_size < bits_in_int && is_promoted(expr)) in evaluate_type_information()
2196 expression_error(expr, "trying to examine bitfield type"); in evaluate_type_information()
2202 static struct symbol *evaluate_sizeof(struct expression *expr) in evaluate_sizeof() argument
2207 type = evaluate_type_information(expr); in evaluate_sizeof()
2215 warning(expr->pos, "expression using sizeof(void)"); in evaluate_sizeof()
2221 warning(expr->pos, "expression using sizeof _Bool"); in evaluate_sizeof()
2227 warning(expr->pos, "expression using sizeof on a function"); in evaluate_sizeof()
2241 base = alloc_expression(expr->pos, EXPR_SIZEOF); in evaluate_sizeof()
2246 base = alloc_expression(expr->pos, EXPR_VALUE); in evaluate_sizeof()
2250 size = alloc_expression(expr->pos, EXPR_CAST); in evaluate_sizeof()
2255 expr->left = size; in evaluate_sizeof()
2256 expr->right = base; in evaluate_sizeof()
2257 expr->type = EXPR_BINOP; in evaluate_sizeof()
2258 expr->op = '*'; in evaluate_sizeof()
2259 return expr->ctype = size_t_ctype; in evaluate_sizeof()
2264 expression_error(expr, "cannot size expression"); in evaluate_sizeof()
2266 expr->type = EXPR_VALUE; in evaluate_sizeof()
2267 expr->value = bits_to_bytes(size); in evaluate_sizeof()
2268 expr->taint = 0; in evaluate_sizeof()
2269 expr->ctype = size_t_ctype; in evaluate_sizeof()
2273 static struct symbol *evaluate_ptrsizeof(struct expression *expr) in evaluate_ptrsizeof() argument
2278 type = evaluate_type_information(expr); in evaluate_ptrsizeof()
2294 expression_error(expr, "expected pointer expression"); in evaluate_ptrsizeof()
2300 expr->type = EXPR_VALUE; in evaluate_ptrsizeof()
2301 expr->value = bits_to_bytes(size); in evaluate_ptrsizeof()
2302 expr->taint = 0; in evaluate_ptrsizeof()
2303 expr->ctype = size_t_ctype; in evaluate_ptrsizeof()
2307 static struct symbol *evaluate_alignof(struct expression *expr) in evaluate_alignof() argument
2311 type = evaluate_type_information(expr); in evaluate_alignof()
2315 expr->type = EXPR_VALUE; in evaluate_alignof()
2316 expr->value = type->ctype.alignment; in evaluate_alignof()
2317 expr->taint = 0; in evaluate_alignof()
2318 expr->ctype = size_t_ctype; in evaluate_alignof()
2324 struct expression *expr; in evaluate_arguments() local
2330 FOR_EACH_PTR (head, expr) { in evaluate_arguments()
2331 struct expression **p = THIS_ADDRESS(expr); in evaluate_arguments()
2333 ctype = evaluate_expression(expr); in evaluate_arguments()
2343 *p = cast_to(expr, integer_promotion(type)); in evaluate_arguments()
2347 *p = cast_to(expr, &double_ctype); in evaluate_arguments()
2349 if (expr->ctype == &null_ctype) in evaluate_arguments()
2350 *p = cast_to(expr, &ptr_ctype); in evaluate_arguments()
2352 degenerate(expr); in evaluate_arguments()
2358 compatible_argument_type(expr, target, p, where); in evaluate_arguments()
2363 } END_FOR_EACH_PTR(expr); in evaluate_arguments()
2592 static void handle_list_initializer(struct expression *expr, in handle_list_initializer() argument
2598 FOR_EACH_PTR(expr->expr_list, e) { in handle_list_initializer()
2674 expr->ctype = ctype; in handle_list_initializer()
2847 static struct symbol *cast_to_bool(struct expression *expr) in cast_to_bool() argument
2849 struct expression *old = expr->cast_expression; in cast_to_bool()
2858 zero = alloc_const_expression(expr->pos, 0); in cast_to_bool()
2859 expr->op = SPECIAL_NOTEQUAL; in cast_to_bool()
2860 ctype = usual_conversions(expr->op, old, zero, in cast_to_bool()
2862 expr->type = EXPR_COMPARE; in cast_to_bool()
2863 expr->left = cast_to(old, ctype); in cast_to_bool()
2864 expr->right = cast_to(zero, ctype); in cast_to_bool()
2866 return expr->ctype; in cast_to_bool()
2869 static int cast_flags(struct expression *expr, struct expression *old) in cast_flags() argument
2875 class = classify_type(expr->ctype, &t); in cast_flags()
2922 static struct symbol *evaluate_cast(struct expression *expr) in evaluate_cast() argument
2924 struct expression *source = expr->cast_expression; in evaluate_cast()
2944 struct symbol *sym = expr->cast_type; in evaluate_cast()
2945 struct expression *addr = alloc_expression(expr->pos, EXPR_SYMBOL); in evaluate_cast()
2955 expr->type = EXPR_PREOP; in evaluate_cast()
2956 expr->op = '*'; in evaluate_cast()
2957 expr->unop = addr; in evaluate_cast()
2958 expr->ctype = sym; in evaluate_cast()
2963 ctype = examine_symbol_type(expr->cast_type); in evaluate_cast()
2964 expr->ctype = ctype; in evaluate_cast()
2965 expr->cast_type = ctype; in evaluate_cast()
2972 expr->flags = cast_flags(expr, source); in evaluate_cast()
2984 expression_error(expr, "cast from unknown type"); in evaluate_cast()
2989 if (expr->type == EXPR_FORCE_CAST) in evaluate_cast()
2993 warning(expr->pos, "cast to non-scalar"); in evaluate_cast()
2996 warning(expr->pos, "cast from non-scalar"); in evaluate_cast()
3004 warning(expr->pos, "cast to %s", in evaluate_cast()
3009 warning(expr->pos, "%s degrades to integer", in evaluate_cast()
3012 warning(expr->pos, "cast from %s", in evaluate_cast()
3033 warning(expr->pos, "cast removes address space '%s' of expression", show_as(sas)); in evaluate_cast()
3035 warning(expr->pos, "cast between address spaces (%s -> %s)", show_as(sas), show_as(tas)); in evaluate_cast()
3038 warning(expr->pos, in evaluate_cast()
3046 expr->type = EXPR_VALUE; in evaluate_cast()
3047 expr->ctype = &null_ctype; in evaluate_cast()
3048 expr->value = 0; in evaluate_cast()
3049 return expr->ctype; in evaluate_cast()
3055 cast_to_bool(expr); in evaluate_cast()
3068 warning(expr->pos, "cast to %s", show_typename(ctype)); in evaluate_cast()
3072 warning(expr->pos, "cast from %s", show_typename(source->ctype)); in evaluate_cast()
3085 static int evaluate_symbol_call(struct expression *expr) in evaluate_symbol_call() argument
3087 struct expression *fn = expr->fn; in evaluate_symbol_call()
3094 return ctype->op->evaluate(expr); in evaluate_symbol_call()
3105 ret = inline_function(expr, ctype); in evaluate_symbol_call()
3115 static struct symbol *evaluate_call(struct expression *expr) in evaluate_call() argument
3119 struct expression *fn = expr->fn; in evaluate_call()
3120 struct expression_list *arglist = expr->args; in evaluate_call()
3132 expression_error(expr, "not a function %s", in evaluate_call()
3144 if (!sym->op->args(expr)) in evaluate_call()
3149 args = expression_list_size(expr->args); in evaluate_call()
3152 expression_error(expr, in evaluate_call()
3158 expression_error(expr, in evaluate_call()
3162 expr->ctype = ctype->ctype.base_type; in evaluate_call()
3164 if (evaluate_symbol_call(expr)) in evaluate_call()
3165 return expr->ctype; in evaluate_call()
3167 return expr->ctype; in evaluate_call()
3170 static struct symbol *evaluate_offsetof(struct expression *expr) in evaluate_offsetof() argument
3172 struct expression *e = expr->down; in evaluate_offsetof()
3173 struct symbol *ctype = expr->in; in evaluate_offsetof()
3176 if (expr->op == '.') { in evaluate_offsetof()
3180 expression_error(expr, "expected structure or union"); in evaluate_offsetof()
3186 expression_error(expr, "expected structure or union"); in evaluate_offsetof()
3190 field = find_identifier(expr->ident, ctype->symbol_list, &offset); in evaluate_offsetof()
3192 expression_error(expr, "unknown member"); in evaluate_offsetof()
3196 expr->type = EXPR_VALUE; in evaluate_offsetof()
3197 expr->flags = CEF_SET_ICE; in evaluate_offsetof()
3198 expr->value = offset; in evaluate_offsetof()
3199 expr->taint = 0; in evaluate_offsetof()
3200 expr->ctype = size_t_ctype; in evaluate_offsetof()
3203 expression_error(expr, "expected structure or union"); in evaluate_offsetof()
3209 expression_error(expr, "expected array"); in evaluate_offsetof()
3213 if (!expr->index) { in evaluate_offsetof()
3214 expr->type = EXPR_VALUE; in evaluate_offsetof()
3215 expr->flags = CEF_SET_ICE; in evaluate_offsetof()
3216 expr->value = 0; in evaluate_offsetof()
3217 expr->taint = 0; in evaluate_offsetof()
3218 expr->ctype = size_t_ctype; in evaluate_offsetof()
3220 struct expression *idx = expr->index, *m; in evaluate_offsetof()
3226 expression_error(expr, "non-integer index"); in evaluate_offsetof()
3233 m = alloc_const_expression(expr->pos, in evaluate_offsetof()
3237 expr->type = EXPR_BINOP; in evaluate_offsetof()
3238 expr->left = idx; in evaluate_offsetof()
3239 expr->right = m; in evaluate_offsetof()
3240 expr->op = '*'; in evaluate_offsetof()
3241 expr->ctype = size_t_ctype; in evaluate_offsetof()
3242 expr->flags = m->flags & idx->flags & ~CEF_CONST_MASK; in evaluate_offsetof()
3247 *copy = *expr; in evaluate_offsetof()
3252 expr->type = EXPR_BINOP; in evaluate_offsetof()
3253 expr->flags = e->flags & copy->flags & ~CEF_CONST_MASK; in evaluate_offsetof()
3254 expr->op = '+'; in evaluate_offsetof()
3255 expr->ctype = size_t_ctype; in evaluate_offsetof()
3256 expr->left = copy; in evaluate_offsetof()
3257 expr->right = e; in evaluate_offsetof()
3262 struct symbol *evaluate_expression(struct expression *expr) in evaluate_expression() argument
3264 if (!expr) in evaluate_expression()
3266 if (expr->ctype) in evaluate_expression()
3267 return expr->ctype; in evaluate_expression()
3269 switch (expr->type) { in evaluate_expression()
3272 expression_error(expr, "value expression without a type"); in evaluate_expression()
3275 return evaluate_string(expr); in evaluate_expression()
3277 return evaluate_symbol_expression(expr); in evaluate_expression()
3279 evaluate_expression(expr->left); in evaluate_expression()
3280 evaluate_expression(expr->right); in evaluate_expression()
3281 if (!valid_subexpr_type(expr)) in evaluate_expression()
3283 return evaluate_binop(expr); in evaluate_expression()
3285 return evaluate_logical(expr); in evaluate_expression()
3287 evaluate_expression(expr->left); in evaluate_expression()
3288 if (!evaluate_expression(expr->right)) in evaluate_expression()
3290 return evaluate_comma(expr); in evaluate_expression()
3292 evaluate_expression(expr->left); in evaluate_expression()
3293 evaluate_expression(expr->right); in evaluate_expression()
3294 if (!valid_subexpr_type(expr)) in evaluate_expression()
3296 return evaluate_compare(expr); in evaluate_expression()
3298 evaluate_expression(expr->left); in evaluate_expression()
3299 evaluate_expression(expr->right); in evaluate_expression()
3300 if (!valid_subexpr_type(expr)) in evaluate_expression()
3302 return evaluate_assignment(expr); in evaluate_expression()
3304 if (!evaluate_expression(expr->unop)) in evaluate_expression()
3306 return evaluate_preop(expr); in evaluate_expression()
3308 if (!evaluate_expression(expr->unop)) in evaluate_expression()
3310 return evaluate_postop(expr); in evaluate_expression()
3314 return evaluate_cast(expr); in evaluate_expression()
3316 return evaluate_sizeof(expr); in evaluate_expression()
3318 return evaluate_ptrsizeof(expr); in evaluate_expression()
3320 return evaluate_alignof(expr); in evaluate_expression()
3322 return evaluate_member_dereference(expr); in evaluate_expression()
3324 return evaluate_call(expr); in evaluate_expression()
3327 return evaluate_conditional_expression(expr); in evaluate_expression()
3329 expr->ctype = evaluate_statement(expr->statement); in evaluate_expression()
3330 return expr->ctype; in evaluate_expression()
3333 expr->ctype = &ptr_ctype; in evaluate_expression()
3338 evaluate_symbol(expr->symbol); in evaluate_expression()
3340 expr->ctype = &type_ctype; in evaluate_expression()
3344 return evaluate_offsetof(expr); in evaluate_expression()
3351 expression_error(expr, "internal front-end error: initializer in expression"); in evaluate_expression()
3354 expression_error(expr, "internal front-end error: SLICE re-evaluated"); in evaluate_expression()
3357 expression_error(expr, "internal front-end error: ASM_OPERAND evaluated"); in evaluate_expression()
3455 struct expression *expr = stmt->expression; in evaluate_return_expression() local
3458 evaluate_expression(expr); in evaluate_return_expression()
3461 if (expr && expr->ctype != &void_ctype) in evaluate_return_expression()
3462 expression_error(expr, "return expression in %s function", fntype?"void":"typeless"); in evaluate_return_expression()
3463 if (expr && Wreturn_void) in evaluate_return_expression()
3468 if (!expr) { in evaluate_return_expression()
3472 if (!expr->ctype) in evaluate_return_expression()
3474 compatible_assignment_types(expr, fntype, &stmt->expression, "return expression"); in evaluate_return_expression()
3498 static void verify_output_constraint(struct expression *expr, const char *constraint) in verify_output_constraint() argument
3505 expression_error(expr, "output constraint is not an assignment constraint (\"%s\")", constraint); in verify_output_constraint()
3509 static void verify_input_constraint(struct expression *expr, const char *constraint) in verify_input_constraint() argument
3514 expression_error(expr, "input constraint with assignment (\"%s\")", constraint); in verify_input_constraint()
3520 struct expression *expr; in evaluate_asm_statement() local
3524 expr = stmt->asm_string; in evaluate_asm_statement()
3525 if (!expr || expr->type != EXPR_STRING) { in evaluate_asm_statement()
3534 expr = op->constraint; in evaluate_asm_statement()
3535 if (!expr || expr->type != EXPR_STRING) { in evaluate_asm_statement()
3536 sparse_error(expr ? expr->pos : stmt->pos, "asm output constraint is not a string"); in evaluate_asm_statement()
3539 verify_output_constraint(expr, expr->string->data); in evaluate_asm_statement()
3542 expr = op->expr; in evaluate_asm_statement()
3543 if (!evaluate_expression(expr)) in evaluate_asm_statement()
3545 if (!lvalue_expression(expr)) in evaluate_asm_statement()
3546 warning(expr->pos, "asm output is not an lvalue"); in evaluate_asm_statement()
3547 evaluate_assign_to(expr, expr->ctype); in evaluate_asm_statement()
3554 expr = op->constraint; in evaluate_asm_statement()
3555 if (!expr || expr->type != EXPR_STRING) { in evaluate_asm_statement()
3556 sparse_error(expr ? expr->pos : stmt->pos, "asm input constraint is not a string"); in evaluate_asm_statement()
3559 verify_input_constraint(expr, expr->string->data); in evaluate_asm_statement()
3562 if (!evaluate_expression(op->expr)) in evaluate_asm_statement()
3566 FOR_EACH_PTR(stmt->asm_clobbers, expr) { in evaluate_asm_statement()
3567 if (!expr) { in evaluate_asm_statement()
3571 if (expr->type == EXPR_STRING) in evaluate_asm_statement()
3573 expression_error(expr, "asm clobber is not a string"); in evaluate_asm_statement()
3574 } END_FOR_EACH_PTR(expr); in evaluate_asm_statement()