class TypeComparer: private NodeVisitor
{
private:
- Node *first;
- Node *second;
- unsigned first_tag;
- bool r_result;
+ Node *first = 0;
+ Node *second = 0;
+ unsigned first_tag = 0;
+ bool r_result = false;
static unsigned next_tag;
public:
- TypeComparer();
-
bool apply(TypeDeclaration &t1, TypeDeclaration &t2) { compare(t1, t2); return r_result; }
private:
class LocationCounter: private NodeVisitor
{
private:
- unsigned r_count;
+ unsigned r_count = 0;
public:
- LocationCounter();
-
unsigned apply(VariableDeclaration &v) { v.visit(*this); return r_count; }
private:
Result(unsigned s, unsigned a): size(s), alignment(a), stride(s+a-1-(s+a-1)%a) { }
};
private:
- unsigned r_size;
- unsigned r_alignment;
- int r_offset;
+ unsigned r_size = 0;
+ unsigned r_alignment = 1;
+ int r_offset = -1;
public:
Result apply(VariableDeclaration &v) { v.visit(*this); return Result(r_size, r_alignment); }
private:
virtual void visit(VariableReference &);
- virtual void visit(InterfaceBlockReference &);
virtual void visit(FunctionCall &);
virtual void visit(VariableDeclaration &);
virtual void visit(FunctionDeclaration &);
};
+class AssignmentCollector: private TraversingVisitor
+{
+private:
+ bool assignment_target = false;
+ std::set<Node *> assigned_variables;
+
+public:
+ std::set<Node *> apply(Node &);
+
+private:
+ virtual void visit(VariableReference &);
+ virtual void visit(UnaryExpression &);
+ virtual void visit(BinaryExpression &);
+ virtual void visit(Assignment &);
+};
+
} // namespace SL
} // namespace GL
} // namespace Msp