Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision dcd73d1fd6d9a98ffe2b19ad3bbf30fe9693a678)
+++ 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 dcd73d1fd6d9a98ffe2b19ad3bbf30fe9693a678)
+++ 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
