- VariableInfo &var_info = variables.back()[&var];
- /* An assignment which completely replaces the value of the variable causes
- any previous unreferenced assignments to be unused. */
- if(!chained)
- clear_assignments(var_info, true);
+ BlockVariableMap &block_vars = variables.back();
+ for(BlockVariableMap::iterator i=block_vars.lower_bound(target); (i!=block_vars.end() && i->first.declaration==target.declaration); ++i)
+ {
+ bool subfield = (i->first.chain_len>=target.chain_len);
+ for(unsigned j=0; (subfield && j<target.chain_len); ++j)
+ subfield = (i->first.chain[j]==target.chain[j]);
+ if(!subfield)
+ break;
+
+ /* An assignment to the target causes any previous unreferenced
+ assignments to the same target or its subfields to be unused. */
+ if(!chained)
+ clear_assignments(i->second, true);
+ }
+
+ VariableInfo &var_info = variables.back()[target];