Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 8b6b552d2ca087e611b728834712598ff9d157d6)
+++ src/InitTweak/FixInit.cc	(revision fa463f18d6d521f0c6ade52d2a5106d42a026733)
@@ -188,6 +188,9 @@
 			virtual void visit( ApplicationExpr * appExpr );
 
+			SemanticError errors;
 		  private:
 			void handleFirstParam( Expression * firstParam );
+			template< typename... Params >
+			void emit( const Params &... params );
 
 			FunctionDecl * function = 0;
@@ -258,4 +261,9 @@
 				WarnStructMembers warner;
 				acceptAll( translationUnit, warner );
+
+				// visitor doesn't throw so that it can collect all errors
+				if ( ! warner.errors.isEmpty() ) {
+					throw warner.errors;
+				}
 			}
 		}
@@ -735,7 +743,9 @@
 			for ( DeclarationWithType * member : unhandled ) {
 				// emit a warning for each unhandled member
-				warn( "in ", CodeGen::genType( function->get_functionType(), function->get_name(), false ), ", member ", member->get_name(), " may not have been ", isConstructor( funcDecl->get_name() ) ? "constructed" : "destructed" );
+				emit( "in ", CodeGen::genType( function->get_functionType(), function->get_name(), false ), ", member ", member->get_name(), " may not have been ", isConstructor( funcDecl->get_name() ) ? "constructed" : "destructed" );
 			}
 
+			// need to steal the errors before they're lost
+			old.errors.append( errors );
 			*this = old;
 		}
@@ -797,5 +807,5 @@
 							if ( unhandled.count( memberExpr->get_member() ) ) {
 								// emit a warning because a member was used before it was constructed
-								warn( "in ", CodeGen::genType( function->get_functionType(), function->get_name(), false ), ", member ", memberExpr->get_member()->get_name(), " used before being constructed" );
+								emit( "in ", CodeGen::genType( function->get_functionType(), function->get_name(), false ), ", member ", memberExpr->get_member()->get_name(), " used before being constructed" );
 							}
 						}
@@ -805,4 +815,16 @@
 			Parent::visit( memberExpr );
 		}
+
+		template< typename Visitor, typename... Params >
+		void error( Visitor & v, const Params &... params ) {
+			v.errors.append( toString( params... ) );
+		}
+
+		template< typename... Params >
+		void WarnStructMembers::emit( const Params &... params ) {
+			// toggle warnings vs. errors here.
+			// warn( params... );
+			error( *this, params... );
+		}
 	} // namespace
 } // namespace InitTweak
