Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 22bc27633b10d98030a7959b4671f00d9985c61a)
+++ src/InitTweak/FixInit.cc	(revision 29bc63e78d8dbc47b5c21992e7813b3f8d3dbba1)
@@ -58,5 +58,4 @@
 #include "SynTree/TypeSubstitution.h"  // for TypeSubstitution, operator<<
 #include "SynTree/Visitor.h"           // for acceptAll, maybeAccept
-#include "Tuples/Tuples.h"             // for isTtype
 
 bool ctordtorp = false; // print all debug
@@ -368,7 +367,5 @@
 		}
 
-		bool ResolveCopyCtors::skipCopyConstruct( Type * type ) {
-			return dynamic_cast< VarArgsType * >( type ) || dynamic_cast< ReferenceType * >( type ) || GenPoly::getFunctionType( type ) || Tuples::isTtype( type );
-		}
+		bool ResolveCopyCtors::skipCopyConstruct( Type * type ) { return ! isConstructable( type ); }
 
 		Expression * ResolveCopyCtors::makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg ) {
Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision 22bc27633b10d98030a7959b4671f00d9985c61a)
+++ src/InitTweak/GenInit.cc	(revision 29bc63e78d8dbc47b5c21992e7813b3f8d3dbba1)
@@ -130,5 +130,5 @@
 		// hands off if the function returns a reference - we don't want to allocate a temporary if a variable's address
 		// is being returned
-		if ( returnStmt->get_expr() && returnVals.size() == 1 && tryConstruct( returnVals.front() ) ) {
+		if ( returnStmt->get_expr() && returnVals.size() == 1 && isConstructable( returnVals.front()->get_type() ) ) {
 			// explicitly construct the return value using the return expression and the retVal object
 			assertf( returnVals.front()->get_name() != "", "Function %s has unnamed return value\n", funcName.c_str() );
Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision 22bc27633b10d98030a7959b4671f00d9985c61a)
+++ src/InitTweak/InitTweak.cc	(revision 29bc63e78d8dbc47b5c21992e7813b3f8d3dbba1)
@@ -22,4 +22,5 @@
 #include "SynTree/Type.h"          // for FunctionType, ArrayType, PointerType
 #include "SynTree/Visitor.h"       // for Visitor, maybeAccept
+#include "Tuples/Tuples.h"         // for Tuples::isTtype
 
 class UntypedValofExpr;
@@ -276,5 +277,9 @@
 				( objDecl->get_init() != nullptr && objDecl->get_init()->get_maybeConstructed() ))
 			&& ! objDecl->get_storageClasses().is_extern
-			&& ! dynamic_cast< ReferenceType * >( objDecl->type );
+			&& isConstructable( objDecl->type );
+	}
+
+	bool isConstructable( Type * type ) {
+		return ! dynamic_cast< VarArgsType * >( type ) && ! dynamic_cast< ReferenceType * >( type ) && ! dynamic_cast< FunctionType * >( type ) && ! Tuples::isTtype( type );
 	}
 
Index: src/InitTweak/InitTweak.h
===================================================================
--- src/InitTweak/InitTweak.h	(revision 22bc27633b10d98030a7959b4671f00d9985c61a)
+++ src/InitTweak/InitTweak.h	(revision 29bc63e78d8dbc47b5c21992e7813b3f8d3dbba1)
@@ -35,4 +35,7 @@
 	/// True if the resolver should try to construct dwt
 	bool tryConstruct( DeclarationWithType * dwt );
+
+	/// True if the type can have a user-defined constructor
+	bool isConstructable( Type * t );
 
 	/// True if the Initializer contains designations
