Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision ee1635c85e4d2bde1c38c10489af31c9b61685dd)
+++ src/SymTab/Validate.cc	(revision d1969a607787c81d78565de2d2aaa145be1680e2)
@@ -60,4 +60,5 @@
 #include "ResolvExpr/typeops.h"
 #include <algorithm>
+#include "InitTweak/InitTweak.h"
 
 #define debugPrint( x ) if ( doDebug ) { std::cout << x; }
@@ -171,8 +172,8 @@
 	};
 
-	class VerifyCtorDtor : public Visitor {
+	class VerifyCtorDtorAssign : public Visitor {
 	public:
-		/// ensure that constructors and destructors have at least one
-		/// parameter, the first of which must be a pointer, and no
+		/// ensure that constructors, destructors, and assignment have at least one
+		/// parameter, the first of which must be a pointer, and that ctor/dtors have no
 		/// return values.
 		static void verify( std::list< Declaration * > &translationUnit );
@@ -202,5 +203,5 @@
 		compoundliteral.mutateDeclarationList( translationUnit );
 		acceptAll( translationUnit, pass3 );
-		VerifyCtorDtor::verify( translationUnit );
+		VerifyCtorDtorAssign::verify( translationUnit );
 	}
 
@@ -687,22 +688,22 @@
 	}
 
-	void VerifyCtorDtor::verify( std::list< Declaration * > & translationUnit ) {
-		VerifyCtorDtor verifier;
+	void VerifyCtorDtorAssign::verify( std::list< Declaration * > & translationUnit ) {
+		VerifyCtorDtorAssign verifier;
 		acceptAll( translationUnit, verifier );
 	}
 
-	void VerifyCtorDtor::visit( FunctionDecl * funcDecl ) {
+	void VerifyCtorDtorAssign::visit( FunctionDecl * funcDecl ) {
 		FunctionType * funcType = funcDecl->get_functionType();
 		std::list< DeclarationWithType * > &returnVals = funcType->get_returnVals();
 		std::list< DeclarationWithType * > &params = funcType->get_parameters();
 
-		if ( funcDecl->get_name() == "?{}" || funcDecl->get_name() == "^?{}" ) {
+		if ( InitTweak::isCtorDtorAssign( funcDecl->get_name() ) ) {
 			if ( params.size() == 0 ) {
-				throw SemanticError( "Constructors and destructors require at least one parameter ", funcDecl );
+				throw SemanticError( "Constructors, destructors, and assignment functions require at least one parameter ", funcDecl );
 			}
 			if ( ! dynamic_cast< PointerType * >( params.front()->get_type() ) ) {
-				throw SemanticError( "First parameter of a constructor or destructor must be a pointer ", funcDecl );
+				throw SemanticError( "First parameter of a constructor, destructor, or assignment function must be a pointer ", funcDecl );
 			}
-			if ( returnVals.size() != 0 ) {
+			if ( InitTweak::isCtorDtor( funcDecl->get_name() ) && returnVals.size() != 0 ) {
 				throw SemanticError( "Constructors and destructors cannot have explicit return values ", funcDecl );
 			}
