+ virtual void visit(Literal &);
+ virtual void visit(UnaryExpression &);
+ virtual void visit(BinaryExpression &);
+ virtual void visit(TernaryExpression &);
+ virtual void visit(FunctionCall &);
+ virtual void visit(BasicTypeDeclaration &);
+ virtual void visit(ImageTypeDeclaration &);
+ virtual void visit(StructDeclaration &);
+ virtual void visit(VariableDeclaration &);
+ virtual void visit(InterfaceBlock &);
+ virtual void visit(FunctionDeclaration &);
+};
+
+/** Removes variable declarations with no references to them. Assignment
+statements where the result is not used are also removed. */
+class UnusedVariableRemover: private TraversingVisitor
+{
+private:
+ struct AssignmentInfo
+ {
+ Node *node;
+ Assignment::Target target;
+ std::vector<Node *> used_by;
+
+ AssignmentInfo(): node(0) { }
+ };
+