mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-05-31 00:30:57 +00:00
[qfcc] Expose l-value checking
Needed for assignment chains.
This commit is contained in:
parent
7d5644e055
commit
eca976e5ae
2 changed files with 22 additions and 12 deletions
|
@ -710,6 +710,7 @@ expr_t *build_for_statement (expr_t *init, expr_t *test, expr_t *next,
|
||||||
expr_t *break_label, expr_t *continue_label);
|
expr_t *break_label, expr_t *continue_label);
|
||||||
expr_t *build_state_expr (expr_t *e);
|
expr_t *build_state_expr (expr_t *e);
|
||||||
expr_t *think_expr (struct symbol_s *think_sym);
|
expr_t *think_expr (struct symbol_s *think_sym);
|
||||||
|
int is_lvalue (const expr_t *expr) __attribute__((pure));
|
||||||
expr_t *assign_expr (expr_t *dst, expr_t *src);
|
expr_t *assign_expr (expr_t *dst, expr_t *src);
|
||||||
expr_t *cast_expr (struct type_s *t, expr_t *e);
|
expr_t *cast_expr (struct type_s *t, expr_t *e);
|
||||||
|
|
||||||
|
|
|
@ -81,8 +81,8 @@ check_assign_logic_precedence (expr_t *dst, expr_t *src)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static expr_t *
|
int
|
||||||
check_valid_lvalue (expr_t *expr)
|
is_lvalue (const expr_t *expr)
|
||||||
{
|
{
|
||||||
switch (expr->type) {
|
switch (expr->type) {
|
||||||
case ex_symbol:
|
case ex_symbol:
|
||||||
|
@ -90,7 +90,7 @@ check_valid_lvalue (expr_t *expr)
|
||||||
case sy_name:
|
case sy_name:
|
||||||
break;
|
break;
|
||||||
case sy_var:
|
case sy_var:
|
||||||
return 0;
|
return 1;
|
||||||
case sy_const:
|
case sy_const:
|
||||||
break;
|
break;
|
||||||
case sy_type:
|
case sy_type:
|
||||||
|
@ -106,21 +106,21 @@ check_valid_lvalue (expr_t *expr)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ex_temp:
|
case ex_temp:
|
||||||
return 0;
|
return 1;
|
||||||
case ex_expr:
|
case ex_expr:
|
||||||
if (expr->e.expr.op == '.') {
|
if (expr->e.expr.op == '.') {
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
if (expr->e.expr.op == 'A') {
|
if (expr->e.expr.op == 'A') {
|
||||||
return check_valid_lvalue (expr->e.expr.e1);
|
return is_lvalue (expr->e.expr.e1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ex_uexpr:
|
case ex_uexpr:
|
||||||
if (expr->e.expr.op == '.') {
|
if (expr->e.expr.op == '.') {
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
if (expr->e.expr.op == 'A') {
|
if (expr->e.expr.op == 'A') {
|
||||||
return check_valid_lvalue (expr->e.expr.e1);
|
return is_lvalue (expr->e.expr.e1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ex_memset:
|
case ex_memset:
|
||||||
|
@ -136,11 +136,20 @@ check_valid_lvalue (expr_t *expr)
|
||||||
case ex_error:
|
case ex_error:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (options.traditional) {
|
return 0;
|
||||||
warning (expr, "invalid lvalue in assignment");
|
}
|
||||||
return 0;
|
|
||||||
|
static expr_t *
|
||||||
|
check_valid_lvalue (expr_t *expr)
|
||||||
|
{
|
||||||
|
if (!is_lvalue (expr)) {
|
||||||
|
if (options.traditional) {
|
||||||
|
warning (expr, "invalid lvalue in assignment");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return error (expr, "invalid lvalue in assignment");
|
||||||
}
|
}
|
||||||
return error (expr, "invalid lvalue in assignment");
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static expr_t *
|
static expr_t *
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue