From 2ef8adea09f51c8ad7822a6e32d4ef7b5a48686c Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Fri, 19 Oct 2001 05:16:24 +0000 Subject: [PATCH] handle more conditional code and check for unitied vars in the test of if () etc --- tools/qfcc/source/expr.c | 39 ++++++++++++++++++------------------ tools/qfcc/source/qc-parse.y | 26 ++++++++++++++++-------- 2 files changed, 37 insertions(+), 28 deletions(-) diff --git a/tools/qfcc/source/expr.c b/tools/qfcc/source/expr.c index 9b5a6b333..e7f5d789c 100644 --- a/tools/qfcc/source/expr.c +++ b/tools/qfcc/source/expr.c @@ -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) { diff --git a/tools/qfcc/source/qc-parse.y b/tools/qfcc/source/qc-parse.y index 0013049e1..7ab9d7eb3 100644 --- a/tools/qfcc/source/qc-parse.y +++ b/tools/qfcc/source/qc-parse.y @@ -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 ($8, else_ini); restore_local_inits (merged); free_local_inits (merged); free_local_inits (else_ini); - free_local_inits ($5); free_local_inits ($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));