Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 54043f492a5390fd2baa5b5fafa932d524066315)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision dcbb03b437bf748276aed3f63bfc0ad59a474e4b)
@@ -240,5 +240,5 @@
 				std::cerr << "No reasonable alternatives for expression " << expr << std::endl;
 			)
-			throw SemanticError( expr, "No reasonable alternatives for expression " );
+			SemanticError( expr, "No reasonable alternatives for expression " );
 		}
 		if ( prune ) {
@@ -258,5 +258,5 @@
 				stream << " Alternatives are:\n";
 				printAlts( winners, stream, 1 );
-				throw SemanticError( expr->location, stream.str() );
+				SemanticError( expr->location, stream.str() );
 			}
 			alternatives = move(pruned);
@@ -495,5 +495,5 @@
 				return;
 			} else if ( level >= recursionLimit ) {
-				throw SemanticError( newAlt.expr->location, "Too many recursive assertions" );
+				SemanticError( newAlt.expr->location, "Too many recursive assertions" );
 			} else {
 				AssertionSet newerNeed;
@@ -1112,5 +1112,5 @@
 
 		AltList candidates;
-		SemanticError errors;
+		SemanticErrorException errors;
 		for ( AltList::iterator func = funcFinder.alternatives.begin(); func != funcFinder.alternatives.end(); ++func ) {
 			try {
@@ -1138,5 +1138,5 @@
 					} // if
 				}
-			} catch ( SemanticError &e ) {
+			} catch ( SemanticErrorException &e ) {
 				errors.append( e );
 			}
@@ -1167,5 +1167,5 @@
 						}
 					}
-				} catch ( SemanticError &e ) {
+				} catch ( SemanticErrorException &e ) {
 					errors.append( e );
 				}
@@ -1409,5 +1409,5 @@
 			findMinCost( finder.alternatives.begin(), finder.alternatives.end(), back_inserter( winners ) );
 			if ( winners.size() != 1 ) {
-				throw SemanticError( sizeofExpr->get_expr(), "Ambiguous expression in sizeof operand: " );
+				SemanticError( sizeofExpr->get_expr(), "Ambiguous expression in sizeof operand: " );
 			} // if
 			// return the lowest cost alternative for the argument
@@ -1430,5 +1430,5 @@
 			findMinCost( finder.alternatives.begin(), finder.alternatives.end(), back_inserter( winners ) );
 			if ( winners.size() != 1 ) {
-				throw SemanticError( alignofExpr->get_expr(), "Ambiguous expression in alignof operand: " );
+				SemanticError( alignofExpr->get_expr(), "Ambiguous expression in alignof operand: " );
 			} // if
 			// return the lowest cost alternative for the argument
Index: src/ResolvExpr/CurrentObject.cc
===================================================================
--- src/ResolvExpr/CurrentObject.cc	(revision 54043f492a5390fd2baa5b5fafa932d524066315)
+++ src/ResolvExpr/CurrentObject.cc	(revision dcbb03b437bf748276aed3f63bfc0ad59a474e4b)
@@ -141,5 +141,5 @@
 			base = at->get_base();
 			memberIter = createMemberIterator( base );
-			if ( at->isVarLen ) throw SemanticError( at, "VLA initialization does not support @=" );
+			if ( at->isVarLen ) SemanticError( at, "VLA initialization does not support @=" );
 			setSize( at->get_dimension() );
 		}
@@ -155,6 +155,6 @@
 					size = constExpr->intValue();
 					PRINT( std::cerr << "array type with size: " << size << std::endl; )
-				} catch ( SemanticError & ) {
-					throw SemanticError( expr, "Constant expression of non-integral type in array dimension: " );
+				} catch ( SemanticErrorException & ) {
+					SemanticError( expr, "Constant expression of non-integral type in array dimension: " );
 				}
 			}	else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) {
@@ -178,6 +178,6 @@
 				try {
 					index = constExpr->intValue();
-				} catch( SemanticError & ) {
-					throw SemanticError( expr, "Constant expression of non-integral type in array designator: " );
+				} catch( SemanticErrorException & ) {
+					SemanticError( expr, "Constant expression of non-integral type in array designator: " );
 				}
 			} else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) {
@@ -532,7 +532,7 @@
 		} // for
 		if ( desigAlts.size() > 1 ) {
-			throw SemanticError( designation, toString("Too many alternatives (", desigAlts.size(), ") for designation: ") );
+			SemanticError( designation, toString("Too many alternatives (", desigAlts.size(), ") for designation: ") );
 		} else if ( desigAlts.size() == 0 ) {
-			throw SemanticError( designation, "No reasonable alternatives for designation: " );
+			SemanticError( designation, "No reasonable alternatives for designation: " );
 		}
 		DesignatorChain & d = desigAlts.back();
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 54043f492a5390fd2baa5b5fafa932d524066315)
+++ src/ResolvExpr/Resolver.cc	(revision dcbb03b437bf748276aed3f63bfc0ad59a474e4b)
@@ -174,5 +174,5 @@
 			findMinCost( candidates.begin(), candidates.end(), back_inserter( winners ) );
 			if ( winners.size() == 0 ) {
-				throw SemanticError( untyped, toString( "No reasonable alternatives for ", kindStr, (kindStr != "" ? " " : ""), "expression: ") );
+				SemanticError( untyped, toString( "No reasonable alternatives for ", kindStr, (kindStr != "" ? " " : ""), "expression: ") );
 			} else if ( winners.size() != 1 ) {
 				std::ostringstream stream;
@@ -181,5 +181,5 @@
 				stream << " Alternatives are:\n";
 				printAlts( winners, stream, 1 );
-				throw SemanticError( untyped->location, stream.str() );
+				SemanticError( untyped->location, stream.str() );
 			}
 
