Index: src/AST/Type.hpp
===================================================================
--- src/AST/Type.hpp	(revision e0115286f6b607d6d384675b446d21bc73745a4b)
+++ src/AST/Type.hpp	(revision 6d51bd7cd93d2958aac506ca3e6ef1f91b13168b)
@@ -21,5 +21,6 @@
 
 class Type : public Node {
-
+public:
+virtual const Type * accept( Visitor & v) const = 0;
 };
 
@@ -31,46 +32,46 @@
 /// The problem is that ast::ptr< ... > uses increment/decrement which won't work well with
 /// forward declarations
-inline void increment( const class Type * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class Type * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class VoidType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class VoidType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class BasicType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class BasicType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class PointerType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class PointerType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class ArrayType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class ArrayType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class ReferenceType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class ReferenceType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class QualifiedType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class QualifiedType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class FunctionType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class FunctionType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class ReferenceToType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class ReferenceToType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class StructInstType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class StructInstType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class UnionInstType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class UnionInstType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class EnumInstType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class EnumInstType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class TraitInstType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class TraitInstType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class TypeInstType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class TypeInstType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class TupleType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class TupleType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class TypeofType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class TypeofType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class AttrType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class AttrType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class VarArgsType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class VarArgsType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class ZeroType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class ZeroType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class OneType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class OneType * node, Node::ref_type ref ) { node->decrement( ref ); }
-inline void increment( const class GlobalScopeType * node, Node::ref_type ref ) { node->increment( ref ); }
-inline void decrement( const class GlobalScopeType * node, Node::ref_type ref ) { node->decrement( ref ); }
+inline void increment( const class Type * /*node*/, Node::ref_type /*ref*/ ) { /*node->increment( ref );*/ }
+inline void decrement( const class Type * /*node*/, Node::ref_type /*ref*/ ) { /*node->decrement( ref );*/ }
+// inline void increment( const class VoidType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class VoidType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class BasicType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class BasicType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class PointerType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class PointerType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class ArrayType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class ArrayType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class ReferenceType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class ReferenceType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class QualifiedType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class QualifiedType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class FunctionType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class FunctionType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class ReferenceToType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class ReferenceToType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class StructInstType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class StructInstType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class UnionInstType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class UnionInstType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class EnumInstType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class EnumInstType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class TraitInstType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class TraitInstType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class TypeInstType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class TypeInstType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class TupleType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class TupleType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class TypeofType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class TypeofType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class AttrType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class AttrType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class VarArgsType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class VarArgsType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class ZeroType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class ZeroType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class OneType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class OneType * node, Node::ref_type ref ) { node->decrement( ref ); }
+// inline void increment( const class GlobalScopeType * node, Node::ref_type ref ) { node->increment( ref ); }
+// inline void decrement( const class GlobalScopeType * node, Node::ref_type ref ) { node->decrement( ref ); }
 
 }
