Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision 0a75b775e51c0c657af0600d4f564720e44fd5fc)
+++ src/SymTab/Indexer.cc	(revision 57fc7d8e52dab41458ab2e2f1b8133f73adb8bcf)
@@ -126,5 +126,5 @@
 				decls.push_back( DeclBall{ data, isUserDefinedFunc, isCopyFunc } );
 				existsUserDefinedCopyFunc = existsUserDefinedCopyFunc || (isUserDefinedFunc && isCopyFunc);
-				if ( isUserDefinedFunc && ! data.deleteStmt ) {
+				if ( isUserDefinedFunc && ! deleteStmt ) {
 					// any user-defined function can act as an implicit delete statement for generated constructors.
 					// a delete stmt should not act as an implicit delete statement.
@@ -166,9 +166,19 @@
 				bool isCopyFunc = ball.isCopyFunc;
 				bool existsUserDefinedCopyFunc = val.existsUserDefinedCopyFunc;
-				// only implicitly delete non-user defined functions that are  not intrinsic, and are
-				// not copy functions (assignment or copy constructor), unless a user-defined copy function exists.
-				// deleteStmt will be non-null only if a user-defined function is found.
-				if (isNotUserDefinedFunc && (! isCopyFunc || existsUserDefinedCopyFunc)) {
-					ball.decl.deleteStmt = val.deleteStmt;
+
+				// only implicitly delete non-user defined functions that are not intrinsic, and are
+				// not copy functions (assignment or copy constructor). If a  user-defined copy function exists,
+				// do not pass along the non-user-defined copy functions since signatures do not have to match,
+				// and the generated functions will often be cheaper.
+				if ( isNotUserDefinedFunc ) {
+					if ( isCopyFunc ) {
+						// Skip over non-user-defined copy functions when there is a user-defined copy function.
+						// Since their signatures do not have to be exact, deleting them is the wrong choice.
+						if ( existsUserDefinedCopyFunc ) continue;
+					} else {
+						// delete non-user-defined non-copy functions if applicable.
+						// deleteStmt will be non-null only if a user-defined function is found.
+						ball.decl.deleteStmt = val.deleteStmt;
+					}
 				}
 				out.push_back( ball.decl );
