Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/AST/Pass.hpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -327,16 +327,20 @@
 /// The Pass template handles what *before* and *after* means automatically
 template< template<class...> class container_t = std::list >
-struct WithStmtsToAdd {
+struct WithStmtsToAddX {
 	container_t< ptr<Stmt> > stmtsToAddBefore;
 	container_t< ptr<Stmt> > stmtsToAddAfter;
 };
+
+struct WithStmtsToAdd : public WithStmtsToAddX<> {};
 
 /// Used if visitor requires added declarations before or after the current node.
 /// The Pass template handles what *before* and *after* means automatically
 template< template<class...> class container_t = std::list >
-struct WithDeclsToAdd {
+struct WithDeclsToAddX {
 	container_t< ptr<Decl> > declsToAddBefore;
 	container_t< ptr<Decl> > declsToAddAfter;
 };
+
+struct WithDeclsToAdd : public WithDeclsToAddX<> {};
 
 /// Use if visitation should stop at certain levels
Index: src/Concurrency/Actors.cpp
===================================================================
--- src/Concurrency/Actors.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/Concurrency/Actors.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -194,5 +194,5 @@
 // collects data needed for next pass that does the circular defn resolution
 //     for message send operators (via table above)
-struct GenFuncsCreateTables : public ast::WithDeclsToAdd<> {
+struct GenFuncsCreateTables : public ast::WithDeclsToAdd {
 	unordered_set<const StructDecl *> & actorStructDecls;
 	unordered_set<const StructDecl *>  & messageStructDecls;
@@ -451,5 +451,5 @@
 // separate pass is needed since this pass resolves circular defn issues
 // generates the forward declarations of the send operator for actor routines
-struct FwdDeclOperator : public ast::WithDeclsToAdd<> {
+struct FwdDeclOperator : public ast::WithDeclsToAdd {
 	unordered_set<const StructDecl *> & actorStructDecls;
 	unordered_set<const StructDecl *>  & messageStructDecls;
Index: src/Concurrency/Corun.cpp
===================================================================
--- src/Concurrency/Corun.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/Concurrency/Corun.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -25,5 +25,5 @@
 namespace Concurrency {
 
-struct CorunKeyword : public WithDeclsToAdd<>, public WithStmtsToAdd<> {
+struct CorunKeyword : public WithDeclsToAdd, public WithStmtsToAdd {
 	UniqueName CorunFnNamer = "__CFA_corun_lambda_"s;
 	UniqueName CoforFnNamer = "__CFA_cofor_lambda_"s;
Index: src/Concurrency/Keywords.cpp
===================================================================
--- src/Concurrency/Keywords.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/Concurrency/Keywords.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -117,5 +117,5 @@
 
 // --------------------------------------------------------------------------
-struct ConcurrentSueKeyword : public ast::WithDeclsToAdd<> {
+struct ConcurrentSueKeyword : public ast::WithDeclsToAdd {
 	ConcurrentSueKeyword(
 		std::string&& type_name, std::string&& field_name,
@@ -639,5 +639,5 @@
 // --------------------------------------------------------------------------
 struct SuspendKeyword final :
-		public ast::WithStmtsToAdd<>, public ast::WithGuards {
+		public ast::WithStmtsToAdd, public ast::WithGuards {
 	SuspendKeyword() = default;
 	virtual ~SuspendKeyword() = default;
@@ -860,5 +860,5 @@
 
 // --------------------------------------------------------------------------
-struct MutexKeyword final : public ast::WithDeclsToAdd<> {
+struct MutexKeyword final : public ast::WithDeclsToAdd {
 	const ast::FunctionDecl * postvisit( const ast::FunctionDecl * decl );
 	void postvisit( const ast::StructDecl * decl );
Index: src/Concurrency/Waituntil.cpp
===================================================================
--- src/Concurrency/Waituntil.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/Concurrency/Waituntil.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -1398,5 +1398,5 @@
 // To add the predicates at global scope we need to do it in a second pass
 // Predicates are added after "struct select_node { ... };"
-class AddPredicateDecls final : public WithDeclsToAdd<> {
+class AddPredicateDecls final : public WithDeclsToAdd {
 	vector<FunctionDecl *> & satFns;
 	const StructDecl * selectNodeDecl = nullptr;
Index: src/ControlStruct/ExceptDecl.cpp
===================================================================
--- src/ControlStruct/ExceptDecl.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/ControlStruct/ExceptDecl.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -401,5 +401,5 @@
 }
 
-struct ExceptDeclCore : public ast::WithDeclsToAdd<> {
+struct ExceptDeclCore : public ast::WithDeclsToAdd {
 	ast::StructDecl const * transformExcept( ast::StructDecl const * decl );
 	ast::ObjectDecl const * transformVTable(
Index: src/GenPoly/Box.cpp
===================================================================
--- src/GenPoly/Box.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/GenPoly/Box.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -55,5 +55,5 @@
 /// Adds layout-generation functions to polymorphic types.
 struct LayoutFunctionBuilder final :
-		public ast::WithDeclsToAdd<>,
+		public ast::WithDeclsToAdd,
 		public ast::WithShortCircuiting,
 		public ast::WithVisitorRef<LayoutFunctionBuilder> {
@@ -344,5 +344,5 @@
 		public ast::WithGuards,
 		public ast::WithShortCircuiting,
-		public ast::WithStmtsToAdd<>,
+		public ast::WithStmtsToAdd,
 		public ast::WithVisitorRef<CallAdapter> {
 	CallAdapter();
@@ -1575,7 +1575,7 @@
 struct PolyGenericCalculator final :
 		public ast::WithConstTypeSubstitution,
-		public ast::WithDeclsToAdd<>,
+		public ast::WithDeclsToAdd,
 		public ast::WithGuards,
-		public ast::WithStmtsToAdd<>,
+		public ast::WithStmtsToAdd,
 		public ast::WithVisitorRef<PolyGenericCalculator> {
 	PolyGenericCalculator();
Index: src/GenPoly/InstantiateGeneric.cpp
===================================================================
--- src/GenPoly/InstantiateGeneric.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/GenPoly/InstantiateGeneric.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -277,5 +277,5 @@
 		public ast::WithVisitorRef<FixDtypeStatic>,
 		public ast::WithShortCircuiting,
-		public ast::WithStmtsToAdd<> {
+		public ast::WithStmtsToAdd {
 	ast::ApplicationExpr const * previsit( ast::ApplicationExpr const * expr );
 	void previsit( ast::AddressExpr const * expr );
@@ -421,5 +421,5 @@
 		public ast::WithCodeLocation,
 		public ast::WithConstTypeSubstitution,
-		public ast::WithDeclsToAdd<>,
+		public ast::WithDeclsToAdd,
 		public ast::WithGuards,
 		public ast::WithVisitorRef<GenericInstantiator>
Index: src/GenPoly/Lvalue.cpp
===================================================================
--- src/GenPoly/Lvalue.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/GenPoly/Lvalue.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -85,5 +85,5 @@
 struct ReferenceConversions final :
 		public ast::WithConstTranslationUnit,
-		public ast::WithGuards, public ast::WithStmtsToAdd<> {
+		public ast::WithGuards, public ast::WithStmtsToAdd {
 	ast::Expr const * postvisit( ast::CastExpr const * expr );
 	ast::Expr const * postvisit( ast::AddressExpr const * expr );
Index: src/GenPoly/Specialize.cpp
===================================================================
--- src/GenPoly/Specialize.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/GenPoly/Specialize.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -30,5 +30,5 @@
 struct SpecializeCore final :
 		public ast::WithConstTypeSubstitution,
-		public ast::WithDeclsToAdd<>,
+		public ast::WithDeclsToAdd,
 		public ast::WithVisitorRef<SpecializeCore> {
 	std::string paramPrefix = "_p";
Index: src/InitTweak/FixInit.cpp
===================================================================
--- src/InitTweak/FixInit.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/InitTweak/FixInit.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -105,5 +105,5 @@
 /// generate/resolve copy construction expressions for each, and generate/resolve destructors for both
 /// arguments and return value temporaries
-struct ResolveCopyCtors final : public ast::WithGuards, public ast::WithStmtsToAdd<>, public ast::WithSymbolTable, public ast::WithShortCircuiting, public ast::WithVisitorRef<ResolveCopyCtors>, public ast::WithConstTranslationUnit {
+struct ResolveCopyCtors final : public ast::WithGuards, public ast::WithStmtsToAdd, public ast::WithSymbolTable, public ast::WithShortCircuiting, public ast::WithVisitorRef<ResolveCopyCtors>, public ast::WithConstTranslationUnit {
 	const ast::Expr * postvisit( const ast::ImplicitCopyCtorExpr * impCpCtorExpr );
 	const ast::StmtExpr * previsit( const ast::StmtExpr * stmtExpr );
@@ -177,5 +177,5 @@
 /// insert destructor calls at the appropriate places.  must happen before CtorInit nodes are removed
 /// (currently by FixInit)
-struct InsertDtors final : public ObjDeclCollector, public ast::WithStmtsToAdd<> {
+struct InsertDtors final : public ObjDeclCollector, public ast::WithStmtsToAdd {
 	InsertDtors( ast::Pass<LabelFinder> & finder ) : finder( finder ), labelVars( finder.core.vars ) {}
 
@@ -194,5 +194,5 @@
 
 /// expand each object declaration to use its constructor after it is declared.
-struct FixInit : public ast::WithStmtsToAdd<> {
+struct FixInit : public ast::WithStmtsToAdd {
 	static void fixInitializers( ast::TranslationUnit &translationUnit );
 
@@ -230,5 +230,5 @@
 
 /// expands ConstructorExpr nodes into comma expressions, using a temporary for the first argument
-struct FixCtorExprs final : public ast::WithDeclsToAdd<>, public ast::WithSymbolTable, public ast::WithShortCircuiting, public ast::WithConstTranslationUnit {
+struct FixCtorExprs final : public ast::WithDeclsToAdd, public ast::WithSymbolTable, public ast::WithShortCircuiting, public ast::WithConstTranslationUnit {
 	const ast::Expr * postvisit( const ast::ConstructorExpr * ctorExpr );
 };
Index: src/InitTweak/GenInit.cpp
===================================================================
--- src/InitTweak/GenInit.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/InitTweak/GenInit.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -46,5 +46,5 @@
 	// Outer pass finds declarations, for their type could wrap a type that needs hoisting
 	struct HoistArrayDimension_NoResolve final :
-			public ast::WithDeclsToAdd<>, public ast::WithShortCircuiting,
+			public ast::WithDeclsToAdd, public ast::WithShortCircuiting,
 			public ast::WithGuards, public ast::WithConstTranslationUnit,
 			public ast::WithVisitorRef<HoistArrayDimension_NoResolve>,
@@ -205,5 +205,5 @@
 
 	struct ReturnFixer final :
-			public ast::WithStmtsToAdd<>, ast::WithGuards, ast::WithShortCircuiting {
+			public ast::WithStmtsToAdd, ast::WithGuards, ast::WithShortCircuiting {
 		void previsit( const ast::FunctionDecl * decl );
 		const ast::ReturnStmt * previsit( const ast::ReturnStmt * stmt );
Index: src/ResolvExpr/Resolver.cpp
===================================================================
--- src/ResolvExpr/Resolver.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/ResolvExpr/Resolver.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -375,5 +375,5 @@
 : public ast::WithSymbolTable, public ast::WithGuards,
   public ast::WithVisitorRef<Resolver>, public ast::WithShortCircuiting,
-  public ast::WithStmtsToAdd<> {
+  public ast::WithStmtsToAdd {
 
 	ast::ptr< ast::Type > functionReturn = nullptr;
Index: src/Tuples/TupleExpansion.cpp
===================================================================
--- src/Tuples/TupleExpansion.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/Tuples/TupleExpansion.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -28,5 +28,5 @@
 };
 
-struct UniqueExprExpander final : public ast::WithDeclsToAdd<> {
+struct UniqueExprExpander final : public ast::WithDeclsToAdd {
 	const ast::Expr * postvisit( const ast::UniqueExpr * unqExpr );
 	// Not a vector, because they may not be adding in increasing order.
@@ -37,5 +37,5 @@
 struct TupleMainExpander final :
 		public ast::WithCodeLocation,
-		public ast::WithDeclsToAdd<>,
+		public ast::WithDeclsToAdd,
 		public ast::WithGuards,
 		public ast::WithVisitorRef<TupleMainExpander> {
Index: src/Validate/Autogen.cpp
===================================================================
--- src/Validate/Autogen.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/Validate/Autogen.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -50,5 +50,5 @@
 // --------------------------------------------------------------------------
 struct AutogenerateRoutines final :
-		public ast::WithDeclsToAdd<>,
+		public ast::WithDeclsToAdd,
 		public ast::WithShortCircuiting {
 	void previsit( const ast::EnumDecl * enumDecl );
Index: src/Validate/CompoundLiteral.cpp
===================================================================
--- src/Validate/CompoundLiteral.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/Validate/CompoundLiteral.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -27,5 +27,5 @@
 
 struct CompoundLiteral final :
-		public ast::WithDeclsToAdd<> {
+		public ast::WithDeclsToAdd {
 	ast::Storage::Classes storageClasses;
 
Index: src/Validate/HoistStruct.cpp
===================================================================
--- src/Validate/HoistStruct.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/Validate/HoistStruct.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -68,5 +68,5 @@
  */
 struct HoistStructCore final :
-		public ast::WithDeclsToAdd<>, public ast::WithGuards {
+		public ast::WithDeclsToAdd, public ast::WithGuards {
 	ast::StructDecl const * previsit( ast::StructDecl const * decl );
 	ast::StructDecl const * postvisit( ast::StructDecl const * decl );
Index: src/Validate/HoistTypeDecls.cpp
===================================================================
--- src/Validate/HoistTypeDecls.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/Validate/HoistTypeDecls.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -22,5 +22,5 @@
 namespace {
 
-struct HoistTypeDecls final : public ast::WithDeclsToAdd<> {
+struct HoistTypeDecls final : public ast::WithDeclsToAdd {
 	void previsit( ast::SizeofExpr const * );
 	void previsit( ast::AlignofExpr const * );
Index: src/Validate/ImplementEnumFunc.cpp
===================================================================
--- src/Validate/ImplementEnumFunc.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/Validate/ImplementEnumFunc.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -472,5 +472,5 @@
 
 struct ImplementEnumFunc final :
-		public ast::WithDeclsToAdd<>, public ast::WithShortCircuiting {
+		public ast::WithDeclsToAdd, public ast::WithShortCircuiting {
 	void previsit(const ast::EnumDecl* enumDecl);
 	void previsit(const ast::FunctionDecl* functionDecl);
Index: src/Validate/LinkInstanceTypes.cpp
===================================================================
--- src/Validate/LinkInstanceTypes.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/Validate/LinkInstanceTypes.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -27,5 +27,5 @@
 struct LinkTypesCore : public WithNoIdSymbolTable,
 		public ast::WithCodeLocation,
-		public ast::WithDeclsToAdd<>,
+		public ast::WithDeclsToAdd,
 		public ast::WithGuards,
 		public ast::WithShortCircuiting,
Index: src/Validate/ReplaceTypedef.cpp
===================================================================
--- src/Validate/ReplaceTypedef.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/Validate/ReplaceTypedef.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -28,5 +28,5 @@
 struct ReplaceTypedefCore final :
 		public ast::WithCodeLocation,
-		public ast::WithDeclsToAdd<>,
+		public ast::WithDeclsToAdd,
 		public ast::WithGuards,
 		public ast::WithShortCircuiting,
Index: src/Virtual/VirtualDtor.cpp
===================================================================
--- src/Virtual/VirtualDtor.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
+++ src/Virtual/VirtualDtor.cpp	(revision ed96731e0151e86950bd43918f4c4873b82f0102)
@@ -119,5 +119,5 @@
 // collects data needed for next pass that does the circular defn resolution
 //     for dtor setters and delete fns (via table above)
-struct GenFuncsCreateTables : public ast::WithDeclsToAdd<> {
+struct GenFuncsCreateTables : public ast::WithDeclsToAdd {
 	unordered_map<const StructDecl *, CtorDtor> & structDecls;
 	CtorDtorTable & torDecls;
@@ -351,5 +351,5 @@
 // separate pass is needed since  __CFA_set_dtor needs to be defined after
 //   the last dtor defn which is found in prior pass
-struct GenSetDtor : public ast::WithDeclsToAdd<> {
+struct GenSetDtor : public ast::WithDeclsToAdd {
 	unordered_map<const StructDecl *, CtorDtor> & structDecls; // set of decls that inherit from virt dtor
 	CtorDtorTable & torDecls;
