Index: src/AST/Node.hpp
===================================================================
--- src/AST/Node.hpp	(revision 7d415b464a2df73eab1a88eb6306960109363ce7)
+++ src/AST/Node.hpp	(revision 0766399432295dd9b3818c3757617ba527d40b8c)
@@ -161,7 +161,5 @@
 		}
 	}
-	if ( ! errors.isEmpty() ) {
-		throw errors;
-	}
+	errors.throwIfNonEmpty();
 }
 
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 7d415b464a2df73eab1a88eb6306960109363ce7)
+++ src/AST/Pass.impl.hpp	(revision 0766399432295dd9b3818c3757617ba527d40b8c)
@@ -250,5 +250,5 @@
 	}
 	pass_visitor_stats.depth--;
-	if ( !errors.isEmpty() ) { throw errors; }
+	errors.throwIfNonEmpty();
 
 	return new_kids;
@@ -287,5 +287,5 @@
 	__pedantic_pass_assert( new_kids.size() == container.size() );
 	pass_visitor_stats.depth--;
-	if ( !errors.isEmpty() ) { throw errors; }
+	errors.throwIfNonEmpty();
 
 	return ast::__pass::resultN<container_t, node_t>{ mutated, new_kids };
@@ -401,5 +401,5 @@
 	}
 	pass_visitor_stats.depth--;
-	if ( !errors.isEmpty() ) { throw errors; }
+	errors.throwIfNonEmpty();
 }
 
Index: src/Common/ErrorObjects.hpp
===================================================================
--- src/Common/ErrorObjects.hpp	(revision 7d415b464a2df73eab1a88eb6306960109363ce7)
+++ src/Common/ErrorObjects.hpp	(revision 0766399432295dd9b3818c3757617ba527d40b8c)
@@ -41,5 +41,5 @@
 	void append( SemanticErrorException & other );
 	void append( CodeLocation location, const std::string & );
-	bool isEmpty() const;
+	void throwIfNonEmpty();
 	void print();
   private:
Index: src/Common/SemanticError.cpp
===================================================================
--- src/Common/SemanticError.cpp	(revision 7d415b464a2df73eab1a88eb6306960109363ce7)
+++ src/Common/SemanticError.cpp	(revision 0766399432295dd9b3818c3757617ba527d40b8c)
@@ -88,6 +88,8 @@
 }
 
-bool SemanticErrorException::isEmpty() const {
-	return errors.empty();
+void SemanticErrorException::throwIfNonEmpty() {
+	if ( !errors.empty() ) {
+		throw *this;
+	}
 }
 
Index: src/ControlStruct/MultiLevelExit.cpp
===================================================================
--- src/ControlStruct/MultiLevelExit.cpp	(revision 7d415b464a2df73eab1a88eb6306960109363ce7)
+++ src/ControlStruct/MultiLevelExit.cpp	(revision 0766399432295dd9b3818c3757617ba527d40b8c)
@@ -688,7 +688,5 @@
 	}
 
-	if ( !errors.isEmpty() ) {
-		throw errors;
-	}
+	errors.throwIfNonEmpty();
 	return ret;
 }
Index: src/InitTweak/FixInit.cpp
===================================================================
--- src/InitTweak/FixInit.cpp	(revision 7d415b464a2df73eab1a88eb6306960109363ce7)
+++ src/InitTweak/FixInit.cpp	(revision 0766399432295dd9b3818c3757617ba527d40b8c)
@@ -301,7 +301,5 @@
 		} // try
 	} // for
-	if ( ! errors.isEmpty() ) {
-		throw errors;
-	} // if
+	errors.throwIfNonEmpty();
 }
 
@@ -1173,7 +1171,5 @@
 		function->stmts = mutStmts;
 	}
-	if (! errors.isEmpty()) {
-		throw errors;
-	}
+	errors.throwIfNonEmpty();
 	return function;
 }
Index: src/Parser/DeclarationNode.cpp
===================================================================
--- src/Parser/DeclarationNode.cpp	(revision 7d415b464a2df73eab1a88eb6306960109363ce7)
+++ src/Parser/DeclarationNode.cpp	(revision 0766399432295dd9b3818c3757617ba527d40b8c)
@@ -829,7 +829,5 @@
 	} // for
 
-	if ( ! errors.isEmpty() ) {
-		throw errors;
-	} // if
+	errors.throwIfNonEmpty();
 } // buildList
 
@@ -879,7 +877,5 @@
 	} // for
 
-	if ( ! errors.isEmpty() ) {
-		throw errors;
-	} // if
+	errors.throwIfNonEmpty();
 } // buildList
 
@@ -897,7 +893,5 @@
 	} // for
 
-	if ( ! errors.isEmpty() ) {
-		throw errors;
-	} // if
+	errors.throwIfNonEmpty();
 } // buildTypeList
 
Index: src/Parser/DeclarationNode.hpp
===================================================================
--- src/Parser/DeclarationNode.hpp	(revision 7d415b464a2df73eab1a88eb6306960109363ce7)
+++ src/Parser/DeclarationNode.hpp	(revision 0766399432295dd9b3818c3757617ba527d40b8c)
@@ -156,7 +156,5 @@
 		} // try
 	} // for
-	if ( ! errors.isEmpty() ) {
-		throw errors;
-	} // if
+	errors.throwIfNonEmpty();
 }
 
Index: src/ResolvExpr/CandidateFinder.cpp
===================================================================
--- src/ResolvExpr/CandidateFinder.cpp	(revision 7d415b464a2df73eab1a88eb6306960109363ce7)
+++ src/ResolvExpr/CandidateFinder.cpp	(revision 0766399432295dd9b3818c3757617ba527d40b8c)
@@ -1115,5 +1115,5 @@
 		// Implement SFINAE; resolution errors are only errors if there aren't any non-error
 		// candidates
-		if ( found.empty() && ! errors.isEmpty() ) { throw errors; }
+		if ( found.empty() ) errors.throwIfNonEmpty();
 
 		// only keep the best matching intrinsic result to match C semantics (no unexpected narrowing/widening)
Index: src/Validate/CheckAssertions.cpp
===================================================================
--- src/Validate/CheckAssertions.cpp	(revision 7d415b464a2df73eab1a88eb6306960109363ce7)
+++ src/Validate/CheckAssertions.cpp	(revision 0766399432295dd9b3818c3757617ba527d40b8c)
@@ -60,5 +60,5 @@
 		makeTypeVarMap( decl, typeVars );
 		checkList( typeVars, errors, decl->assertions );
-		if ( !errors.isEmpty() ) { throw errors; }
+		errors.throwIfNonEmpty();
 	}
 
@@ -72,5 +72,5 @@
 		}
 		if ( checkMembers ) checkList( typeVars, errors, decl->members );
-		if ( !errors.isEmpty() ) { throw errors; }
+		errors.throwIfNonEmpty();
 	}
 
Index: src/Validate/ReplaceTypedef.cpp
===================================================================
--- src/Validate/ReplaceTypedef.cpp	(revision 7d415b464a2df73eab1a88eb6306960109363ce7)
+++ src/Validate/ReplaceTypedef.cpp	(revision 0766399432295dd9b3818c3757617ba527d40b8c)
@@ -327,5 +327,5 @@
 	assert( declsToAddBefore.empty() );
 	assert( declsToAddAfter.empty() );
-	if ( !errors.isEmpty() ) { throw errors; }
+	errors.throwIfNonEmpty();
 
 	mut->members.clear();
