Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision d180746e9c094bb8a0500bb2383c1d5d8616da38)
+++ src/InitTweak/InitTweak.cc	(revision f1bcd00439bda4142200e24be677e3de062abbd0)
@@ -187,5 +187,5 @@
 
 			UntypedExpr * increment = new UntypedExpr( new NameExpr( "++?" ) );
-			increment->get_args().push_back( new AddressExpr( index->clone() ) );
+			increment->get_args().push_back( index->clone() );
 			*out++ = new ExprStmt( noLabels, increment );
 		}
@@ -397,5 +397,5 @@
 		template<typename CallExpr>
 		Expression *& callArg( CallExpr * callExpr, unsigned int pos ) {
-			if ( pos >= callExpr->get_args().size() ) assertf( false, "asking for argument that doesn't exist. Return NULL/throw exception?" );
+			if ( pos >= callExpr->get_args().size() ) assertf( false, "getCallArg for argument that doesn't exist: (%u); %s.", pos, toString( callExpr ).c_str() );
 			for ( Expression *& arg : callExpr->get_args() ) {
 				if ( pos == 0 ) return arg;
@@ -475,4 +475,6 @@
 		} else if ( ArrayType * arrayType = dynamic_cast< ArrayType * >( type ) ) {
 			return arrayType->get_base();
+		} else if ( ReferenceType * refType = dynamic_cast< ReferenceType * >( type ) ) {
+			return refType->get_base();
 		} else {
 			return NULL;
@@ -560,10 +562,9 @@
 		if ( ftype->get_parameters().size() != 2 ) return 0;
 
-		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 = dynamic_cast< PointerType * > ( t1 );
-		assert( ptrType );
-
-		if ( ResolvExpr::typesCompatibleIgnoreQualifiers( ptrType->get_base(), t2, SymTab::Indexer() ) ) {
+		assert( t1 );
+
+		if ( ResolvExpr::typesCompatibleIgnoreQualifiers( t1, t2, SymTab::Indexer() ) ) {
 			return function;
 		} else {
