Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision c6976ba09dbc5ab56dc1e9bf723a722048efdd57)
+++ src/InitTweak/FixInit.cc	(revision 0a81c3fa5fe8fdf6e54bc612620b22c7c9342e8d)
@@ -364,9 +364,9 @@
 					assert( ftype );
 					if ( isConstructor( funcDecl->get_name() ) && ftype->get_parameters().size() == 2 ) {
-						Type * t1 = ftype->get_parameters().front()->get_type();
+						Type * t1 = getPointerBase( ftype->get_parameters().front()->get_type() );
 						Type * t2 = ftype->get_parameters().back()->get_type();
-						PointerType * ptrType = safe_dynamic_cast< PointerType * > ( t1 );
-
-						if ( ResolvExpr::typesCompatible( ptrType->get_base(), t2, SymTab::Indexer() ) ) {
+						assert( t1 );
+
+						if ( ResolvExpr::typesCompatible( t1, t2, SymTab::Indexer() ) ) {
 							// optimization: don't need to copy construct in order to call a copy constructor
 							return appExpr;
@@ -489,5 +489,5 @@
 				impCpCtorExpr->get_returnDecls().push_back( ret );
 				CP_CTOR_PRINT( std::cerr << "makeCtorDtor for a return" << std::endl; )
-				if ( ! result->get_lvalue() ) {
+				if ( ! dynamic_cast< ReferenceType * >( result ) ) {
 					// destructing lvalue returns is bad because it can cause multiple destructor calls to the same object - the returned object is not a temporary
 					destructRet( ret, impCpCtorExpr );
@@ -997,6 +997,6 @@
 				assert( ! type->get_parameters().empty() );
 				thisParam = safe_dynamic_cast< ObjectDecl * >( type->get_parameters().front() );
-				PointerType * ptrType = safe_dynamic_cast< PointerType * > ( thisParam->get_type() );
-				StructInstType * structType = dynamic_cast< StructInstType * >( ptrType->get_base() );
+				Type * thisType = getPointerBase( thisParam->get_type() );
+				StructInstType * structType = dynamic_cast< StructInstType * >( thisType );
 				if ( structType ) {
 					structDecl = structType->get_baseStruct();
@@ -1046,6 +1046,4 @@
 					// insert and resolve default/copy constructor call for each field that's unhandled
 					std::list< Statement * > stmt;
-					UntypedExpr * deref = UntypedExpr::createDeref( new VariableExpr( thisParam ) );
-
 					Expression * arg2 = 0;
 					if ( isCopyConstructor( function ) ) {
@@ -1056,5 +1054,5 @@
 					}
 					InitExpander srcParam( arg2 );
-					SymTab::genImplicitCall( srcParam, new MemberExpr( field, deref ), function->get_name(), back_inserter( stmt ), field, isCtor );
+					SymTab::genImplicitCall( srcParam, new MemberExpr( field, new VariableExpr( thisParam ) ), function->get_name(), back_inserter( stmt ), field, isCtor );
 
 					assert( stmt.size() <= 1 );
