Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/InitTweak/FixInit.cc	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -213,10 +213,10 @@
 			void emit( CodeLocation, const Params &... params );
 
-			FunctionDecl * function = 0;
+			FunctionDecl * function = nullptr;
 			std::set< DeclarationWithType * > unhandled;
 			std::map< DeclarationWithType *, CodeLocation > usedUninit;
-			ObjectDecl * thisParam = 0;
+			ObjectDecl * thisParam = nullptr;
 			bool isCtor = false; // true if current function is a constructor
-			StructDecl * structDecl = 0;
+			StructDecl * structDecl = nullptr;
 		};
 
@@ -750,14 +750,14 @@
 					} else {
 						ImplicitCtorDtorStmt * implicit = strict_dynamic_cast< ImplicitCtorDtorStmt * > ( ctor );
-						ExprStmt * ctorStmt = dynamic_cast< ExprStmt * >( implicit->get_callStmt() );
+						ExprStmt * ctorStmt = dynamic_cast< ExprStmt * >( implicit->callStmt );
 						ApplicationExpr * ctorCall = nullptr;
-						if ( ctorStmt && (ctorCall = isIntrinsicCallExpr( ctorStmt->get_expr() )) && ctorCall->get_args().size() == 2 ) {
+						if ( ctorStmt && (ctorCall = isIntrinsicCallExpr( ctorStmt->expr )) && ctorCall->get_args().size() == 2 ) {
 							// clean up intrinsic copy constructor calls by making them into SingleInits
-							objDecl->set_init( new SingleInit( ctorCall->get_args().back() ) );
-							ctorCall->get_args().pop_back();
+							objDecl->init = new SingleInit( ctorCall->args.back() );
+							ctorCall->args.pop_back();
 						} else {
 							stmtsToAddAfter.push_back( ctor );
-							objDecl->set_init( nullptr );
-							ctorInit->set_ctor( nullptr );
+							objDecl->init = nullptr;
+							ctorInit->ctor = nullptr;
 						}
 
@@ -777,10 +777,10 @@
 						}
 					} // if
-				} else if ( Initializer * init = ctorInit->get_init() ) {
-					objDecl->set_init( init );
-					ctorInit->set_init( nullptr );
+				} else if ( Initializer * init = ctorInit->init ) {
+					objDecl->init = init;
+					ctorInit->init = nullptr;
 				} else {
 					// no constructor and no initializer, which is okay
-					objDecl->set_init( nullptr );
+					objDecl->init = nullptr;
 				} // if
 				delete ctorInit;
@@ -880,6 +880,19 @@
 		}
 
+		void addIds( SymTab::Indexer & indexer, const std::list< DeclarationWithType * > & decls ) {
+			for ( auto d : decls ) {
+				indexer.addId( d );
+			}
+		}
+
+		void addTypes( SymTab::Indexer & indexer, const std::list< TypeDecl * > & tds ) {
+			for ( auto td : tds ) {
+				indexer.addType( td );
+				addIds( indexer, td->assertions );
+			}
+		}
+
 		void GenStructMemberCalls::previsit( FunctionDecl * funcDecl ) {
-			GuardValue( funcDecl );
+			GuardValue( function );
 			GuardValue( unhandled );
 			GuardValue( usedUninit );
@@ -914,17 +927,4 @@
 		}
 
-		void addIds( SymTab::Indexer & indexer, const std::list< DeclarationWithType * > & decls ) {
-			for ( auto d : decls ) {
-				indexer.addId( d );
-			}
-		}
-
-		void addTypes( SymTab::Indexer & indexer, const std::list< TypeDecl * > & tds ) {
-			for ( auto td : tds ) {
-				indexer.addType( td );
-				addIds( indexer, td->assertions );
-			}
-		}
-
 		void GenStructMemberCalls::postvisit( FunctionDecl * funcDecl ) {
 			// remove the unhandled objects from usedUninit, because a call is inserted
Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/InitTweak/InitTweak.cc	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -270,4 +270,18 @@
 	}
 
+	Type * getThisType( FunctionType * ftype ) {
+		assertf( ftype, "getThisType: nullptr ftype" );
+		ObjectDecl * thisParam = getThisParam( ftype );
+		ReferenceType * refType = strict_dynamic_cast< ReferenceType * >( thisParam->type );
+		return refType->base;
+	}
+
+	ObjectDecl * getThisParam( FunctionType * ftype ) {
+		assertf( ftype, "getThisParam: nullptr ftype" );
+		auto & params = ftype->parameters;
+		assertf( ! params.empty(), "getThisParam: ftype with 0 parameters: %s", toString( ftype ).c_str() );
+		return strict_dynamic_cast< ObjectDecl * >( params.front() );
+	}
+
 	bool tryConstruct( DeclarationWithType * dwt ) {
 		ObjectDecl * objDecl = dynamic_cast< ObjectDecl * >( dwt );
Index: src/InitTweak/InitTweak.h
===================================================================
--- src/InitTweak/InitTweak.h	(revision 1bc749fb828c049c7b19a62145e17ee1a7ff567c)
+++ src/InitTweak/InitTweak.h	(revision b96ec83d52bc448ced6d53f74922134b39c360e9)
@@ -29,4 +29,10 @@
 	FunctionDecl * isCopyConstructor( Declaration * decl );
 	FunctionDecl * isCopyFunction( Declaration * decl, const std::string & fname );
+
+	/// returns the base type of the first parameter to a constructor/destructor/assignment function
+	Type * getThisType( FunctionType * ftype );
+
+	/// returns the first parameter of a constructor/destructor/assignment function
+	ObjectDecl * getThisParam( FunctionType * ftype );
 
 	/// transform Initializer into an argument list that can be passed to a call expression
