Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision c7f9f538e5d5e415101bcf07c2024d410d24e3ee)
+++ src/Parser/ParseNode.h	(revision 4c2fe47e178e4074ffe9d1387cbe05d69e4c0db3)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 13:28:16 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Mon Apr  3 17:55:00 2023
-// Update Count     : 942
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sat Dec  9 17:39:34 2023
+// Update Count     : 945
 //
 
@@ -37,4 +37,5 @@
 class ExpressionNode;
 struct StatementNode;
+
 
 //##############################################################################
@@ -97,4 +98,8 @@
 std::ostream & operator<<( std::ostream & out, const ParseNode * node );
 
+__attribute__((noreturn)) static inline void SemanticError( const ParseNode * obj, const std::string & error ) {
+	SemanticError( obj->location, toString( error, obj ) );
+}
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision c7f9f538e5d5e415101bcf07c2024d410d24e3ee)
+++ src/Parser/TypeData.cc	(revision 4c2fe47e178e4074ffe9d1387cbe05d69e4c0db3)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 15:12:51 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Tue Apr  4 13:39:00 2023
-// Update Count     : 680
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Nov 26 15:51:05 2023
+// Update Count     : 681
 //
 
@@ -864,5 +864,5 @@
 
 static string genTSError( string msg, DeclarationNode::BasicType basictype ) {
-	SemanticError( yylloc, string( "invalid type specifier \"" ) + msg + "\" for type \"" + DeclarationNode::basicTypeNames[basictype] + "\"." );
+	SemanticError( yylloc, "invalid type specifier \"%s\" for type \"%s\".", msg.c_str(), DeclarationNode::basicTypeNames[basictype] );
 } // genTSError
 
@@ -1507,5 +1507,5 @@
 		} // for
 		// declaration type still set => type not moved to a matching parameter so there is a missing parameter name
-		if ( decl->type ) SemanticError( decl->location, string( "missing name in parameter list " ) + *decl->name );
+		if ( decl->type ) SemanticError( decl->location, "missing name in parameter list %s", decl->name->c_str() );
 	} // for
 
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision c7f9f538e5d5e415101bcf07c2024d410d24e3ee)
+++ src/Parser/parser.yy	(revision 4c2fe47e178e4074ffe9d1387cbe05d69e4c0db3)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Oct  3 17:14:12 2023
-// Update Count     : 6396
+// Last Modified On : Sun Nov 26 13:18:06 2023
+// Update Count     : 6398
 //
 
@@ -260,16 +260,18 @@
 		} // if
 	} else {
-		SemanticError( yylloc, "syntax error, loop-index name missing. Expression disallowed. ." ); return nullptr;
+		SemanticError( yylloc, "syntax error, loop-index name missing. Expression disallowed." ); return nullptr;
 	} // if
 } // forCtrl
 
 static void IdentifierBeforeIdentifier( string & identifier1, string & identifier2, const char * kind ) {
-	SemanticError( yylloc, ::toString( "syntax error, adjacent identifiers \"", identifier1, "\" and \"", identifier2, "\" are not meaningful in a", kind, ".\n"
-				   "Possible cause is misspelled type name or missing generic parameter." ) );
+	SemanticError( yylloc, "syntax error, adjacent identifiers \"%s\" and \"%s\" are not meaningful in an %s.\n"
+				   "Possible cause is misspelled type name or missing generic parameter.",
+				   identifier1.c_str(), identifier2.c_str(), kind );
 } // IdentifierBeforeIdentifier
 
 static void IdentifierBeforeType( string & identifier, const char * kind ) {
-	SemanticError( yylloc, ::toString( "syntax error, identifier \"", identifier, "\" cannot appear before a ", kind, ".\n"
-				   "Possible cause is misspelled storage/CV qualifier, misspelled typename, or missing generic parameter." ) );
+	SemanticError( yylloc, "syntax error, identifier \"%s\" cannot appear before a %s.\n"
+				   "Possible cause is misspelled storage/CV qualifier, misspelled typename, or missing generic parameter.",
+				   identifier.c_str(), kind );
 } // IdentifierBeforeType
 
@@ -689,5 +691,5 @@
 	//   	{ SemanticError( yylloc, "Resume expression is currently unimplemented." ); $$ = nullptr; }
 	| IDENTIFIER IDENTIFIER								// invalid syntax rule
-		{ IdentifierBeforeIdentifier( *$1.str, *$2.str, "n expression" ); $$ = nullptr; }
+		{ IdentifierBeforeIdentifier( *$1.str, *$2.str, "expression" ); $$ = nullptr; }
 	| IDENTIFIER type_qualifier							// invalid syntax rule
 		{ IdentifierBeforeType( *$1.str, "type qualifier" ); $$ = nullptr; }
@@ -1155,7 +1157,7 @@
 	| identifier_or_type_name ':' attribute_list_opt error // invalid syntax rule
 		{
-			SemanticError( yylloc, ::toString( "syntx error, label \"", *$1.str, "\" must be associated with a statement, "
-											   "where a declaration, case, or default is not a statement. "
-											   "Move the label or terminate with a semi-colon." ) );
+			SemanticError( yylloc, "syntx error, label \"%s\" must be associated with a statement, "
+						   "where a declaration, case, or default is not a statement.\n"
+						   "Move the label or terminate with a semicolon.", $1.str->c_str() );
 			$$ = nullptr;
 		}
@@ -2101,7 +2103,6 @@
 	| sue_declaration_specifier invalid_types			// invalid syntax rule
 		{
-			SemanticError( yylloc, ::toString( "syntax error, expecting ';' at end of ",
-				$1->type->enumeration.name ? "enum" : ast::AggregateDecl::aggrString( $1->type->aggregate.kind ),
-				" declaration." ) );
+			SemanticError( yylloc, "syntax error, expecting ';' at end of \"%s\" declaration.",
+						   $1->type->enumeration.name ? "enum" : ast::AggregateDecl::aggrString( $1->type->aggregate.kind ) );
 			$$ = nullptr;
 		}
@@ -2161,5 +2162,5 @@
 type_qualifier:
 	type_qualifier_name
-	| attribute											// trick handles most atrribute locations
+	| attribute											// trick handles most attribute locations
 	;
 
@@ -2585,5 +2586,5 @@
 	| type_specifier field_declaring_list_opt '}'		// invalid syntax rule
 		{
-			SemanticError( yylloc, ::toString( "syntax error, expecting ';' at end of previous declaration." ) );
+			SemanticError( yylloc, "syntax error, expecting ';' at end of previous declaration." );
 			$$ = nullptr;
 		}
