Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision c27fb591ad3afae2cd68507b3ee126a01e026758)
+++ src/Parser/DeclarationNode.cc	(revision 094476de228cd8cb7d6a34066aacd6b8adb12617)
@@ -576,15 +576,15 @@
 					dst->basictype = src->basictype;
 				} else if ( src->basictype != DeclarationNode::NoBasicType )
-					throw SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::basicTypeNames[ src->basictype ] + " in type: " );
+					SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::basicTypeNames[ src->basictype ] + " in type: " );
 
 				if ( dst->complextype == DeclarationNode::NoComplexType ) {
 					dst->complextype = src->complextype;
 				} else if ( src->complextype != DeclarationNode::NoComplexType )
-					throw SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::complexTypeNames[ src->complextype ] + " in type: " );
+					SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::complexTypeNames[ src->complextype ] + " in type: " );
 
 				if ( dst->signedness == DeclarationNode::NoSignedness ) {
 					dst->signedness = src->signedness;
 				} else if ( src->signedness != DeclarationNode::NoSignedness )
-					throw SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::signednessNames[ src->signedness ] + " in type: " );
+					SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::signednessNames[ src->signedness ] + " in type: " );
 
 				if ( dst->length == DeclarationNode::NoLength ) {
@@ -593,5 +593,5 @@
 					dst->length = DeclarationNode::LongLong;
 				} else if ( src->length != DeclarationNode::NoLength )
-					throw SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::lengthNames[ src->length ] + " in type: " );
+					SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::lengthNames[ src->length ] + " in type: " );
 			} // if
 			break;
@@ -940,5 +940,5 @@
 
 void buildList( const DeclarationNode * firstNode, std::list< Declaration * > &outputList ) {
-	SemanticError errors;
+	SemanticErrorException errors;
 	std::back_insert_iterator< std::list< Declaration * > > out( outputList );
 
@@ -960,5 +960,5 @@
 				* out++ = decl;
 			} // if
-		} catch( SemanticError &e ) {
+		} catch( SemanticErrorException &e ) {
 			errors.append( e );
 		} // try
@@ -971,5 +971,5 @@
 
 void buildList( const DeclarationNode * firstNode, std::list< DeclarationWithType * > &outputList ) {
-	SemanticError errors;
+	SemanticErrorException errors;
 	std::back_insert_iterator< std::list< DeclarationWithType * > > out( outputList );
 
@@ -994,5 +994,5 @@
 				} // if
 			} // if
-		} catch( SemanticError &e ) {
+		} catch( SemanticErrorException &e ) {
 			errors.append( e );
 		} // try
