Index: src/AST/Expr.cpp
===================================================================
--- src/AST/Expr.cpp	(revision 41b24c88e3b9a228864050167f32e8ca015b0f9d)
+++ src/AST/Expr.cpp	(revision acd80b4ef35ce21c1d4fa9223b9a2250e9c8143a)
@@ -256,12 +256,4 @@
 : Expr( loc, new BasicType{ BasicType::LongUnsignedInt } ), expr( nullptr ), type( t ) {}
 
-// --- UntypedOffsetofExpr
-
-UntypedOffsetofExpr::UntypedOffsetofExpr(
-	const CodeLocation & loc, const Type * ty, const std::string & mem )
-: Expr( loc, new BasicType{ BasicType::LongUnsignedInt } ), type( ty ), member( mem ) {
-	assert( type );
-}
-
 // --- OffsetofExpr
 
Index: src/AST/Expr.hpp
===================================================================
--- src/AST/Expr.hpp	(revision 41b24c88e3b9a228864050167f32e8ca015b0f9d)
+++ src/AST/Expr.hpp	(revision acd80b4ef35ce21c1d4fa9223b9a2250e9c8143a)
@@ -28,5 +28,5 @@
 
 // Must be included in *all* AST classes; should be #undef'd at the end of the file
-#define MUTATE_FRIEND template<typename node_t> friend auto mutate(const node_t * node);
+#define MUTATE_FRIEND template<typename node_t> friend node_t * mutate(const node_t * node);
 
 namespace ast {
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 41b24c88e3b9a228864050167f32e8ca015b0f9d)
+++ src/AST/Pass.impl.hpp	(revision acd80b4ef35ce21c1d4fa9223b9a2250e9c8143a)
@@ -782,7 +782,7 @@
 
 	VISIT(
-		maybe_accept( node, &TryStmt::block        );
-		maybe_accept( node, &TryStmt::handlers     );
-		maybe_accept( node, &TryStmt::finallyBlock );
+		maybe_accept( node, &TryStmt::body     );
+		maybe_accept( node, &TryStmt::handlers );
+		maybe_accept( node, &TryStmt::finally  );
 	)
 
Index: src/AST/Stmt.hpp
===================================================================
--- src/AST/Stmt.hpp	(revision 41b24c88e3b9a228864050167f32e8ca015b0f9d)
+++ src/AST/Stmt.hpp	(revision acd80b4ef35ce21c1d4fa9223b9a2250e9c8143a)
@@ -27,5 +27,5 @@
 
 // Must be included in *all* AST classes; should be #undef'd at the end of the file
-#define MUTATE_FRIEND template<typename node_t> friend auto mutate(const node_t * node);
+#define MUTATE_FRIEND template<typename node_t> friend node_t * mutate(const node_t * node);
 
 namespace ast {
Index: src/AST/Type.cpp
===================================================================
--- src/AST/Type.cpp	(revision 41b24c88e3b9a228864050167f32e8ca015b0f9d)
+++ src/AST/Type.cpp	(revision acd80b4ef35ce21c1d4fa9223b9a2250e9c8143a)
@@ -42,5 +42,5 @@
 	const Type * t;
 	const ReferenceType * r;
-	for ( t = this; (r = dynamic_cast<const ReferenceType *>() ); t = r->base );
+	for ( t = this; (r = dynamic_cast<const ReferenceType *>(t) ); t = r->base );
 	return t;
 }
@@ -103,5 +103,5 @@
 
 bool FunctionType::isTtype() const {
-	return containsTtype( returnVals ) || containsTtype( parameters );
+	return containsTtype( returns ) || containsTtype( params );
 }
 
