Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 4b0f9977dbaf2d66c3868617ef00f4cf9a136fa9)
+++ src/SymTab/Validate.cc	(revision 6250a3124c81969f1b53ea4010c9c212d48ea9b0)
@@ -240,13 +240,13 @@
 		ReturnTypeFixer::fix( translationUnit ); // must happen before autogen
 		acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions
+		acceptAll( translationUnit, epc ); // must happen before VerifyCtorDtorAssign, because void return objects should not exist
+		VerifyCtorDtorAssign::verify( translationUnit );  // must happen before autogen, because autogen examines existing ctor/dtors
 		Concurrency::applyKeywords( translationUnit );
 		autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecayPass
 		Concurrency::implementMutexFuncs( translationUnit );
 		Concurrency::implementThreadStarter( translationUnit );
-		acceptAll( translationUnit, epc );
 		ReturnChecker::checkFunctionReturns( translationUnit );
 		compoundliteral.mutateDeclarationList( translationUnit );
 		acceptAll( translationUnit, pass3 );
-		VerifyCtorDtorAssign::verify( translationUnit );
 		ArrayLength::computeLength( translationUnit );
 	}
@@ -817,5 +817,6 @@
 				throw SemanticError( "Constructors, destructors, and assignment functions require at least one parameter ", funcDecl );
 			}
-			if ( ! dynamic_cast< PointerType * >( params.front()->get_type() ) ) {
+			PointerType * ptrType = dynamic_cast< PointerType * >( params.front()->get_type() );
+			if ( ! ptrType || ptrType->is_array() ) {
 				throw SemanticError( "First parameter of a constructor, destructor, or assignment function must be a pointer ", funcDecl );
 			}
