+ if(assignment && assignment->target_declaration)
+ record_assignment(*assignment->target_declaration, expr, assignment->self_referencing);
+}
+
+void ProgramCompiler::UnusedVariableLocator::visit(StructDeclaration &strct)
+{
+ SetForScope<Node *> set(aggregate, &strct);
+ unused_nodes.insert(&strct);
+ TraversingVisitor::visit(strct);
+}
+
+void ProgramCompiler::UnusedVariableLocator::visit(VariableDeclaration &var)
+{
+ if(aggregate)
+ aggregates[&var] = aggregate;
+ else
+ {
+ unused_nodes.insert(&var);
+ if(var.init_expression)
+ record_assignment(var, *var.init_expression, false);
+ }
+ unused_nodes.erase(var.type_declaration);
+ TraversingVisitor::visit(var);
+}
+
+void ProgramCompiler::UnusedVariableLocator::visit(InterfaceBlock &iface)
+{
+ SetForScope<Node *> set(aggregate, &iface);
+ unused_nodes.insert(&iface);
+ TraversingVisitor::visit(iface);
+}
+
+void ProgramCompiler::UnusedVariableLocator::visit(FunctionDeclaration &func)
+{
+ assignments.push_back(BlockAssignmentMap());
+
+ for(vector<NodePtr<VariableDeclaration> >::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i)
+ (*i)->visit(*this);
+ func.body.visit(*this);
+
+ BlockAssignmentMap &block_assignments = assignments.back();
+ for(map<string, VariableDeclaration *>::iterator i=func.body.variables.begin(); i!=func.body.variables.end(); ++i)
+ block_assignments.erase(i->second);
+ for(BlockAssignmentMap::iterator i=block_assignments.begin(); i!=block_assignments.end(); ++i)