@@ -109,5 +109,5 @@
 std::vector<readonly<Decl>> ReferenceToType::lookup( const std::string& name ) const {
 	assertf( aggr(), "Must have aggregate to perform lookup" );
-	
+
 	std::vector<readonly<Decl>> found;
 	for ( const Decl * decl : aggr()->members ) {
@@ -119,6 +119,6 @@
 // --- StructInstType
 
-StructInstType::StructInstType( const StructDecl * b, CV::Qualifiers q = {}, 
-	std::vector<ptr<Attribute>>&& as = {} )
+StructInstType::StructInstType( const StructDecl * b, CV::Qualifiers q,
+	std::vector<ptr<Attribute>>&& as )
 : ReferenceToType( b->name, q, std::move(as) ), base( b ) {}
 
@@ -127,6 +127,6 @@
 // --- UnionInstType
 
-UnionInstType::UnionInstType( const UnionDecl * b, CV::Qualifiers q = {}, 
-	std::vector<ptr<Attribute>>&& as = {} )
+UnionInstType::UnionInstType( const UnionDecl * b, CV::Qualifiers q,
+	std::vector<ptr<Attribute>>&& as )
 : ReferenceToType( b->name, q, std::move(as) ), base( b ) {}
 
@@ -135,6 +135,6 @@
 // --- EnumInstType
 
-EnumInstType::EnumInstType( const EnumDecl * b, CV::Qualifiers q = {}, 
-	std::vector<ptr<Attribute>>&& as = {} )
+EnumInstType::EnumInstType( const EnumDecl * b, CV::Qualifiers q,
+	std::vector<ptr<Attribute>>&& as )
 : ReferenceToType( b->name, q, std::move(as) ), base( b ) {}
 
@@ -152,21 +152,21 @@
 // --- TupleType
 
-TupleType::TupleType( std::vector<ptr<Type>> && ts, CV::Qualifiers q = {} )
+TupleType::TupleType( std::vector<ptr<Type>> && ts, CV::Qualifiers q )
 : Type( q ), types( std::move(ts) ), members() {
-	// This constructor is awkward. `TupleType` needs to contain objects so that members can be 
-	// named, but members without initializer nodes end up getting constructors, which breaks 
-	// things. This happens because the object decls have to be visited so that their types are 
-	// kept in sync with the types listed here. Ultimately, the types listed here should perhaps 
-	// be eliminated and replaced with a list-view over members. The temporary solution is to 
-	// make a `ListInit` with `maybeConstructed = false`, so when the object is visited it is not 
+	// This constructor is awkward. `TupleType` needs to contain objects so that members can be
+	// named, but members without initializer nodes end up getting constructors, which breaks
+	// things. This happens because the object decls have to be visited so that their types are
+	// kept in sync with the types listed here. Ultimately, the types listed here should perhaps
+	// be eliminated and replaced with a list-view over members. The temporary solution is to
+	// make a `ListInit` with `maybeConstructed = false`, so when the object is visited it is not
 	// constructed. Potential better solutions include:
-	//   a) Separate `TupleType` from its declarations, into `TupleDecl` and `Tuple{Inst?}Type`, 
+	//   a) Separate `TupleType` from its declarations, into `TupleDecl` and `Tuple{Inst?}Type`,
 	//      similar to the aggregate types.
-	//   b) Separate initializer nodes better, e.g. add a `MaybeConstructed` node that is replaced 
+	//   b) Separate initializer nodes better, e.g. add a `MaybeConstructed` node that is replaced
 	//      by `genInit`, rather than the current boolean flag.
 	members.reserve( types.size() );
 	for ( const Type * ty : types ) {
 		members.emplace_back( new ObjectDecl{
-			CodeLocation{}, "", ty, new ListInit( CodeLocation{}, {}, {}, MaybeConstruct ), 
+			CodeLocation{}, "", ty, new ListInit( CodeLocation{}, {}, {}, MaybeConstruct ),
 			Storage::Classes{}, Linkage::Cforall } );
 	}
Index: src/AST/Type.hpp
===================================================================
--- src/AST/Type.hpp	(revision 41b24c88e3b9a228864050167f32e8ca015b0f9d)
+++ src/AST/Type.hpp	(revision acd80b4ef35ce21c1d4fa9223b9a2250e9c8143a)
@@ -30,5 +30,5 @@
 
 // Must be included in *all* AST classes; should be #undef'd at the end of the file
-#define MUTATE_FRIEND template<typename node_t> friend auto mutate(const node_t * node);
+#define MUTATE_FRIEND template<typename node_t> friend node_t * mutate(const node_t * node);
 
 namespace ast {
Index: src/AST/TypeSubstitution.hpp
===================================================================
--- src/AST/TypeSubstitution.hpp	(revision 41b24c88e3b9a228864050167f32e8ca015b0f9d)
+++ src/AST/TypeSubstitution.hpp	(revision acd80b4ef35ce21c1d4fa9223b9a2250e9c8143a)
@@ -189,12 +189,4 @@
 }
 
-//=================================================================================================
-/// This disgusting and giant piece of boiler-plate is here to solve a cyclic dependency
-/// remove only if there is a better solution
-/// The problem is that ast::ptr< ... > uses increment/decrement which won't work well with
-/// forward declarations
-inline void increment( const class TypeSubstitution * node, Node::ref_type ref ) { node->increment(ref); }
-inline void decrement( const class TypeSubstitution * node, Node::ref_type ref ) { node->decrement(ref); }
-
 } // namespace ast
 
