Index: src/CodeTools/TrackLoc.cc
===================================================================
--- src/CodeTools/TrackLoc.cc	(revision eb0951d0cd306bfecdc590fa7b0b243eb3ed1853)
+++ src/CodeTools/TrackLoc.cc	(revision 13932f1466902c0dc5d4b542261856dbf70e34fa)
@@ -16,10 +16,14 @@
 #include "TrackLoc.h"
 
+#include <cstdlib>
+
 #include <iostream>
 #include <sstream>
+#include <stack>
 #include <string>
-#include <cstdlib>
+#include <typeindex>
 
 #include "Common/utility.h"
+#include "Common/PassVisitor.h"
 #include "Common/VectorMap.h"
 #include "GenPoly/GenPoly.h"
@@ -27,157 +31,66 @@
 #include "SynTree/Declaration.h"
 #include "SynTree/Initializer.h"
-#include "SynTree/Visitor.h"
 
 namespace CodeTools {
 
-    std::ostream & operator<<(std::ostream & out, CodeLocation const & loc) {
-        return out << loc.filename << '[' << loc.linenumber << ']';
-    }
+	std::ostream & operator<<(std::ostream & out, CodeLocation const & loc) {
+		return out << loc.filename << '[' << loc.linenumber << ']';
+	}
 
-	class LocationPrinter : public Visitor {
-		unsigned int printLevel;
-		unsigned int currentLevel;
+	class LocationPrinter {
+		size_t printLevel;
 
-		CodeLocation *parent;
 		CodeLocation *lastNode;
 
-    public:
-        LocationPrinter(unsigned int printLevel) :
-            Visitor(), printLevel(printLevel), currentLevel(0),
-			parent(nullptr), lastNode(nullptr)
-        {}
+		std::stack< CodeLocation * > parents;
+	public:
+		LocationPrinter(size_t printLevel) : 
+			printLevel(printLevel), lastNode(nullptr)
+		{}
 
-        void print(char const * name, BaseSyntaxNode *node) {
-            for (unsigned int i = 0 ; i < currentLevel ; ++i) {
+		void print( const std::string& name, BaseSyntaxNode *node) {
+			for (size_t i = 0 ; i < parents.size() ; ++i) {
 				std::cout << "    ";
 			}
-            if (2 <= printLevel) {
+			if (2 <= printLevel) {
 				std::cout << name << '@';
 			}
 			std::cout << node->location << std::endl;
-        }
+		}
 
-		void atNode(char const * name, BaseSyntaxNode *node) {
-			if (-1 == node->location.linenumber) {
-				if (nullptr != parent) {
-					node->location.linenumber = parent->linenumber;
-					node->location.filename = parent->filename;
-				} else if (nullptr != lastNode) {
-					node->location.linenumber = lastNode->linenumber;
-					node->location.filename = lastNode->filename;
-				} else {
-					std::cerr << "Top level node has no CodeLocation " <<
-								 name << std::endl;
+		void atNode( BaseSyntaxNode *node ) {
+			std::string name = std::type_index(typeid(*node)).name();
+			if ( node->location.isUnset() ) {
+				if ( !parents.empty() ) {
+					node->location = *parents.top();
+				} 
+				else if (nullptr != lastNode) {
+					node->location = *lastNode;
+				} 
+				else {
+					std::cerr << "Top level node has no CodeLocation " << name << std::endl;
 					exit(EXIT_FAILURE);
 				}
 			}
+
 			if (0 < printLevel) {
-				print(name, node);
+				print( name, node );
 			}
 			lastNode = &node->location;
 		}
 
-#define VISIT_FUNCTION(SyntaxNodeType)				\
-		virtual void visit(SyntaxNodeType *node) {	\
-			atNode(#SyntaxNodeType, node);			\
-			++currentLevel;							\
-			CodeLocation * myParent = parent;		\
-			parent = &node->location;				\
-			Visitor::visit(node);					\
-			parent = myParent;						\
-			--currentLevel;							\
+		void previsit(BaseSyntaxNode * node) {
+			atNode(node);
+			parents.push( &node->location );
 		}
 
-		VISIT_FUNCTION(ObjectDecl)
-		VISIT_FUNCTION(FunctionDecl)
-		VISIT_FUNCTION(StructDecl)
-		VISIT_FUNCTION(UnionDecl)
-		VISIT_FUNCTION(EnumDecl)
-		VISIT_FUNCTION(TraitDecl)
-		VISIT_FUNCTION(TypeDecl)
-		VISIT_FUNCTION(TypedefDecl)
-		VISIT_FUNCTION(AsmDecl)
-
-		VISIT_FUNCTION(CompoundStmt)
-		VISIT_FUNCTION(ExprStmt)
-		VISIT_FUNCTION(AsmStmt)
-		VISIT_FUNCTION(IfStmt)
-		VISIT_FUNCTION(WhileStmt)
-		VISIT_FUNCTION(ForStmt)
-		VISIT_FUNCTION(SwitchStmt)
-		VISIT_FUNCTION(CaseStmt)
-		VISIT_FUNCTION(BranchStmt)
-		VISIT_FUNCTION(ReturnStmt)
-		VISIT_FUNCTION(TryStmt)
-		VISIT_FUNCTION(CatchStmt)
-		VISIT_FUNCTION(FinallyStmt)
-		VISIT_FUNCTION(NullStmt)
-		VISIT_FUNCTION(DeclStmt)
-		VISIT_FUNCTION(ImplicitCtorDtorStmt)
-
-		VISIT_FUNCTION(ApplicationExpr)
-		VISIT_FUNCTION(UntypedExpr)
-		VISIT_FUNCTION(NameExpr)
-		VISIT_FUNCTION(CastExpr)
-		VISIT_FUNCTION(AddressExpr)
-		VISIT_FUNCTION(LabelAddressExpr)
-		VISIT_FUNCTION(UntypedMemberExpr)
-		VISIT_FUNCTION(MemberExpr)
-		VISIT_FUNCTION(VariableExpr)
-		VISIT_FUNCTION(ConstantExpr)
-		VISIT_FUNCTION(SizeofExpr)
-		VISIT_FUNCTION(AlignofExpr)
-		VISIT_FUNCTION(UntypedOffsetofExpr)
-		VISIT_FUNCTION(OffsetofExpr)
-		VISIT_FUNCTION(OffsetPackExpr)
-		VISIT_FUNCTION(AttrExpr)
-		VISIT_FUNCTION(LogicalExpr)
-		VISIT_FUNCTION(ConditionalExpr)
-		VISIT_FUNCTION(CommaExpr)
-		VISIT_FUNCTION(TypeExpr)
-		VISIT_FUNCTION(AsmExpr)
-		VISIT_FUNCTION(ImplicitCopyCtorExpr)
-		VISIT_FUNCTION(ConstructorExpr)
-		VISIT_FUNCTION(CompoundLiteralExpr)
-		VISIT_FUNCTION(UntypedValofExpr)
-		VISIT_FUNCTION(RangeExpr)
-		VISIT_FUNCTION(UntypedTupleExpr)
-		VISIT_FUNCTION(TupleExpr)
-		VISIT_FUNCTION(TupleIndexExpr)
-		VISIT_FUNCTION(MemberTupleExpr)
-		VISIT_FUNCTION(TupleAssignExpr)
-		VISIT_FUNCTION(StmtExpr)
-		VISIT_FUNCTION(UniqueExpr)
-
-		VISIT_FUNCTION(VoidType)
-		VISIT_FUNCTION(BasicType)
-		VISIT_FUNCTION(PointerType)
-		VISIT_FUNCTION(ArrayType)
-		VISIT_FUNCTION(FunctionType)
-		VISIT_FUNCTION(StructInstType)
-		VISIT_FUNCTION(UnionInstType)
-		VISIT_FUNCTION(EnumInstType)
-		VISIT_FUNCTION(TraitInstType)
-		VISIT_FUNCTION(TypeInstType)
-		VISIT_FUNCTION(TupleType)
-		VISIT_FUNCTION(TypeofType)
-		VISIT_FUNCTION(AttrType)
-		VISIT_FUNCTION(VarArgsType)
-		VISIT_FUNCTION(ZeroType)
-		VISIT_FUNCTION(OneType)
-
-		VISIT_FUNCTION(SingleInit)
-		VISIT_FUNCTION(ListInit)
-		VISIT_FUNCTION(ConstructorInit)
-
-		//VISIT_FUNCTION(Subrange)
-
-		//VISIT_FUNCTION(Constant)
+		void postvisit(BaseSyntaxNode * node) {
+			parents.pop();
+		}
 
 	}; // LocationPrinter
 
-	void fillLocations( std::list< Declaration * > & translationUnit,
-			unsigned int printLevel) {
-		LocationPrinter printer(printLevel);
+	void fillLocations( std::list< Declaration * > & translationUnit, size_t printLevel) {
+		PassVisitor<LocationPrinter> printer(printLevel);
 		acceptAll( translationUnit, printer );
 	}
Index: src/CodeTools/TrackLoc.h
===================================================================
--- src/CodeTools/TrackLoc.h	(revision eb0951d0cd306bfecdc590fa7b0b243eb3ed1853)
+++ src/CodeTools/TrackLoc.h	(revision 13932f1466902c0dc5d4b542261856dbf70e34fa)
@@ -24,6 +24,5 @@
 	// printLevel: how much printing while filling in the node locations.
 	// 0 - No Printing, 1 - Print Location, 2 - Print Node Type and Location
-	void fillLocations( std::list< Declaration * > &translationUnit,
-			unsigned int printLevel = 0 );
+	void fillLocations( std::list< Declaration * > &translationUnit, size_t printLevel = 0 );
 
 }  // namespace CodeTools
Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 13932f1466902c0dc5d4b542261856dbf70e34fa)
+++ src/Common/PassVisitor.h	(revision 13932f1466902c0dc5d4b542261856dbf70e34fa)
@@ -0,0 +1,153 @@
+#pragma once
+
+#include "SynTree/Visitor.h"
+
+//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//Deep magic (a.k.a template meta programming) to make the templated visitor work
+//Basically the goal is to make 2 previsit_impl
+// 1 - 
+//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+template<typename pass_type, typename node_type>
+static inline auto previsit_impl( pass_type& pass, node_type * node, __attribute__((unused)) int unused ) ->decltype( pass.previsit( node ), void() ) {
+	pass.previsit( node );
+}
+
+template<typename pass_type, typename node_type>
+static inline void previsit_impl( __attribute__((unused)) pass_type& pass, node_type * node, __attribute__((unused)) long unused ) {
+	//Do nothing
+}
+
+
+template<typename pass_type, typename node_type>
+static inline auto postvisit_impl( pass_type& pass, node_type * node, __attribute__((unused)) int unused ) ->decltype( pass.postvisit( node ), void() ) {
+	pass.postvisit( node );
+}
+
+template<typename pass_type, typename node_type>
+static inline auto postvisit_impl( __attribute__((unused)) pass_type& pass, node_type * node, __attribute__((unused)) long unused ) {
+	//Do nothing
+}
+
+//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//Templated visitor type
+
+//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+template< typename pass_type >
+class PassVisitor final : public Visitor {
+public:
+	PassVisitor() = default;
+
+	template< typename... Args >
+	PassVisitor(Args &&... args) 
+		: pass( std::forward<Args>( args )... )
+	{}
+
+	virtual ~PassVisitor() = default;
+private:
+	pass_type pass;
+
+public:
+
+	virtual void visit( ObjectDecl *objectDecl ) override final;
+	virtual void visit( FunctionDecl *functionDecl ) override final;
+	virtual void visit( StructDecl *aggregateDecl ) override final;
+	virtual void visit( UnionDecl *aggregateDecl ) override final;
+	virtual void visit( EnumDecl *aggregateDecl ) override final;
+	virtual void visit( TraitDecl *aggregateDecl ) override final;
+	virtual void visit( TypeDecl *typeDecl ) override final;
+	virtual void visit( TypedefDecl *typeDecl ) override final;
+	virtual void visit( AsmDecl *asmDecl ) override final;
+
+	virtual void visit( CompoundStmt *compoundStmt ) override final;
+	virtual void visit( ExprStmt *exprStmt ) override final;
+	virtual void visit( AsmStmt *asmStmt ) override final;
+	virtual void visit( IfStmt *ifStmt ) override final;
+	virtual void visit( WhileStmt *whileStmt ) override final;
+	virtual void visit( ForStmt *forStmt ) override final;
+	virtual void visit( SwitchStmt *switchStmt ) override final;
+	virtual void visit( CaseStmt *caseStmt ) override final;
+	virtual void visit( BranchStmt *branchStmt ) override final;
+	virtual void visit( ReturnStmt *returnStmt ) override final;
+	virtual void visit( TryStmt *tryStmt ) override final;
+	virtual void visit( CatchStmt *catchStmt ) override final;
+	virtual void visit( FinallyStmt *finallyStmt ) override final;
+	virtual void visit( NullStmt *nullStmt ) override final;
+	virtual void visit( DeclStmt *declStmt ) override final;
+	virtual void visit( ImplicitCtorDtorStmt *impCtorDtorStmt ) override final;
+
+	virtual void visit( ApplicationExpr *applicationExpr ) override final;
+	virtual void visit( UntypedExpr *untypedExpr ) override final;
+	virtual void visit( NameExpr *nameExpr ) override final;
+	virtual void visit( CastExpr *castExpr ) override final;
+	virtual void visit( AddressExpr *addressExpr ) override final;
+	virtual void visit( LabelAddressExpr *labAddressExpr ) override final;
+	virtual void visit( UntypedMemberExpr *memberExpr ) override final;
+	virtual void visit( MemberExpr *memberExpr ) override final;
+	virtual void visit( VariableExpr *variableExpr ) override final;
+	virtual void visit( ConstantExpr *constantExpr ) override final;
+	virtual void visit( SizeofExpr *sizeofExpr ) override final;
+	virtual void visit( AlignofExpr *alignofExpr ) override final;
+	virtual void visit( UntypedOffsetofExpr *offsetofExpr ) override final;
+	virtual void visit( OffsetofExpr *offsetofExpr ) override final;
+	virtual void visit( OffsetPackExpr *offsetPackExpr ) override final;
+	virtual void visit( AttrExpr *attrExpr ) override final;
+	virtual void visit( LogicalExpr *logicalExpr ) override final;
+	virtual void visit( ConditionalExpr *conditionalExpr ) override final;
+	virtual void visit( CommaExpr *commaExpr ) override final;
+	virtual void visit( TypeExpr *typeExpr ) override final;
+	virtual void visit( AsmExpr *asmExpr ) override final;
+	virtual void visit( ImplicitCopyCtorExpr *impCpCtorExpr ) override final;
+	virtual void visit( ConstructorExpr * ctorExpr ) override final;
+	virtual void visit( CompoundLiteralExpr *compLitExpr ) override final;
+	virtual void visit( UntypedValofExpr *valofExpr ) override final;
+	virtual void visit( RangeExpr *rangeExpr ) override final;
+	virtual void visit( UntypedTupleExpr *tupleExpr ) override final;
+	virtual void visit( TupleExpr *tupleExpr ) override final;
+	virtual void visit( TupleIndexExpr *tupleExpr ) override final;
+	virtual void visit( MemberTupleExpr *tupleExpr ) override final;
+	virtual void visit( TupleAssignExpr *assignExpr ) override final;
+	virtual void visit( StmtExpr * stmtExpr ) override final;
+	virtual void visit( UniqueExpr * uniqueExpr ) override final;
+
+	virtual void visit( VoidType *basicType ) override final;
+	virtual void visit( BasicType *basicType ) override final;
+	virtual void visit( PointerType *pointerType ) override final;
+	virtual void visit( ArrayType *arrayType ) override final;
+	virtual void visit( FunctionType *functionType ) override final;
+	virtual void visit( StructInstType *aggregateUseType ) override final;
+	virtual void visit( UnionInstType *aggregateUseType ) override final;
+	virtual void visit( EnumInstType *aggregateUseType ) override final;
+	virtual void visit( TraitInstType *aggregateUseType ) override final;
+	virtual void visit( TypeInstType *aggregateUseType ) override final;
+	virtual void visit( TupleType *tupleType ) override final;
+	virtual void visit( TypeofType *typeofType ) override final;
+	virtual void visit( AttrType *attrType ) override final;
+	virtual void visit( VarArgsType *varArgsType ) override final;
+	virtual void visit( ZeroType *zeroType ) override final;
+	virtual void visit( OneType *oneType ) override final;
+
+	virtual void visit( SingleInit *singleInit ) override final;
+	virtual void visit( ListInit *listInit ) override final;
+	virtual void visit( ConstructorInit *ctorInit ) override final;
+
+	virtual void visit( Subrange *subrange ) override final;
+
+	virtual void visit( Constant *constant ) override final;
+
+private:
+	template<typename node_type> 
+	auto call_previsit ( node_type * node ) 
+		-> decltype( previsit_impl ( pass, node, 0 ), void() ) 
+	{ 
+		previsit_impl ( pass, node, 0 ); 
+	}
+
+	template<typename node_type> 
+	auto call_postvisit( node_type * node )
+		-> decltype( postvisit_impl( pass, node, 0 ), void() ) 
+	{ 
+		postvisit_impl( pass, node, 0 ); 
+	}
+};
+
+#include "PassVisitor.impl.h"
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 13932f1466902c0dc5d4b542261856dbf70e34fa)
+++ src/Common/PassVisitor.impl.h	(revision 13932f1466902c0dc5d4b542261856dbf70e34fa)
@@ -0,0 +1,402 @@
+#pragma once
+
+#define VISIT_BODY( node )    \
+	call_previsit( node );  \
+	Visitor::visit( node ); \
+	call_postvisit( node ); \
+
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( ObjectDecl * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( FunctionDecl * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( StructDecl * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( UnionDecl * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( EnumDecl * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( TraitDecl * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( TypeDecl * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( TypedefDecl * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( AsmDecl * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( CompoundStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( ExprStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( AsmStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( IfStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( WhileStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( ForStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( SwitchStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( CaseStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( BranchStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( ReturnStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( TryStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( CatchStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( FinallyStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( NullStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( DeclStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( ImplicitCtorDtorStmt * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( ApplicationExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( UntypedExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( NameExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( CastExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( AddressExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( LabelAddressExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( UntypedMemberExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( MemberExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( VariableExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( ConstantExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( SizeofExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( AlignofExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( UntypedOffsetofExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( OffsetofExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( OffsetPackExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( AttrExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( LogicalExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( ConditionalExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( CommaExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( TypeExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( AsmExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( ImplicitCopyCtorExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( ConstructorExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( CompoundLiteralExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( UntypedValofExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( RangeExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( UntypedTupleExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( TupleExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( TupleIndexExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( MemberTupleExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( TupleAssignExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( StmtExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( UniqueExpr * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( VoidType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( BasicType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( PointerType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( ArrayType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( FunctionType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( StructInstType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( UnionInstType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( EnumInstType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( TraitInstType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( TypeInstType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( TupleType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( TypeofType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( AttrType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( VarArgsType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( ZeroType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( OneType * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( SingleInit * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( ListInit * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( ConstructorInit * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( Subrange * node ) { 
+	VISIT_BODY( node ); 
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type>::visit( Constant * node ) { 
+	VISIT_BODY( node ); 
+}
Index: src/Common/utility.h
===================================================================
--- src/Common/utility.h	(revision eb0951d0cd306bfecdc590fa7b0b243eb3ed1853)
+++ src/Common/utility.h	(revision 13932f1466902c0dc5d4b542261856dbf70e34fa)
@@ -334,4 +334,6 @@
 	{}
 
+	CodeLocation( const CodeLocation& rhs ) = default;
+
 	bool isSet () const {
 		return -1 != linenumber;
Index: src/main.cc
===================================================================
--- src/main.cc	(revision eb0951d0cd306bfecdc590fa7b0b243eb3ed1853)
+++ src/main.cc	(revision 13932f1466902c0dc5d4b542261856dbf70e34fa)
@@ -317,5 +317,5 @@
 		} // if
 
-		CodeTools::fillLocations( translationUnit );
+		CodeTools::fillLocations( translationUnit, 2 );
 		CodeGen::generate( translationUnit, *output, ! noprotop, prettycodegenp, true, ! nolinemarks );
 