@@ -187,5 +187,5 @@
 			Alternative & choice = winners.front();
 			if ( findDeletedExpr( choice.expr ) ) {
-				throw SemanticError( choice.expr, "Unique best alternative includes deleted identifier in " );
+				SemanticError( choice.expr, "Unique best alternative includes deleted identifier in " );
 			}
 			alt = std::move( choice );
@@ -484,5 +484,5 @@
 				ss << strict_dynamic_cast<NameExpr*>( clause.target.function )->name;
 				ss << "' in call to waitfor";
-				throw SemanticError( stmt->location, ss.str() );
+				SemanticError( stmt->location, ss.str() );
 			}
 
@@ -501,15 +501,15 @@
 			// 	try matching the arguments to the parameters
 			// 	not the other way around because we have more arguments than parameters
-			SemanticError errors;
+			SemanticErrorException errors;
 			for ( Alternative & func : funcFinder.get_alternatives() ) {
 				try {
 					PointerType * pointer = dynamic_cast< PointerType* >( func.expr->get_result()->stripReferences() );
 					if( !pointer ) {
-						throw SemanticError( func.expr->get_result(), "candidate not viable: not a pointer type\n" );
+						SemanticError( func.expr->get_result(), "candidate not viable: not a pointer type\n" );
 					}
 
 					FunctionType * function = dynamic_cast< FunctionType* >( pointer->get_base() );
 					if( !function ) {
-						throw SemanticError( pointer->get_base(), "candidate not viable: not a function type\n" );
+						SemanticError( pointer->get_base(), "candidate not viable: not a function type\n" );
 					}
 
@@ -520,5 +520,5 @@
 
 						if( !advance_to_mutex( param, param_end ) ) {
-							throw SemanticError(function, "candidate function not viable: no mutex parameters\n");
+							SemanticError(function, "candidate function not viable: no mutex parameters\n");
 						}
 					}
@@ -559,5 +559,5 @@
 									// We ran out of parameters but still have arguments
 									// this function doesn't match
-									throw SemanticError( function, "candidate function not viable: too many mutex arguments\n" );
+									SemanticError( function, "candidate function not viable: too many mutex arguments\n" );
 								}
 
@@ -571,5 +571,5 @@
 									(*param)->get_type()->print( ss );
 									ss << "'\n";
-									throw SemanticError( function, ss.str() );
+									SemanticError( function, ss.str() );
 								}
 
@@ -583,5 +583,5 @@
 								// We ran out of arguments but still have parameters left
 								// this function doesn't match
-								throw SemanticError( function, "candidate function not viable: too few mutex arguments\n" );
+								SemanticError( function, "candidate function not viable: too few mutex arguments\n" );
 							}
 
@@ -599,10 +599,10 @@
 
 						}
-						catch( SemanticError &e ) {
+						catch( SemanticErrorException &e ) {
 							errors.append( e );
 						}
 					}
 				}
-				catch( SemanticError &e ) {
+				catch( SemanticErrorException &e ) {
 					errors.append( e );
 				}
@@ -610,8 +610,8 @@
 
 			// Make sure we got the right number of arguments
-			if( func_candidates.empty() )    { SemanticError top( stmt->location, "No alternatives for function in call to waitfor"  ); top.append( errors ); throw top; }
-			if( args_candidates.empty() )    { SemanticError top( stmt->location, "No alternatives for arguments in call to waitfor" ); top.append( errors ); throw top; }
-			if( func_candidates.size() > 1 ) { SemanticError top( stmt->location, "Ambiguous function in call to waitfor"            ); top.append( errors ); throw top; }
-			if( args_candidates.size() > 1 ) { SemanticError top( stmt->location, "Ambiguous arguments in call to waitfor"           ); top.append( errors ); throw top; }
+			if( func_candidates.empty() )    { SemanticErrorException top( stmt->location, "No alternatives for function in call to waitfor"  ); top.append( errors ); throw top; }
+			if( args_candidates.empty() )    { SemanticErrorException top( stmt->location, "No alternatives for arguments in call to waitfor" ); top.append( errors ); throw top; }
+			if( func_candidates.size() > 1 ) { SemanticErrorException top( stmt->location, "Ambiguous function in call to waitfor"            ); top.append( errors ); throw top; }
+			if( args_candidates.size() > 1 ) { SemanticErrorException top( stmt->location, "Ambiguous arguments in call to waitfor"           ); top.append( errors ); throw top; }
 			// TODO: need to use findDeletedExpr to ensure no deleted identifiers are used.
 
