diff --git a/tools/qfcc/source/def.c b/tools/qfcc/source/def.c index 79d623aec..982e6b6bf 100644 --- a/tools/qfcc/source/def.c +++ b/tools/qfcc/source/def.c @@ -514,12 +514,14 @@ initialize_def (symbol_t *sym, type_t *type, expr_t *init, defspace_t *space, if ((is_array (type) || is_struct (type)) && init->type == ex_block && !init->e.block.result) { init_elements (sym->s.def, init); + sym->s.def->initialized = 1; } else { if (!type_assignable (type, get_type (init))) { error (init, "type mismatch in initializer"); return; } if (local_expr) { + sym->s.def->initialized = 1; init = assign_expr (new_symbol_expr (sym), init); // fold_constants takes care of int/float conversions append_expr (local_expr, fold_constants (init)); diff --git a/tools/qfcc/source/flow.c b/tools/qfcc/source/flow.c index 58a148ba0..fbc86358d 100644 --- a/tools/qfcc/source/flow.c +++ b/tools/qfcc/source/flow.c @@ -219,6 +219,21 @@ flowvar_is_param (flowvar_t *var) return 1; } +static int +flowvar_is_initialized (flowvar_t *var) +{ + symbol_t *sym; + def_t *def; + + if (var->op->op_type != op_symbol) + return 0; + sym = var->op->o.symbol; + if (sym->sy_type != sy_var) + return 0; + def = sym->s.def; + return def->initialized; +} + flowvar_t * flow_get_var (operand_t *op) { @@ -467,7 +482,8 @@ flow_uninitialized (flowgraph_t *graph) tmp = set_new (); for (i = 0; i < func->num_vars; i++) { flowvar_t *var = func->vars[i]; - if (flowvar_is_global (var) || flowvar_is_param (var)) + if (flowvar_is_global (var) || flowvar_is_param (var) + || flowvar_is_initialized (var)) set_add (tmp, i); } // first, calculate use and def for each block, and initialize the in and