Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision 92360603d942184e66e5f92706ecc75c6b04f121)
+++ src/SymTab/Autogen.cc	(revision 8217e8fb39e467042f9fbdd33aea43d4644c44db)
@@ -156,13 +156,4 @@
 	}
 
-	/// true if the aggregate's layout is dynamic
-	template< typename AggrDecl >
-	bool hasDynamicLayout( AggrDecl * aggregateDecl ) {
-		for ( TypeDecl * param : aggregateDecl->get_parameters() ) {
-			if ( param->isComplete() ) return true;
-		}
-		return false;
-	}
-
 	/// generate a function decl from a name and type. Nesting depth determines whether
 	/// the declaration is static or not; optional paramter determines if declaration is intrinsic
@@ -310,5 +301,5 @@
 
 	/// generates a single struct member operation (constructor call, destructor call, assignment call)
-	void makeStructMemberOp( ObjectDecl * dstParam, Expression * src, DeclarationWithType * field, FunctionDecl * func, bool isDynamicLayout, bool forward = true ) {
+	void makeStructMemberOp( ObjectDecl * dstParam, Expression * src, DeclarationWithType * field, FunctionDecl * func, bool forward = true ) {
 		InitTweak::InitExpander srcParam( src );
 
@@ -320,5 +311,5 @@
 	/// generates the body of a struct function by iterating the struct members (via parameters) - generates default ctor, copy ctor, assignment, and dtor bodies, but NOT field ctor bodies
 	template<typename Iterator>
-	void makeStructFunctionBody( Iterator member, Iterator end, FunctionDecl * func, bool isDynamicLayout, bool forward = true ) {
+	void makeStructFunctionBody( Iterator member, Iterator end, FunctionDecl * func, bool forward = true ) {
 		for ( ; member != end; ++member ) {
 			if ( DeclarationWithType *field = dynamic_cast< DeclarationWithType * >( *member ) ) { // otherwise some form of type declaration, e.g. Aggregate
@@ -356,5 +347,5 @@
 
 				Expression *srcselect = srcParam ? new MemberExpr( field, new VariableExpr( srcParam ) ) : NULL;
-				makeStructMemberOp( dstParam, srcselect, field, func, isDynamicLayout, forward );
+				makeStructMemberOp( dstParam, srcselect, field, func, forward );
 			} // if
 		} // for
@@ -364,5 +355,5 @@
 	/// void ?{}(A *, int) and void?{}(A *, int, int) for a struct A which has two int fields.
 	template<typename Iterator>
-	void makeStructFieldCtorBody( Iterator member, Iterator end, FunctionDecl * func, bool isDynamicLayout ) {
+	void makeStructFieldCtorBody( Iterator member, Iterator end, FunctionDecl * func ) {
 		FunctionType * ftype = func->get_functionType();
 		std::list<DeclarationWithType*> & params = ftype->get_parameters();
@@ -390,9 +381,9 @@
 					// matching parameter, initialize field with copy ctor
 					Expression *srcselect = new VariableExpr(*parameter);
-					makeStructMemberOp( dstParam, srcselect, field, func, isDynamicLayout );
+					makeStructMemberOp( dstParam, srcselect, field, func );
 					++parameter;
 				} else {
 					// no matching parameter, initialize field with default ctor
-					makeStructMemberOp( dstParam, NULL, field, func, isDynamicLayout );
+					makeStructMemberOp( dstParam, NULL, field, func );
 				}
 			}
@@ -410,5 +401,4 @@
 		// Make function polymorphic in same parameters as generic struct, if applicable
 		const std::list< TypeDecl* > & typeParams = aggregateDecl->get_parameters(); // List of type variables to be placed on the generated functions
-		bool isDynamicLayout = hasDynamicLayout( aggregateDecl );  // NOTE this flag is an incredibly ugly kludge; we should fix the assignment signature instead (ditto for union)
 
 		// generate each of the functions based on the supplied FuncData objects
@@ -436,7 +426,7 @@
 			// destructor needs to do everything in reverse, so pass "forward" based on whether the function is a destructor
 			if ( ! CodeGen::isDestructor( dcl->get_name() ) ) {
-				makeStructFunctionBody( aggregateDecl->get_members().begin(), aggregateDecl->get_members().end(), dcl, isDynamicLayout );
+				makeStructFunctionBody( aggregateDecl->get_members().begin(), aggregateDecl->get_members().end(), dcl );
 			} else {
-				makeStructFunctionBody( aggregateDecl->get_members().rbegin(), aggregateDecl->get_members().rend(), dcl, isDynamicLayout, false );
+				makeStructFunctionBody( aggregateDecl->get_members().rbegin(), aggregateDecl->get_members().rend(), dcl, false );
 			}
 			if ( CodeGen::isAssignment( dcl->get_name() ) ) {
@@ -474,5 +464,5 @@
 				memCtorType->get_parameters().push_back( new ObjectDecl( member->get_name(), Type::StorageClasses(), LinkageSpec::Cforall, 0, member->get_type()->clone(), 0 ) );
 				FunctionDecl * ctor = genFunc( "?{}", memCtorType->clone(), functionNesting );
-				makeStructFieldCtorBody( aggregateDecl->get_members().begin(), aggregateDecl->get_members().end(), ctor, isDynamicLayout );
+				makeStructFieldCtorBody( aggregateDecl->get_members().begin(), aggregateDecl->get_members().end(), ctor );
 				declsToAdd.push_back( ctor );
 			}
