Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision add371c15f16e8ece211a386eec66e2e03a21afa)
+++ src/InitTweak/FixInit.cc	(revision cf18eeaf30d25339930f9c302988f1cef748926f)
@@ -10,5 +10,5 @@
 // Created On       : Wed Jan 13 16:29:30 2016
 // Last Modified By : Rob Schluntz
-// Last Modified On : Mon Apr 25 14:44:21 2016
+// Last Modified On : Mon Apr 25 15:16:12 2016
 // Update Count     : 30
 //
@@ -27,4 +27,5 @@
 #include "SymTab/Indexer.h"
 #include "GenPoly/PolyMutator.h"
+#include "GenPoly/GenPoly.h"
 
 bool ctordtorp = false;
@@ -58,4 +59,6 @@
 		/// create and resolve ctor/dtor expression: fname(var, [cpArg])
 		ApplicationExpr * makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg = NULL );
+		/// true if type does not need to be copy constructed to ensure correctness
+		bool skipCopyConstruct( Type * );
 	};
 
@@ -150,4 +153,8 @@
 	}
 
+	bool ResolveCopyCtors::skipCopyConstruct( Type * type ) {
+		return dynamic_cast< VarArgsType * >( type ) || GenPoly::getFunctionType( type );
+	}
+
 	ApplicationExpr * ResolveCopyCtors::makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg ) {
 		assert( var );
@@ -180,5 +187,7 @@
 			// xxx - need to handle tuple arguments
 			assert( ! arg->get_results().empty() );
-			ObjectDecl * tmp = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, arg->get_results().front()->clone(), 0 );
+			Type * result = arg->get_results().front();
+			if ( skipCopyConstruct( result ) ) continue; // skip certain non-copyable types
+			ObjectDecl * tmp = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, result->clone(), 0 );
 			tmp->get_type()->set_isConst( false );
 
