Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision 24670d2ac1cef6f83f04f03611d89b2419c67666)
+++ src/InitTweak/InitTweak.cc	(revision ee1635c85e4d2bde1c38c10489af31c9b61685dd)
@@ -304,8 +304,14 @@
 
 	namespace {
-		VariableExpr * getCalledFunction( ApplicationExpr * appExpr ) {
-			assert( appExpr );
-			// xxx - it's possible this can be other things, e.g. MemberExpr, so this is insufficient
-			return dynamic_cast< VariableExpr * >( appExpr->get_function() );
+		DeclarationWithType * getCalledFunction( Expression * expr ) {
+			assert( expr );
+			if ( VariableExpr * varExpr = dynamic_cast< VariableExpr * >( expr ) ) {
+				return varExpr->get_var();
+			} else if ( MemberExpr * memberExpr = dynamic_cast< MemberExpr * >( expr ) ) {
+				return memberExpr->get_member();
+			} else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) {
+				return getCalledFunction( castExpr->get_arg() );
+			}
+			return nullptr;
 		}
 	}
@@ -314,9 +320,9 @@
 		ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr );
 		if ( ! appExpr ) return NULL;
-		VariableExpr * function = getCalledFunction( appExpr );
+		DeclarationWithType * function = getCalledFunction( appExpr->get_function() );
 		assert( function );
 		// check for Intrinsic only - don't want to remove all overridable ctor/dtors because autogenerated ctor/dtor
 		// will call all member dtors, and some members may have a user defined dtor.
-		return function->get_var()->get_linkage() == LinkageSpec::Intrinsic ? appExpr : NULL;
+		return function->get_linkage() == LinkageSpec::Intrinsic ? appExpr : NULL;
 	}
 
@@ -379,4 +385,6 @@
 			}	else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( func ) ) {
 				return funcName( castExpr->get_arg() );
+			} else if ( MemberExpr * memberExpr = dynamic_cast< MemberExpr * >( func ) ) {
+				return memberExpr->get_member()->get_name();
 			} else {
 				assert( false && "Unexpected expression type being called as a function in call expression" );
@@ -472,10 +480,12 @@
 	bool isConstructor( const std::string & str ) { return str == "?{}"; }
 	bool isDestructor( const std::string & str ) { return str == "^?{}"; }
+	bool isAssignment( const std::string & str ) { return str == "?=?"; }
 	bool isCtorDtor( const std::string & str ) { return isConstructor( str ) || isDestructor( str ); }
-
-	FunctionDecl * isCopyConstructor( Declaration * decl ) {
+	bool isCtorDtorAssign( const std::string & str ) { return isCtorDtor( str ) || isAssignment( str ); }
+
+	FunctionDecl * isCopyFunction( Declaration * decl, const std::string & fname ) {
 		FunctionDecl * function = dynamic_cast< FunctionDecl * >( decl );
 		if ( ! function ) return 0;
-		if ( ! isConstructor( function->get_name() ) ) return 0;
+		if ( function->get_name() != fname ) return 0;
 		FunctionType * ftype = function->get_functionType();
 		if ( ftype->get_parameters().size() != 2 ) return 0;
@@ -486,9 +496,13 @@
 		assert( ptrType );
 
-		if ( ResolvExpr::typesCompatible( ptrType->get_base(), t2, SymTab::Indexer() ) ) {
+		if ( ResolvExpr::typesCompatibleIgnoreQualifiers( ptrType->get_base(), t2, SymTab::Indexer() ) ) {
 			return function;
 		} else {
-			return 0;
-		}
+			return nullptr;
+		}
+	}
+
+	FunctionDecl * isCopyConstructor( Declaration * decl ) {
+		return isCopyFunction( decl, "?{}" );
 	}
 }
Index: src/InitTweak/InitTweak.h
===================================================================
--- src/InitTweak/InitTweak.h	(revision 24670d2ac1cef6f83f04f03611d89b2419c67666)
+++ src/InitTweak/InitTweak.h	(revision ee1635c85e4d2bde1c38c10489af31c9b61685dd)
@@ -28,7 +28,10 @@
 	bool isConstructor( const std::string & );
 	bool isDestructor( const std::string & );
+	bool isAssignment( const std::string & );
 	bool isCtorDtor( const std::string & );
+	bool isCtorDtorAssign( const std::string & );
 
 	FunctionDecl * isCopyConstructor( Declaration * decl );
+	FunctionDecl * isCopyFunction( Declaration * decl, const std::string & fname );
 
 	/// transform Initializer into an argument list that can be passed to a call expression
Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision 24670d2ac1cef6f83f04f03611d89b2419c67666)
+++ src/SymTab/Indexer.cc	(revision ee1635c85e4d2bde1c38c10489af31c9b61685dd)
@@ -105,6 +105,6 @@
 
 	void Indexer::removeSpecialOverrides( const std::string &id, std::list< DeclarationWithType * > & out ) const {
-		// only need to perform this step for constructors and destructors
-		if ( ! InitTweak::isCtorDtor( id ) ) return;
+		// only need to perform this step for constructors, destructors, and assignment functions
+		if ( ! InitTweak::isCtorDtorAssign( id ) ) return;
 
 		// helpful data structure
@@ -127,5 +127,5 @@
 				bool isUserDefinedFunc = ! LinkageSpec::isOverridable( function->get_linkage() );
 				bool isDefaultFunc = function->get_functionType()->get_parameters().size() == 1;
-				bool isCopyFunc = InitTweak::isCopyConstructor( function );
+				bool isCopyFunc = InitTweak::isCopyFunction( function, function->get_name() );
 				decls.push_back( DeclBall{ function, isUserDefinedFunc, isDefaultFunc, isCopyFunc } );
 				userDefinedFunc = userDefinedFunc || isUserDefinedFunc;
