Lines Matching refs:expr
62 *do_initializer(struct symbol *type, struct expression *expr),
63 *do_expression(usage_t mode, struct expression *expr),
145 static inline struct symbol *expr_symbol(struct expression *expr)
147 struct symbol *sym = expr->symbol;
150 sym = lookup_symbol(expr->symbol_name, NS_SYMBOL);
153 sym = alloc_symbol(expr->pos, SYM_BAD);
154 bind_symbol(sym, expr->symbol_name, NS_SYMBOL);
155 sym->kind = expr->op ?: 'v'; /* see EXPR_CALL */
165 static struct symbol *report_symbol(usage_t mode, struct expression *expr)
167 struct symbol *sym = expr_symbol(expr);
171 return report_member(mode, &expr->pos, ret, expr->symbol);
173 reporter->r_symbol(fix_mode(ret, mode), &expr->pos, sym);
317 static struct expression *peek_preop(struct expression *expr, int op)
320 if (expr->type != EXPR_PREOP)
322 if (expr->op == op)
323 return expr->unop;
324 if (expr->op == '(')
325 expr = expr->unop;
328 } while (expr);
333 static struct symbol *do_expression(usage_t mode, struct expression *expr)
338 if (expr) switch (expr->type) {
340 warning(expr->pos, "bad expr->type: %d", expr->type);
353 ret = do_statement(mode, expr->statement);
356 do_expression(U_VOID, expr->cast_expression);
359 do_expression(U_VOID, expr->left);
360 ret = do_expression(mode, expr->right);
363 ret = base_type(expr->cast_type);
364 do_initializer(ret, expr->cast_expression);
368 do_expression(mode, expr->left);
369 do_expression(mode, expr->right);
372 do_expression(expr->cond_true
374 expr->conditional);
375 ret = do_expression(mode, expr->cond_true);
376 ret = do_expression(mode, expr->cond_false);
379 if (expr->fn->type == EXPR_SYMBOL)
380 expr->fn->op = 'f'; /* for expr_symbol() */
381 ret = do_expression(U_R_PTR, expr->fn);
384 DO_2_LIST(ret->arguments, expr->args, arg, val,
391 if (expr->op == '=')
393 ret = do_expression(mode, expr->left);
394 report_implicit(mode, &expr->pos, ret);
395 mode = expr->op == '='
397 do_expression(mode, expr->right);
402 l = do_expression(mode, expr->left);
403 r = do_expression(mode, expr->right);
404 if (expr->op != '+' && expr->op != '-')
413 struct expression *unop = expr->unop;
415 switch (expr->op) {
425 if ((expr = peek_preop(unop, '*')))
432 if ((expr = peek_preop(unop, '&')))
454 p_type = do_expression(p_mode, expr->deref);
456 ret = report_member(mode, &expr->pos, p_type,
457 lookup_member(p_type, expr->member, NULL));
461 struct symbol *in = base_type(expr->in);
464 if (expr->op == '.') {
465 in = report_member(U_VOID, &expr->pos, in,
466 lookup_member(in, expr->ident, NULL));
468 do_expression(U_R_VAL, expr->index);
471 } while ((expr = expr->down));
477 do_expression(U_VOID, expr->control);
479 for (map = expr->map; map; map = map->next)
480 ret = do_expression(mode, map->expr);
481 if (expr->def)
482 ret = do_expression(mode, expr->def);
486 ret = report_symbol(mode, expr);
494 DO_LIST(xputs, op, do_expression(U_W_AOF | mode, op->expr));
566 static struct symbol *do_initializer(struct symbol *type, struct expression *expr)
572 if (expr) switch (expr->type) {
574 do_expression(u_lval(type), expr);
577 do_initializer(base_type(type), expr->idx_expression);
581 FOR_EACH_PTR(expr->expr_list, m_expr) {