handle more conditional code and check for unitied vars in the test of if ()

etc
This commit is contained in:
Bill Currie 2001-10-19 05:16:24 +00:00
parent 16c334b6b9
commit 2ef8adea09
2 changed files with 37 additions and 28 deletions

View file

@ -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) {

View file

@ -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));