Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 23f99e1d5411939dbd45a0bbb1412b814c387ffa)
+++ src/AST/Pass.impl.hpp	(revision 8a5530c3a15f736eaece69b227492df67f2bbd89)
@@ -64,5 +64,5 @@
 
 			std::transform(decls->begin(), decls->end(), it, [](const ast::Decl * decl) -> auto {
-					return new DeclStmt( decl );
+					return new DeclStmt( decl->location, decl );
 				});
 			decls->clear();
@@ -119,5 +119,12 @@
 	template< typename pass_t >
 	template< typename node_t >
-	auto Pass< pass_t >::call_accept( const node_t * node ) -> decltype( node->accept(*this) ) {
+	auto Pass< pass_t >::call_accept( const node_t * node )
+		-> typename std::enable_if<
+				!std::is_base_of<ast::Expr, node_t>::value &&
+				!std::is_base_of<ast::Stmt, node_t>::value
+			, decltype( node->accept(*this) )
+		>::type
+
+	{
 		__pedantic_pass_assert( __visit_children() );
 		__pedantic_pass_assert( expr );
@@ -296,5 +303,5 @@
 		child_t parent_t::*child
 	) {
-		static_assert( std::is_base_of<parent_t, node_t>::value, "Error deductiing member object" );
+		static_assert( std::is_base_of<parent_t, node_t>::value, "Error deducing member object" );
 
 		if(__pass::skip(parent->*child)) return;
@@ -424,5 +431,5 @@
 				new ast::ArrayType(
 					new ast::BasicType( ast::BasicType::Char, ast::CV::Qualifiers( ast::CV::Const ) ),
-					nullptr, true, false
+					nullptr, VariableLen, DynamicDim
 				)
 			);
@@ -434,5 +441,5 @@
 				ValueGuard< bool > oldInFunction( inFunction );
 				inFunction = true;
-				maybe_accept( node, &FunctionDecl::statements );
+				maybe_accept( node, &FunctionDecl::stmts );
 				maybe_accept( node, &FunctionDecl::attributes );
 			)
@@ -537,5 +544,5 @@
 
 	VISIT(
-		maybe_accept( node, &TypeDecl::assertions, *this );
+		maybe_accept( node, &TypeDecl::assertions );
 
 		{
@@ -614,4 +621,74 @@
 }
 
+//--------------------------------------------------------------------------
+// ExprStmt
+template< typename pass_t >
+const ast::Stmt * ast::Pass< pass_t >::visit( const ExprStmt * node ) {
+	VISIT_START( node );
+
+	VISIT(
+		maybe_accept( node, &ExprStmt::expr );
+	)
+
+	VISIT_END( Stmt, node );
+}
+
+//--------------------------------------------------------------------------
+// AsmStmt
+template< typename pass_t >
+const ast::Stmt * ast::Pass< pass_t >::visit( const ast::AsmStmt * node ) {
+	VISIT_START( node )
+
+	VISIT(
+		maybe_accept( node, &AsmStmt::instruction );
+		maybe_accept( node, &AsmStmt::output      );
+		maybe_accept( node, &AsmStmt::input       );
+		maybe_accept( node, &AsmStmt::clobber     );
+	)
+
+	VISIT_END( Stmt, node );
+}
+
+//--------------------------------------------------------------------------
+// DirectiveStmt
+template< typename pass_t >
+const ast::Stmt * ast::Pass< pass_t >::visit( const ast::DirectiveStmt * node ) {
+	VISIT_START( node )
+
+	VISIT_END( Stmt, node );
+}
+
+//--------------------------------------------------------------------------
+// IfStmt
+template< typename pass_t >
+const ast::Stmt * ast::Pass< pass_t >::visit( const ast::IfStmt * node ) {
+	VISIT_START( node );
+	VISIT({
+		// if statements introduce a level of scope (for the initialization)
+		guard_indexer guard { *this };
+		maybe_accept( node, &IfStmt::inits    );
+		maybe_accept( node, &IfStmt::cond     );
+		maybe_accept( node, &IfStmt::thenPart );
+		maybe_accept( node, &IfStmt::elsePart );
+	})
+	VISIT_END( Stmt, node );
+}
+
+//--------------------------------------------------------------------------
+// WhileStmt
+template< typename pass_t >
+const ast::Stmt * ast::Pass< pass_t >::visit( const WhileStmt * node ) {
+	VISIT_START( node );
+
+	VISIT({
+		// while statements introduce a level of scope (for the initialization)
+		guard_indexer guard { *this };
+		maybe_accept( node, &WhileStmt::inits );
+		maybe_accept( node, &WhileStmt::cond  );
+		maybe_accept( node, &WhileStmt::body  );
+	})
+
+	VISIT_END( Stmt, node );
+}
 
 //--------------------------------------------------------------------------
@@ -667,5 +744,5 @@
 	)
 
-	VISIT_END( Attribute *, node );
+	VISIT_END( Attribute, node );
 }
 