@@ -1005,5 +1005,5 @@
 
 void buildTypeList( const DeclarationNode * firstNode, std::list< Type * > &outputList ) {
-	SemanticError errors;
+	SemanticErrorException errors;
 	std::back_insert_iterator< std::list< Type * > > out( outputList );
 	const DeclarationNode * cur = firstNode;
@@ -1012,5 +1012,5 @@
 		try {
 			* out++ = cur->buildType();
-		} catch( SemanticError &e ) {
+		} catch( SemanticErrorException &e ) {
 			errors.append( e );
 		} // try
@@ -1024,5 +1024,5 @@
 
 Declaration * DeclarationNode::build() const {
-	if ( ! error.empty() ) throw SemanticError( this, error + " in declaration of " );
+	if ( ! error.empty() ) SemanticError( this, error + " in declaration of " );
 
 	if ( asmStmt ) {
@@ -1047,5 +1047,5 @@
 		//    inline _Noreturn int i;			// disallowed
 		if ( type->kind != TypeData::Function && funcSpecs.any() ) {
-			throw SemanticError( this, "invalid function specifier for " );
+			SemanticError( this, "invalid function specifier for " );
 		} // if
 		return buildDecl( type, name ? *name : string( "" ), storageClasses, maybeBuild< Expression >( bitfieldWidth ), funcSpecs, linkage, asmName, maybeBuild< Initializer >(initializer), attributes )->set_extension( extension );
@@ -1057,5 +1057,5 @@
 	//    inlne _Noreturn enum   E { ... };		// disallowed
 	if ( funcSpecs.any() ) {
-		throw SemanticError( this, "invalid function specifier for " );
+		SemanticError( this, "invalid function specifier for " );
 	} // if
 	assertf( name, "ObjectDecl must a have name\n" );
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision c27fb591ad3afae2cd68507b3ee126a01e026758)
+++ src/Parser/ExpressionNode.cc	(revision 094476de228cd8cb7d6a34066aacd6b8adb12617)
@@ -356,5 +356,5 @@
 
 Expression * build_field_name_FLOATING_FRACTIONconstant( const string & str ) {
-	if ( str.find_first_not_of( "0123456789", 1 ) != string::npos ) throw SemanticError( yylloc, "invalid tuple index " + str );
+	if ( str.find_first_not_of( "0123456789", 1 ) != string::npos ) SemanticError( yylloc, "invalid tuple index " + str );
 	Expression * ret = build_constantInteger( *new string( str.substr(1) ) );
 	delete &str;
@@ -363,5 +363,5 @@
 
 Expression * build_field_name_FLOATING_DECIMALconstant( const string & str ) {
-	if ( str[str.size()-1] != '.' ) throw SemanticError( yylloc, "invalid tuple index " + str );
+	if ( str[str.size()-1] != '.' ) SemanticError( yylloc, "invalid tuple index " + str );
 	Expression * ret = build_constantInteger( *new string( str.substr( 0, str.size()-1 ) ) );
 	delete &str;
Index: src/Parser/LinkageSpec.cc
===================================================================
--- src/Parser/LinkageSpec.cc	(revision c27fb591ad3afae2cd68507b3ee126a01e026758)
+++ src/Parser/LinkageSpec.cc	(revision 094476de228cd8cb7d6a34066aacd6b8adb12617)
@@ -34,5 +34,5 @@
 		return BuiltinC;
 	} else {
-		throw SemanticError( location, "Invalid linkage specifier " + *spec );
+		SemanticError( location, "Invalid linkage specifier " + *spec );
 	} // if
 }
@@ -48,5 +48,5 @@
 		return old_spec;
 	} else {
-		throw SemanticError( location, "Invalid linkage specifier " + *cmd );
+		SemanticError( location, "Invalid linkage specifier " + *cmd );
 	} // if
 }
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision c27fb591ad3afae2cd68507b3ee126a01e026758)
+++ src/Parser/ParseNode.h	(revision 094476de228cd8cb7d6a34066aacd6b8adb12617)
@@ -419,5 +419,5 @@
 template< typename SynTreeType, typename NodeType, template< typename, typename...> class Container, typename... Args >
 void buildList( const NodeType * firstNode, Container< SynTreeType *, Args... > &outputList ) {
-	SemanticError errors;
+	SemanticErrorException errors;
 	std::back_insert_iterator< Container< SynTreeType *, Args... > > out( outputList );
 	const NodeType * cur = firstNode;
@@ -432,5 +432,5 @@
 				assertf(false, "buildList unknown type");
 			} // if
-		} catch( SemanticError &e ) {
+		} catch( SemanticErrorException &e ) {
 			errors.append( e );
 		} // try
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision c27fb591ad3afae2cd68507b3ee126a01e026758)
+++ src/Parser/TypeData.cc	(revision 094476de228cd8cb7d6a34066aacd6b8adb12617)
@@ -519,5 +519,5 @@
 
 static string genTSError( string msg, DeclarationNode::BasicType basictype ) {
-	throw SemanticError( yylloc, string( "invalid type specifier \"" ) + msg + "\" for type \"" + DeclarationNode::basicTypeNames[basictype] + "\"." );
+	SemanticError( yylloc, string( "invalid type specifier \"" ) + msg + "\" for type \"" + DeclarationNode::basicTypeNames[basictype] + "\"." );
 } // genTSError
 
@@ -919,8 +919,8 @@
 				// type set => parameter name already transformed by a declaration names so there is a duplicate
 				// declaration name attempting a second transformation
-				if ( param->type ) throw SemanticError( param->location, string( "duplicate declaration name " ) + *param->name );
+				if ( param->type ) SemanticError( param->location, string( "duplicate declaration name " ) + *param->name );
 				// declaration type reset => declaration already transformed by a parameter name so there is a duplicate
 				// parameter name attempting a second transformation
-				if ( ! decl->type ) throw SemanticError( param->location, string( "duplicate parameter name " ) + *param->name );
+				if ( ! decl->type ) SemanticError( param->location, string( "duplicate parameter name " ) + *param->name );
 				param->type = decl->type;				// set copy declaration type to parameter type
 				decl->type = nullptr;					// reset declaration type
@@ -929,5 +929,5 @@
 		} // for
 		// declaration type still set => type not moved to a matching parameter so there is a missing parameter name
