Index: src/AST/AssertAcyclic.cpp
===================================================================
--- src/AST/AssertAcyclic.cpp	(revision 60aaa51d44506578dbfd9b89b996a9ca2a971c8a)
+++ src/AST/AssertAcyclic.cpp	(revision 05d55ffed10db511d8a2eec6a4ec6ccfbd8079dd)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jun 06 15:00:00 2019
 // Last Modified By : Andrew Beach
-// Last Modified On : Thu Jun 06 15:00:00 2019
-// Update Count     : 0
+// Last Modified On : Fri Jun 07 14:32:00 2019
+// Update Count     : 1
 //
 
@@ -20,13 +20,15 @@
 namespace {
 
-class NoStrongCyclesCore : public ast::WithGuards {
+class NoStrongCyclesCore {
     std::vector<const ast::Node *> parents;
 public:
-	void previsit ( const ast::Node * node ) {
-		for (auto & p : parents) {
-			assert(p != node);
+	void previsit( const ast::Node * node ) {
+		for (auto & parent : parents) {
+			assert(parent != node);
 		}
 		parents.push_back(node);
-		GuardAction( [this]() { parents.pop_back(); } );
+	}
+	void postvisit( const ast::Node * ) {
+		parents.pop_back();
 	}
 };
@@ -36,5 +38,5 @@
 namespace ast {
 
-void assertAcyclic( const std::list< ast::ptr< ast::Decl > > translationUnit ) {
+void assertAcyclic( const std::list< ast::ptr< ast::Decl > > & translationUnit ) {
    	Pass<NoStrongCyclesCore> visitor;
 	for ( auto & decl : translationUnit ) {
Index: src/AST/AssertAcyclic.hpp
===================================================================
--- src/AST/AssertAcyclic.hpp	(revision 60aaa51d44506578dbfd9b89b996a9ca2a971c8a)
+++ src/AST/AssertAcyclic.hpp	(revision 05d55ffed10db511d8a2eec6a4ec6ccfbd8079dd)
@@ -8,8 +8,8 @@
 //
 // Author           : Andrew Beach
-// Created On       : Thr May 6 15:00:00 2019
+// Created On       : Thr Jun  6 15:00:00 2019
 // Last Modified By : Andrew Beach
-// Last Modified On : Thr May 6 15:00:00 2019
-// Update Count     : 0
+// Last Modified On : Fri Jun  7 14:32:00 2019
+// Update Count     : 1
 //
 
@@ -25,5 +25,5 @@
 namespace ast {
 
-void assertAcyclic( const std::list< ast::ptr< ast::Decl > > translationUnit );
+void assertAcyclic( const std::list< ast::ptr< ast::Decl > > & translationUnit );
 
 }
Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision 60aaa51d44506578dbfd9b89b996a9ca2a971c8a)
+++ src/AST/Convert.cpp	(revision 05d55ffed10db511d8a2eec6a4ec6ccfbd8079dd)
@@ -736,6 +736,12 @@
 		expr->var = get<DeclarationWithType>().accept1(node->var);
 		Type * type = expr->var->get_type()->clone();
+		if(FunctionType * ft = dynamic_cast<FunctionType*>(type)) {
+			if(node->result.as<ast::PointerType>()) {
+				type = new PointerType({}, ft);
+			}
+		}
+
 		type->set_lvalue( true );
-		expr->set_result( type );
+		expr->result = type ;
 		this->node = expr;
 		return nullptr;
@@ -783,5 +789,6 @@
 			assert (!rslt->isType);
 		}
-		if (node->type) {
+		else {
+			assert(node->type);
 			rslt = new SizeofExpr(
 				get<Type>().accept1(node->type)
@@ -804,5 +811,6 @@
 			assert (!rslt->isType);
 		}
-		if (node->type) {
+		else {
+			assert(node->type);
 			rslt = new AlignofExpr(
 				get<Type>().accept1(node->type)
@@ -2164,5 +2172,5 @@
 		);
 
-		visitBaseExpr( old,
+		visitBaseExpr_SkipResultType( old,
 			expr
 		);
@@ -2170,4 +2178,9 @@
 		expr->var = GET_ACCEPT_1(var, DeclWithType);
 		expr->result = expr->var->get_type();
+		if(const ast::FunctionType * ft = expr->result.as<ast::FunctionType>()) {
+			if(dynamic_cast<PointerType *>(old->result)) {
+				expr->result = new ast::PointerType(ft);
+			}
+		}
 		add_qualifiers( expr->result, ast::CV::Lvalue );
 		this->node = expr;
Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision 60aaa51d44506578dbfd9b89b996a9ca2a971c8a)
+++ src/AST/Pass.hpp	(revision 05d55ffed10db511d8a2eec6a4ec6ccfbd8079dd)
@@ -287,4 +287,12 @@
 		at_cleanup( [func](void *) { func(); }, nullptr );
 	}
+
+	/// When this node is finished being visited, call a member of an object.
+	template<typename T>
+	void GuardMethod( T * obj, void (T::*method)() ) {
+		at_cleanup( [ method ]( void * object ) {
+			static_cast< T * >( object )->method();
+		}, static_cast< void * >( obj ) );
+	}
 };
 
Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 60aaa51d44506578dbfd9b89b996a9ca2a971c8a)
+++ src/CodeGen/CodeGenerator.cc	(revision 05d55ffed10db511d8a2eec6a4ec6ccfbd8079dd)
@@ -116,6 +116,6 @@
 	}
 
-	CodeGenerator::CodeGenerator( std::ostream & os, bool pretty, bool genC, bool lineMarks, bool printExprTypes ) : indent( CodeGenerator::tabsize ), output( os ), printLabels( *this ), options( pretty, genC, lineMarks, printExprTypes ), endl( *this ) {}
-	CodeGenerator::CodeGenerator( std::ostream & os, const Options &options ) : indent( CodeGenerator::tabsize ), output( os ), printLabels( *this ), options(options), endl( *this ) {}
+	CodeGenerator::CodeGenerator( std::ostream & os, bool pretty, bool genC, bool lineMarks, bool printExprTypes ) : indent( 0, CodeGenerator::tabsize ), output( os ), printLabels( *this ), options( pretty, genC, lineMarks, printExprTypes ), endl( *this ) {}
+	CodeGenerator::CodeGenerator( std::ostream & os, const Options &options ) : indent( 0, CodeGenerator::tabsize ), output( os ), printLabels( *this ), options(options), endl( *this ) {}
 
 	string CodeGenerator::mangleName( DeclarationWithType * decl ) {
Index: src/Common/Indenter.h
===================================================================
--- src/Common/Indenter.h	(revision 60aaa51d44506578dbfd9b89b996a9ca2a971c8a)
+++ src/Common/Indenter.h	(revision 05d55ffed10db511d8a2eec6a4ec6ccfbd8079dd)
@@ -23,9 +23,9 @@
 	unsigned int amt;         ///< spaces in one level of indentation
 
-	Indenter( unsigned int indent = 0, unsigned int amt = tabsize ) 
-	: indent( indent*amt ), amt( amt ) {}
-	
-	Indenter & operator+=(int nlevels) { indent += amt*nlevels; return *this; }
-	Indenter & operator-=(int nlevels) { indent -= amt*nlevels; return *this; }
+	Indenter( unsigned int indent = 0, unsigned int amt = tabsize )
+	: indent( indent ), amt( amt ) {}
+
+	Indenter & operator+=(int nlevels) { indent += nlevels; return *this; }
+	Indenter & operator-=(int nlevels) { indent -= nlevels; return *this; }
 	Indenter operator+(int nlevels) { Indenter indenter = *this; return indenter += nlevels; }
 	Indenter operator-(int nlevels) { Indenter indenter = *this; return indenter -= nlevels; }
@@ -35,5 +35,5 @@
 
 inline std::ostream & operator<<( std::ostream & out, const Indenter & indent ) {
-	return out << std::string(indent.indent, ' ');
+	return out << std::string(indent.indent * indent.amt, ' ');
 }
 
Index: src/GenPoly/Lvalue.cc
===================================================================
--- src/GenPoly/Lvalue.cc	(revision 60aaa51d44506578dbfd9b89b996a9ca2a971c8a)
+++ src/GenPoly/Lvalue.cc	(revision 05d55ffed10db511d8a2eec6a4ec6ccfbd8079dd)
@@ -196,4 +196,7 @@
 				unsigned int i = 0;
 				const unsigned int end = ftype->parameters.size();
+
+				/// The for loop may eagerly dereference the iterators and fail on empty lists
+				if(i == end) { return appExpr; }
 				for ( auto p : unsafe_group_iterate( appExpr->args, ftype->parameters ) ) {
 					if (i == end) break;
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 60aaa51d44506578dbfd9b89b996a9ca2a971c8a)
+++ src/InitTweak/FixInit.cc	(revision 05d55ffed10db511d8a2eec6a4ec6ccfbd8079dd)
@@ -301,12 +301,5 @@
 				replacement = new CastExpr( replacement, base->clone() );
 			}
-			size_t replaced = DeclReplacer::replace( dtor, { std::make_pair( objDecl, replacement ) } );
-			if(replaced == 0) {
-				objDecl->print(std::cerr);
-				std::cerr << "-----" << std::endl;
-				dtor->print(std::cerr);
-				std::cerr << "Failed to replace " << objDecl << std::endl;
-				abort();
-			}
+			DeclReplacer::replace( dtor, { std::make_pair( objDecl, replacement ) } );
 			dtorFunc->statements->push_back( strict_dynamic_cast<Statement *>( dtor ) );
 
