Index: src/Validate/FixQualifiedTypes.cpp
===================================================================
--- src/Validate/FixQualifiedTypes.cpp	(revision 37b3151afe3f5f5142ae98ef04ed2e1fe9e82ce7)
+++ src/Validate/FixQualifiedTypes.cpp	(revision b1f2007d03a9290ff9a472f7132714791f65e6b4)
@@ -9,7 +9,7 @@
 // Author           : Andrew Beach
 // Created On       : Thr Apr 21 11:13:00 2022
-// Last Modified By : Andrew Beach
-// Last Modified On : Tue Sep 20 16:15:00 2022
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Dec 13 09:00:25 2023
+// Update Count     : 6
 //
 
@@ -41,5 +41,5 @@
 				auto td = symtab.globalLookupType( inst->name );
 				if ( !td ) {
-					SemanticError( *location, toString("Use of undefined global type ", inst->name) );
+					SemanticError( *location, "Use of undefined global type %s.", inst->name.c_str() );
 				}
 				auto base = td->base;
@@ -50,5 +50,5 @@
 			} else {
 				// .T => T is not a type name.
-				assertf( false, "unhandled global qualified child type: %s", toCString(child) );
+				assertf( false, "unhandled global qualified child type: %s", toCString( child ) );
 			}
 		} else {
@@ -63,5 +63,5 @@
 				instp = inst;
 			} else {
-				SemanticError( *location, toString("Qualified type requires an aggregate on the left, but has: ", parent) );
+				SemanticError( *location, "Qualified type requires an aggregate on the left, but has %s.", toCString( parent ) );
 			}
 			// TODO: Need to handle forward declarations.
@@ -81,9 +81,9 @@
 				} else {
 					// S.T - S is not an aggregate => error.
-					assertf( false, "unhandled qualified child type: %s", toCString(type) );
+					assertf( false, "unhandled qualified child type %s.", toCString( type ) );
 				}
 			}
 			// failed to find a satisfying definition of type
-			SemanticError( *location, toString("Undefined type in qualified type: ", type) );
+			SemanticError( *location, "Undefined type in qualified type %s", toCString( type ) );
 		}
 	}
Index: src/Validate/ForallPointerDecay.cpp
===================================================================
--- src/Validate/ForallPointerDecay.cpp	(revision 37b3151afe3f5f5142ae98ef04ed2e1fe9e82ce7)
+++ src/Validate/ForallPointerDecay.cpp	(revision b1f2007d03a9290ff9a472f7132714791f65e6b4)
@@ -9,7 +9,7 @@
 // Author           : Andrew Beach
 // Created On       : Tue Dec  7 16:15:00 2021
-// Last Modified By : Andrew Beach
-// Last Modified On : Sat Apr 23 13:10:00 2022
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Nov 26 18:49:57 2023
+// Update Count     : 2
 //
 
@@ -213,7 +213,5 @@
 		auto type = obj->type->stripDeclarator();
 		if ( dynamic_cast< const ast::FunctionType * >( type ) ) return;
-		SemanticError( obj->location,
-			toCString( "operator ", obj->name.c_str(),
-			" is not a function or function pointer." ) );
+		SemanticError( obj->location, "operator %s is not a function or function pointer.", obj->name.c_str() );
 	}
 };
Index: src/Validate/ReplaceTypedef.cpp
===================================================================
--- src/Validate/ReplaceTypedef.cpp	(revision 37b3151afe3f5f5142ae98ef04ed2e1fe9e82ce7)
+++ src/Validate/ReplaceTypedef.cpp	(revision b1f2007d03a9290ff9a472f7132714791f65e6b4)
@@ -9,7 +9,7 @@
 // Author           : Andrew Beach
 // Created On       : Tue Jun 29 14:59:00 2022
-// Last Modified By : Andrew Beach
-// Last Modified On : Tue Sep 20 17:00:00 2022
-// Update Count     : 2
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Nov 27 08:55:06 2023
+// Update Count     : 3
 //
 
@@ -111,5 +111,5 @@
 			if ( !rtt ) {
 				assert( location );
-				SemanticError( *location, "Cannot apply type parameters to base type of " + type->name );
+				SemanticError( *location, "Cannot apply type parameters to base type of %s.", type->name.c_str() );
 			}
 			rtt->params.clear();
@@ -125,5 +125,5 @@
 		if ( base == typedeclNames.end() ) {
 			assert( location );
-			SemanticError( *location, toString( "Use of undefined type ", type->name ) );
+			SemanticError( *location, "Use of undefined type %s.", type->name.c_str() );
 		}
 		return ast::mutate_field( type, &ast::TypeInstType::base, base->second );