-		if ( decl->type ) throw SemanticError( decl->location, string( "missing name in parameter list " ) + *decl->name );
+		if ( decl->type ) SemanticError( decl->location, string( "missing name in parameter list " ) + *decl->name );
 	} // for
 
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision c27fb591ad3afae2cd68507b3ee126a01e026758)
+++ src/Parser/lex.ll	(revision 094476de228cd8cb7d6a34066aacd6b8adb12617)
@@ -453,5 +453,5 @@
 void yyerror( const char * errmsg ) {
 	cout << (yyfilename ? yyfilename : "*unknown file*") << ':' << yylineno << ':' << column - yyleng + 1
-		 << ": " << SemanticError::error_str() << errmsg << " at token \"" << (yytext[0] == '\0' ? "EOF" : yytext) << '"' << endl;
+		 << ": " << ErrorHelpers::error_str() << errmsg << " at token \"" << (yytext[0] == '\0' ? "EOF" : yytext) << '"' << endl;
 }
 
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision c27fb591ad3afae2cd68507b3ee126a01e026758)
+++ src/Parser/parser.yy	(revision 094476de228cd8cb7d6a34066aacd6b8adb12617)
@@ -482,9 +482,9 @@
 		{ $$ = new ExpressionNode( new StmtExpr( dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >($2) ) ) ); }
 	| type_name '.' no_attr_identifier					// CFA, nested type
-		{ throw SemanticError( yylloc, "Qualified names are currently unimplemented." ); $$ = nullptr; } // FIX ME
+		{ SemanticError( yylloc, "Qualified names are currently unimplemented." ); $$ = nullptr; } // FIX ME
 	| type_name '.' '[' push field_list pop ']'			// CFA, nested type / tuple field selector
-		{ throw SemanticError( yylloc, "Qualified names are currently unimplemented." ); $$ = nullptr; } // FIX ME
+		{ SemanticError( yylloc, "Qualified names are currently unimplemented." ); $$ = nullptr; } // FIX ME
 	| GENERIC '(' assignment_expression ',' generic_assoc_list ')' // C11
-		{ throw SemanticError( yylloc, "_Generic is currently unimplemented." ); $$ = nullptr; } // FIX ME
+		{ SemanticError( yylloc, "_Generic is currently unimplemented." ); $$ = nullptr; } // FIX ME
 	;
 
@@ -780,5 +780,5 @@
 		{ $$ = new ExpressionNode( build_binary_val( $2, $1, $3 ) ); }
 	| unary_expression '=' '{' initializer_list comma_opt '}'
-		{ throw SemanticError( yylloc, "Initializer assignment is currently unimplemented." ); $$ = nullptr; } // FIX ME
+		{ SemanticError( yylloc, "Initializer assignment is currently unimplemented." ); $$ = nullptr; } // FIX ME
 	;
 
@@ -850,5 +850,5 @@
 	| exception_statement
 	| enable_disable_statement
-		{ throw SemanticError( yylloc, "enable/disable statement is currently unimplemented." ); $$ = nullptr; } // FIX ME
+		{ SemanticError( yylloc, "enable/disable statement is currently unimplemented." ); $$ = nullptr; } // FIX ME
 	| asm_statement
 	;
@@ -1067,5 +1067,5 @@
 		{ $$ = new StatementNode( build_return( $2 ) ); }
 	| RETURN '{' initializer_list comma_opt '}'
-		{ throw SemanticError( yylloc, "Initializer return is currently unimplemented." ); $$ = nullptr; } // FIX ME
+		{ SemanticError( yylloc, "Initializer return is currently unimplemented." ); $$ = nullptr; } // FIX ME
 	| THROW assignment_expression_opt ';'				// handles rethrow
 		{ $$ = new StatementNode( build_throw( $2 ) ); }
@@ -1086,5 +1086,5 @@
 mutex_statement:
 	MUTEX '(' argument_expression_list ')' statement
-		{ throw SemanticError( yylloc, "Mutex statement is currently unimplemented." ); $$ = nullptr; } // FIX ME
+		{ SemanticError( yylloc, "Mutex statement is currently unimplemented." ); $$ = nullptr; } // FIX ME
 	;
 
@@ -1316,5 +1316,5 @@
 static_assert:
 	STATICASSERT '(' constant_expression ',' string_literal ')' ';' // C11
-		{ throw SemanticError( yylloc, "Static assert is currently unimplemented." ); $$ = nullptr; }	// FIX ME
+		{ SemanticError( yylloc, "Static assert is currently unimplemented." ); $$ = nullptr; }	// FIX ME
 
 // C declaration syntax is notoriously confusing and error prone. Cforall provides its own type, variable and function
