mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-20 01:11:18 +00:00
handle more conditional code and check for unitied vars in the test of if ()
etc
This commit is contained in:
parent
16c334b6b9
commit
2ef8adea09
2 changed files with 37 additions and 28 deletions
|
@ -244,6 +244,19 @@ type_mismatch (expr_t *e1, expr_t *e2, int op)
|
|||
type_names[t1], get_op_string (op), type_names[t2]);
|
||||
}
|
||||
|
||||
void
|
||||
check_initialized (expr_t *e)
|
||||
{
|
||||
if (options.warn_uninitialized) {
|
||||
if (e->type == ex_def
|
||||
&& !(e->e.def->type->type == ev_func && !e->e.def->scope)
|
||||
&& !e->e.def->initialized) {
|
||||
warning (e, "%s may be used uninitialized", e->e.def->name);
|
||||
e->e.def->initialized = 1; // only warn once
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
inc_users (expr_t *e)
|
||||
{
|
||||
|
@ -743,6 +756,8 @@ test_expr (expr_t *e, int test)
|
|||
{
|
||||
expr_t *new = 0;
|
||||
|
||||
check_initialized (e);
|
||||
|
||||
if (!test)
|
||||
return unary_expr ('!', e);
|
||||
|
||||
|
@ -812,20 +827,9 @@ binary_expr (int op, expr_t *e1, expr_t *e2)
|
|||
type_t *type = 0;
|
||||
expr_t *e;
|
||||
|
||||
if (options.warn_uninitialized) {
|
||||
if (op != '='
|
||||
&& e1->type == ex_def
|
||||
&& !e1->e.def->initialized) {
|
||||
warning (e1, "%s may be used uninitialized", e1->e.def->name);
|
||||
e1->e.def->initialized = 1; // only warn once
|
||||
}
|
||||
if (e2->type == ex_def
|
||||
&& !e2->e.def->initialized
|
||||
&& !(e2->e.def->type->type == ev_func && !e2->e.def->scope)) {
|
||||
warning (e2, "%s may be used uninitialized", e2->e.def->name);
|
||||
e2->e.def->initialized = 1; // only warn once
|
||||
}
|
||||
}
|
||||
if (op != '=')
|
||||
check_initialized (e1);
|
||||
check_initialized (e2);
|
||||
|
||||
if (op == '=' && e1->type == ex_def)
|
||||
PR_DefInitialized (e1->e.def);
|
||||
|
@ -954,12 +958,7 @@ asx_expr (int op, expr_t *e1, expr_t *e2)
|
|||
expr_t *
|
||||
unary_expr (int op, expr_t *e)
|
||||
{
|
||||
if (options.warn_uninitialized
|
||||
&& e->type == ex_def
|
||||
&& !e->e.def->initialized) {
|
||||
warning (e, "%s may be used uninitialized", e->e.def->name);
|
||||
e->e.def->initialized = 1; // only warn once
|
||||
}
|
||||
check_initialized (e);
|
||||
switch (op) {
|
||||
case '-':
|
||||
switch (e->type) {
|
||||
|
|
|
@ -383,12 +383,15 @@ statement
|
|||
{
|
||||
$$ = return_expr (current_func, 0);
|
||||
}
|
||||
| WHILE '(' expr ')' statement
|
||||
| WHILE '(' expr ')' save_inits statement
|
||||
{
|
||||
expr_t *l1 = new_label_expr ();
|
||||
expr_t *l2 = new_label_expr ();
|
||||
expr_t *e;
|
||||
|
||||
restore_local_inits ($5);
|
||||
free_local_inits ($5);
|
||||
|
||||
$$ = new_block_expr ();
|
||||
|
||||
e = new_binary_expr ('n', test_expr ($3, 1), l2);
|
||||
|
@ -396,7 +399,7 @@ statement
|
|||
e->file = $3->file;
|
||||
append_expr ($$, e);
|
||||
append_expr ($$, l1);
|
||||
append_expr ($$, $5);
|
||||
append_expr ($$, $6);
|
||||
e = new_binary_expr ('i', test_expr ($3, 1), l1);
|
||||
e->line = $3->line;
|
||||
e->file = $3->file;
|
||||
|
@ -430,14 +433,15 @@ statement
|
|||
|
||||
$$ = new_block_expr ();
|
||||
|
||||
restore_local_inits ($5);
|
||||
free_local_inits ($5);
|
||||
|
||||
e = new_binary_expr ('n', test_expr ($3, 1), l1);
|
||||
e->line = $3->line;
|
||||
e->file = $3->file;
|
||||
append_expr ($$, e);
|
||||
append_expr ($$, $6);
|
||||
append_expr ($$, l1);
|
||||
restore_local_inits ($5);
|
||||
free_local_inits ($5);
|
||||
}
|
||||
| IF '(' expr ')' save_inits statement ELSE
|
||||
{
|
||||
|
@ -454,6 +458,11 @@ statement
|
|||
|
||||
$$ = new_block_expr ();
|
||||
|
||||
else_ini = save_local_inits (pr_scope);
|
||||
|
||||
restore_local_inits ($5);
|
||||
free_local_inits ($5);
|
||||
|
||||
e = new_binary_expr ('n', test_expr ($3, 1), l1);
|
||||
e->line = $3->line;
|
||||
e->file = $3->file;
|
||||
|
@ -467,26 +476,27 @@ statement
|
|||
append_expr ($$, l1);
|
||||
append_expr ($$, $9);
|
||||
append_expr ($$, l2);
|
||||
else_ini = save_local_inits (pr_scope);
|
||||
merged = merge_local_inits ($<def_list>8, else_ini);
|
||||
restore_local_inits (merged);
|
||||
free_local_inits (merged);
|
||||
free_local_inits (else_ini);
|
||||
free_local_inits ($5);
|
||||
free_local_inits ($<def_list>8);
|
||||
}
|
||||
| FOR '(' opt_expr ';' opt_expr ';' opt_expr ')' statement
|
||||
| FOR '(' opt_expr ';' opt_expr ';' opt_expr ')' save_inits statement
|
||||
{
|
||||
expr_t *l1 = new_label_expr ();
|
||||
expr_t *l2 = new_label_expr ();
|
||||
|
||||
restore_local_inits ($9);
|
||||
free_local_inits ($9);
|
||||
|
||||
$$ = new_block_expr ();
|
||||
|
||||
append_expr ($$, $3);
|
||||
if ($5)
|
||||
append_expr ($$, new_binary_expr ('n', test_expr ($5, 1), l2));
|
||||
append_expr ($$, l1);
|
||||
append_expr ($$, $9);
|
||||
append_expr ($$, $10);
|
||||
append_expr ($$, $7);
|
||||
if ($5)
|
||||
append_expr ($$, new_binary_expr ('i', test_expr ($5, 1), l1));
|
||||
|
|
Loading…
Reference in a new issue